@builder.io/mitosis
Version:
Write components once, run everywhere. Compiles to Vue, React, Solid, and Liquid. Import code from Figma and Builder.io
64 lines (63 loc) • 2.46 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTypescriptProject = exports.getContextSymbols = exports.getPropsSymbol = exports.removeMitosisImport = void 0;
const ts_morph_1 = require("ts-morph");
const babel_transform_1 = require("./babel-transform");
const removeMitosisImport = (code) => (0, babel_transform_1.babelTransformExpression)(code, {
ImportDeclaration(path) {
if (path.node.source.value === '@builder.io/mitosis') {
path.remove();
}
},
});
exports.removeMitosisImport = removeMitosisImport;
const getPropsSymbol = (ast) => {
let propsSymbol = undefined;
return ast.forEachChild((node) => {
var _a;
if (propsSymbol !== undefined)
return undefined;
if (ts_morph_1.Node.isArrowFunction(node) || ts_morph_1.Node.isFunctionDeclaration(node)) {
if (node.hasModifier(ts_morph_1.SyntaxKind.ExportKeyword) &&
node.hasModifier(ts_morph_1.SyntaxKind.DefaultKeyword)) {
propsSymbol = (_a = node.getParameters()[0]) === null || _a === void 0 ? void 0 : _a.getSymbol();
return propsSymbol;
}
}
return undefined;
});
};
exports.getPropsSymbol = getPropsSymbol;
const getContextSymbols = (ast) => {
const contextSymbols = new Set();
ast.forEachDescendant((node) => {
if (!ts_morph_1.Node.isVariableDeclaration(node))
return;
const initializer = node.getInitializer();
if (!ts_morph_1.Node.isCallExpression(initializer))
return;
if (initializer.getExpression().getText() !== 'useContext')
return;
const contextSymbol = node.getNameNode().getSymbol();
if (contextSymbol === undefined)
return;
contextSymbols.add(contextSymbol);
});
return contextSymbols;
};
exports.getContextSymbols = getContextSymbols;
const getProject = (tsConfigFilePath) => {
try {
return new ts_morph_1.Project({ tsConfigFilePath });
}
catch (err) {
throw new Error(`Error creating Typescript Project. Make sure \`tsConfigFilePath\` points to a valid tsconfig.json file.
Path received: "${tsConfigFilePath}"
`);
}
};
const createTypescriptProject = (tsConfigFilePath) => {
const project = getProject(tsConfigFilePath);
return { project };
};
exports.createTypescriptProject = createTypescriptProject;
;