版博士V2.0程序
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

40 rader
1006 B

  1. // src/core/index.ts
  2. import {
  3. MagicString,
  4. babelParse,
  5. getLang,
  6. getTransformResult
  7. } from "@vue-macros/common";
  8. function transformSetupSFC(code, id) {
  9. const lang = getLang(id);
  10. const program = babelParse(code, lang);
  11. const s = new MagicString(code);
  12. for (const stmt of program.body) {
  13. if (stmt.type !== "ExportDefaultDeclaration")
  14. continue;
  15. s.append(`defineRender(${s.sliceNode(stmt.declaration)});`);
  16. s.removeNode(stmt);
  17. }
  18. const attrs = `${lang ? ` lang="${lang}"` : ""}`;
  19. s.prepend(`<script setup${attrs}>`);
  20. s.append(`</script>`);
  21. return getTransformResult(s, id);
  22. }
  23. function hotUpdateSetupSFC({ modules }, filter) {
  24. function isSubModule(id) {
  25. const [filename, query] = id.split("?");
  26. if (!query)
  27. return false;
  28. if (!filter(filename))
  29. return false;
  30. return true;
  31. }
  32. const affectedModules = modules.filter((mod) => mod.id && isSubModule(mod.id));
  33. return affectedModules;
  34. }
  35. export {
  36. transformSetupSFC,
  37. hotUpdateSetupSFC
  38. };