版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

67 строки
1.5 KiB

  1. // src/core/index.ts
  2. import {
  3. DEFINE_PROPS,
  4. DEFINE_PROPS_REFS,
  5. HELPER_PREFIX,
  6. MagicString,
  7. WITH_DEFAULTS,
  8. getTransformResult,
  9. importHelperFn,
  10. isCallOf,
  11. parseSFC,
  12. walkAST
  13. } from "@vue-macros/common";
  14. function transformDefinePropsRefs(code, id) {
  15. if (!code.includes(DEFINE_PROPS_REFS))
  16. return;
  17. const { scriptSetup, getSetupAst } = parseSFC(code, id);
  18. if (!scriptSetup)
  19. return;
  20. const offset = scriptSetup.loc.start.offset;
  21. const s = new MagicString(code);
  22. const setupAst = getSetupAst();
  23. let changed = false;
  24. walkAST(setupAst, {
  25. enter(node) {
  26. if (isCallOf(node, WITH_DEFAULTS) && node.arguments) {
  27. processDefinePropsRefs(node.arguments[0], node);
  28. this.skip();
  29. } else if (isCallOf(node, DEFINE_PROPS_REFS)) {
  30. processDefinePropsRefs(node);
  31. }
  32. }
  33. });
  34. if (changed) {
  35. importHelperFn(s, offset, "toRefs", "vue");
  36. }
  37. return getTransformResult(s, id);
  38. function processDefinePropsRefs(propsCall, defaultsCall) {
  39. let code2 = `${DEFINE_PROPS}${s.slice(
  40. offset + propsCall.callee.end,
  41. offset + propsCall.end
  42. )}`;
  43. if (defaultsCall) {
  44. code2 = `${WITH_DEFAULTS}(${code2}, ${s.sliceNode(
  45. defaultsCall.arguments[1],
  46. {
  47. offset
  48. }
  49. )})`;
  50. }
  51. s.prependLeft(offset, `
  52. const ${HELPER_PREFIX}props = ${code2}`);
  53. s.overwriteNode(
  54. defaultsCall || propsCall,
  55. `${HELPER_PREFIX}toRefs(${HELPER_PREFIX}props)`,
  56. {
  57. offset
  58. }
  59. );
  60. changed = true;
  61. }
  62. }
  63. export {
  64. transformDefinePropsRefs
  65. };