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

93 строки
2.8 KiB

  1. // src/core/index.ts
  2. import {
  3. MagicString,
  4. getTransformResult,
  5. isTs,
  6. parseSFC,
  7. resolveObjectKey,
  8. walkAST
  9. } from "@vue-macros/common";
  10. function transformShortEmits(code, id) {
  11. if (!code.includes("SE") && !code.includes("ShortEmits"))
  12. return;
  13. const sfc = parseSFC(code, id);
  14. const { scriptSetup, lang, getSetupAst } = sfc;
  15. if (!scriptSetup || !isTs(lang))
  16. return;
  17. const offset = scriptSetup.loc.start.offset;
  18. const ast = getSetupAst();
  19. const nodes = [];
  20. walkAST(ast, {
  21. enter(node) {
  22. var _a;
  23. if (node.type === "TSTypeReference" && node.typeName.type === "Identifier" && ["SE", "ShortEmits"].includes(node.typeName.name) && ((_a = node.typeParameters) == null ? void 0 : _a.params[0].type)) {
  24. nodes.push({
  25. def: node.typeParameters.params[0],
  26. type: node
  27. });
  28. }
  29. }
  30. });
  31. const s = new MagicString(code);
  32. function stringifyParams(params) {
  33. return params.length > 0 ? s.sliceNode(params, { offset }) : "";
  34. }
  35. for (const { def, type } of nodes) {
  36. if (def.type !== "TSTypeLiteral")
  37. throw new SyntaxError(
  38. `accepts object literal only: ${s.sliceNode(def, { offset })}`
  39. );
  40. s.remove(offset + type.start, offset + def.start);
  41. s.remove(offset + def.end, offset + type.end);
  42. for (const _member of def.members) {
  43. if (!["TSPropertySignature", "TSMethodSignature"].includes(_member.type))
  44. throw new SyntaxError(
  45. `accepts method and property only: ${s.sliceNode(_member, {
  46. offset
  47. })}`
  48. );
  49. const member = _member;
  50. const key = resolveObjectKey(member.key, member.computed);
  51. let params = "";
  52. switch (member.type) {
  53. case "TSPropertySignature": {
  54. if (!member.typeAnnotation || !["TSTupleType", "TSFunctionType"].includes(
  55. member.typeAnnotation.typeAnnotation.type
  56. ))
  57. throw new SyntaxError(
  58. `not supported: ${s.sliceNode(member, { offset })}`
  59. );
  60. switch (member.typeAnnotation.typeAnnotation.type) {
  61. case "TSTupleType":
  62. params = `...args: ${s.sliceNode(
  63. member.typeAnnotation.typeAnnotation,
  64. { offset }
  65. )}`;
  66. break;
  67. case "TSFunctionType":
  68. params = stringifyParams(
  69. member.typeAnnotation.typeAnnotation.parameters
  70. );
  71. break;
  72. }
  73. break;
  74. }
  75. case "TSMethodSignature": {
  76. params = stringifyParams(member.parameters);
  77. break;
  78. }
  79. }
  80. s.overwriteNode(
  81. member,
  82. `(evt: ${key}${params ? `, ${params}` : ""}): void`,
  83. { offset }
  84. );
  85. }
  86. }
  87. return getTransformResult(s, id);
  88. }
  89. export {
  90. transformShortEmits
  91. };