UNPKG

rollup-plugin-ngc

Version:

Rollup plugin for angular with ivy enable

112 lines (104 loc) 3.81 kB
'use strict'; 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;