Files

46 lines
1.7 KiB
TypeScript

import { InjectableClassEntry } from './transformers/extract-injectables';
const SOURCE_MAP_COMMENT = '\n//# sourceMappingURL=';
function insertBeforeSourceMapComment(contents: string, addition: string): string {
const sourceMapIndex = contents.lastIndexOf(SOURCE_MAP_COMMENT);
if (sourceMapIndex === -1) {
return `${contents}\n${addition}`;
}
return `${contents.slice(0, sourceMapIndex)}\n${addition}${contents.slice(sourceMapIndex)}`;
}
export function rewriteInjectableExports(jsFile: string, classes: InjectableClassEntry[]): string {
let rewrittenFile = jsFile;
const exportBlocks: string[] = [];
classes.forEach((entry) => {
const originalClassName = `${entry.className}Original`;
rewrittenFile = rewrittenFile.replace(
new RegExp(`([\\s\\(])${entry.className}([\\s\\.;\\(,])`, 'g'),
`$1${originalClassName}$2`
);
const legacyExportPattern = new RegExp(`\\nexport\\s*\\{\\s*${originalClassName}\\s*\\};?`);
if (legacyExportPattern.test(rewrittenFile)) {
rewrittenFile = rewrittenFile.replace(legacyExportPattern, '');
} else {
const inlineClassExportPattern = new RegExp(`export\\s+class\\s+${originalClassName}(?=\\s)`);
if (!inlineClassExportPattern.test(rewrittenFile)) {
throw new Error(`Could not rewrite ESM export for injectable class "${entry.className}"`);
}
rewrittenFile = rewrittenFile.replace(inlineClassExportPattern, `class ${originalClassName}`);
}
exportBlocks.push(`const ${entry.className} = new ${originalClassName}();\nexport { ${entry.className} };`);
});
if (exportBlocks.length === 0) {
return rewrittenFile;
}
return insertBeforeSourceMapComment(rewrittenFile, exportBlocks.join('\n'));
}