UNPKG

@genesiscommunitysuccess/analyzer-import-alias-plugin

Version:

Plugin for custom element manifest parser to handle import aliases

90 lines 4.56 kB
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