@genesiscommunitysuccess/analyzer-import-alias-plugin
Version:
Plugin for custom element manifest parser to handle import aliases
90 lines • 4.56 kB
JavaScript
const pluginName = 'analyzer-import-alias-plugin';
export const NAMESPACE_PREFIX = '<local>_';
export default function importAliasPlugin(config) {
const transforms = [];
return {
name: pluginName,
collectPhase() { },
analyzePhase({ ts: analyzerTs, node, moduleDoc }) {
var _a, _b;
switch (node.kind) {
case analyzerTs.SyntaxKind.ClassDeclaration:
const classDeclarationNode = node;
const className = (_a = classDeclarationNode.name) === null || _a === void 0 ? void 0 : _a.getText();
const classDef = (_b = moduleDoc.declarations) === null || _b === void 0 ? void 0 : _b.find(({ name, kind }) => name === className && kind === 'class');
if (!classDef)
return;
const mNewSuperclassName = getNewSuperclassName(classDef, config);
const mTransform = namespaceClassnameApplySuperclass(classDef, moduleDoc, mNewSuperclassName);
if (mTransform) {
transforms.push(mTransform);
}
}
},
moduleLinkPhase({ moduleDoc, context }) { },
packageLinkPhase({ customElementsManifest, context }) {
transforms.forEach((transform) => reverseTransform(transform, customElementsManifest));
},
};
}
export function reverseTransform(transform, manifest) {
var _a, _b, _c;
const { path, class: className, superclass } = transform;
const mModule = (_a = manifest.modules) === null || _a === void 0 ? void 0 : _a.find((module) => module.path === path);
const mDeclaration = (_b = mModule === null || mModule === void 0 ? void 0 : mModule.declarations) === null || _b === void 0 ? void 0 : _b.find((declaration) => declaration.name === `${NAMESPACE_PREFIX}${className}` && declaration.kind === 'class');
const mExport = (_c = mModule === null || mModule === void 0 ? void 0 : mModule.exports) === null || _c === void 0 ? void 0 : _c.find(({ name, declaration }) => name === `${NAMESPACE_PREFIX}${className}` && declaration.module === path);
if (!mModule || !mDeclaration || !mExport) {
throw new Error('Could not find the transformed class definition, export, or module.');
}
mDeclaration.name = className;
mExport.name = className;
mExport.declaration.name = className;
if (mDeclaration.superclass && superclass) {
mDeclaration.superclass.name = superclass;
}
}
export function getNewSuperclassName(classDef, config) {
var _a, _b, _c;
if (!((_a = classDef === null || classDef === void 0 ? void 0 : classDef.superclass) === null || _a === void 0 ? void 0 : _a.package) && !((_b = classDef === null || classDef === void 0 ? void 0 : classDef.superclass) === null || _b === void 0 ? void 0 : _b.module)) {
return null;
}
const { package: pkg, name, module } = classDef.superclass;
if (pkg) {
const importConfig = (_c = config[pkg]) !== null && _c !== void 0 ? _c : {};
return (importConfig[name] ||
(() => {
const catchAllReplacement = importConfig['*'];
if (!catchAllReplacement) {
return null;
}
const replacedName = catchAllReplacement(name);
return replacedName !== name ? replacedName : null;
})() ||
null);
}
else if (module) {
return `${NAMESPACE_PREFIX}${classDef.superclass.name}`;
}
return null;
}
export function namespaceClassnameApplySuperclass(classDef, moduleDoc, mNewSuperclassName) {
var _a, _b, _c;
const pkg = (_a = classDef.superclass) === null || _a === void 0 ? void 0 : _a.package;
const moduleExport = (_b = moduleDoc.exports) === null || _b === void 0 ? void 0 : _b.find(({ name: exportName }) => exportName === classDef.name);
if (!moduleExport)
return null;
const transform = {
path: moduleDoc.path,
class: classDef.name,
package: pkg,
superclass: (_c = classDef === null || classDef === void 0 ? void 0 : classDef.superclass) === null || _c === void 0 ? void 0 : _c.name,
};
classDef.name = `${NAMESPACE_PREFIX}${classDef.name}`;
moduleExport.name = classDef.name;
moduleExport.declaration.name = classDef.name;
if (classDef.superclass && mNewSuperclassName) {
classDef.superclass.name = mNewSuperclassName;
}
return transform;
}
//# sourceMappingURL=index.js.map