|
- // src/core/index.ts
- import {
- MagicString,
- getTransformResult,
- isTs,
- parseSFC,
- resolveObjectKey,
- walkAST
- } from "@vue-macros/common";
- function transformShortEmits(code, id) {
- if (!code.includes("SE") && !code.includes("ShortEmits"))
- return;
- const sfc = parseSFC(code, id);
- const { scriptSetup, lang, getSetupAst } = sfc;
- if (!scriptSetup || !isTs(lang))
- return;
- const offset = scriptSetup.loc.start.offset;
- const ast = getSetupAst();
- const nodes = [];
- walkAST(ast, {
- enter(node) {
- var _a;
- if (node.type === "TSTypeReference" && node.typeName.type === "Identifier" && ["SE", "ShortEmits"].includes(node.typeName.name) && ((_a = node.typeParameters) == null ? void 0 : _a.params[0].type)) {
- nodes.push({
- def: node.typeParameters.params[0],
- type: node
- });
- }
- }
- });
- const s = new MagicString(code);
- function stringifyParams(params) {
- return params.length > 0 ? s.sliceNode(params, { offset }) : "";
- }
- for (const { def, type } of nodes) {
- if (def.type !== "TSTypeLiteral")
- throw new SyntaxError(
- `accepts object literal only: ${s.sliceNode(def, { offset })}`
- );
- s.remove(offset + type.start, offset + def.start);
- s.remove(offset + def.end, offset + type.end);
- for (const _member of def.members) {
- if (!["TSPropertySignature", "TSMethodSignature"].includes(_member.type))
- throw new SyntaxError(
- `accepts method and property only: ${s.sliceNode(_member, {
- offset
- })}`
- );
- const member = _member;
- const key = resolveObjectKey(member.key, member.computed);
- let params = "";
- switch (member.type) {
- case "TSPropertySignature": {
- if (!member.typeAnnotation || !["TSTupleType", "TSFunctionType"].includes(
- member.typeAnnotation.typeAnnotation.type
- ))
- throw new SyntaxError(
- `not supported: ${s.sliceNode(member, { offset })}`
- );
- switch (member.typeAnnotation.typeAnnotation.type) {
- case "TSTupleType":
- params = `...args: ${s.sliceNode(
- member.typeAnnotation.typeAnnotation,
- { offset }
- )}`;
- break;
- case "TSFunctionType":
- params = stringifyParams(
- member.typeAnnotation.typeAnnotation.parameters
- );
- break;
- }
- break;
- }
- case "TSMethodSignature": {
- params = stringifyParams(member.parameters);
- break;
- }
- }
- s.overwriteNode(
- member,
- `(evt: ${key}${params ? `, ${params}` : ""}): void`,
- { offset }
- );
- }
- }
- return getTransformResult(s, id);
- }
-
- export {
- transformShortEmits
- };
|