@vue-macros/short-bind
Version:
shortBind feature from Vue Macros.
44 lines (42 loc) • 1.49 kB
JavaScript
import { createSimpleExpression, processExpression } from "@vue/compiler-core";
//#region src/core/transformer.ts
function transformShortBind(options = {}) {
const version = options.version || 3.3;
const reg = new RegExp(`^(::${version < 3.4 ? "?" : ""}|\\$|\\*)(?=[A-Z_])`, "i");
return (node, context) => {
if (node.type !== 1) return;
for (const prop of node.props) if (reg.test(prop.loc.source) && (prop.type === 6 ? !prop.value : prop.type === 7 ? !prop.exp : false)) {
const valueName = prop.loc.source.replace(reg, "").replaceAll(/-([A-Z])/gi, (_, name) => name.toUpperCase());
if (prop.type === 6) {
prop.value = {
type: 2,
content: valueName,
loc: {
start: { ...prop.loc.start },
end: prop.loc.end,
source: `"${valueName}"`
}
};
prop.loc.start.offset = Number.POSITIVE_INFINITY;
} else if (prop.type === 7) {
const simpleExpression = createSimpleExpression(valueName, false, {
start: {
offset: prop.loc.start.offset + (prop.loc.source.startsWith("::") ? 2 : 1),
column: prop.loc.start.column,
line: prop.loc.start.line
},
end: {
offset: prop.loc.end.offset,
column: prop.loc.end.column,
line: prop.loc.end.line
},
source: valueName
}, 0);
if (prop.arg?.type === 4) prop.arg.loc.start.offset = Number.POSITIVE_INFINITY;
prop.exp = processExpression(simpleExpression, context);
}
}
};
}
//#endregion
export { transformShortBind };