rollup-plugin-ngc
Version:
Rollup plugin for angular with ivy enable
112 lines (104 loc) • 3.81 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var path = require('path');
var typescript = require('typescript');
var compilerCli = require('@angular/compiler-cli');
var fs = require('fs');
var buildOptimizer = require('@angular-devkit/build-optimizer');
function resolver(extensions) {
const _extensions = ["ts", ...extensions != null ? extensions : []];
const resolveFile = (resolved, index = false) => {
for (const extension of _extensions) {
const file = index ? path.join(resolved, `index.${extension}`) : `${resolved}.${extension}`;
if (fs.existsSync(file))
return file;
}
};
return function resolveId(id, origin) {
if (!origin || id.includes("node_modules"))
return id;
const resolved = path.join(path.dirname(origin), id);
const file = resolveFile(resolved);
if (file)
return file;
if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
const coreFile = resolveFile(resolved, true);
if (coreFile)
return coreFile;
}
};
}
function compile(opts) {
const {id, host, options, files} = opts;
const programm = compilerCli.createProgram({rootNames: [id], options, host});
programm.emit();
const file = id.replace(".ts", "");
const map = files.get(`${file}.js.map`);
const code = files.get(`${file}.js`);
return {
code: (code != null ? code : "").replace(/\/\/# sourceMappingURL.*/, ""),
map
};
}
const defautSideEffects = (sideEffectFreeModules) => {
const sideEffects = fs.readdirSync("node_modules/@angular").map((effect) => path.join("node_modules/@angular", effect));
return [
...sideEffects,
"node_modules/rxjs",
...sideEffectFreeModules != null ? sideEffectFreeModules : []
].map((p) => p.replace(/\\/g, "/"));
};
function optimizer(content, id, options) {
const normalizedId = id.replace(/\\/g, "/");
const isSideEffectFree = options.sideEffectFreeModules && options.sideEffectFreeModules.some((m) => normalizedId.indexOf(m) >= 0);
const isAngularCoreFile = options.angularCoreModules && options.angularCoreModules.some((m) => normalizedId.indexOf(m) >= 0);
const result = buildOptimizer.buildOptimizer({
content,
inputFilePath: id,
emitSourceMap: true,
isSideEffectFree,
isAngularCoreFile
});
return {
code: result.content,
map: result.sourceMap
};
}
function ngcPlugin(options) {
let host, files = new Map(), sideEffectFreeModules;
const {target = "es2018", rootDir = "src", sourceMap = true} = options;
const opts = {
target: typescript.ScriptTarget[target.toLocaleUpperCase()],
module: typescript.ModuleKind.ESNext,
lib: ["dom", "es2015", "es2017", "es2018", "es2019"],
rootDir: path.resolve(rootDir),
moduleResolution: typescript.ModuleResolutionKind.NodeJs,
esModuleInterop: true,
declaration: false,
experimentalDecorators: true,
emitDecoratorMetadata: true,
enableIvy: true,
sourceMap
};
return {
name: "ngc",
buildStart: () => {
var _a;
sideEffectFreeModules = defautSideEffects((_a = options == null ? void 0 : options.buildOptimizer) == null ? void 0 : _a.sideEffectFreeModules);
host = compilerCli.createCompilerHost({options: opts});
host.writeFile = (fileName, contents) => files.set(fileName, contents);
},
resolveId: resolver(),
transform(code, id) {
var _a;
if (!id.includes("node_modules")) {
return compile({id: path.resolve(id).replace(/\\/g, "/"), host, options: opts, files});
}
return optimizer(code, id, {
sideEffectFreeModules,
angularCoreModules: (_a = options == null ? void 0 : options.buildOptimizer) == null ? void 0 : _a.angularCoreModules
});
}
};
}
exports.ngcPlugin = ngcPlugin;