UNPKG

@ngtools/webpack

Version:

Webpack plugin that AoT compiles your Angular components and modules.

89 lines (88 loc) 3.6 kB
"use strict"; /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.dev/license */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createTypescriptContext = createTypescriptContext; exports.transformTypescript = transformTypescript; const node_path_1 = require("node:path"); const typescript_1 = __importDefault(require("typescript")); // Test transform helpers. const basefileName = 'test-file.ts'; function createTypescriptContext(content, additionalFiles, useLibs = false, extraCompilerOptions = {}, jsxFile = false) { const fileName = basefileName + (jsxFile ? 'x' : ''); // Set compiler options. const compilerOptions = { noEmitOnError: useLibs, allowJs: true, newLine: typescript_1.default.NewLineKind.LineFeed, moduleResolution: typescript_1.default.ModuleResolutionKind.Node10, module: typescript_1.default.ModuleKind.ES2020, target: typescript_1.default.ScriptTarget.ES2020, skipLibCheck: true, sourceMap: false, importHelpers: true, experimentalDecorators: true, types: [], ...extraCompilerOptions, }; // Create compiler host. const compilerHost = typescript_1.default.createCompilerHost(compilerOptions, true); const baseFileExists = compilerHost.fileExists; compilerHost.fileExists = function (compilerFileName) { return (compilerFileName === fileName || !!additionalFiles?.[(0, node_path_1.basename)(compilerFileName)] || baseFileExists(compilerFileName)); }; const baseReadFile = compilerHost.readFile; compilerHost.readFile = function (compilerFileName) { if (compilerFileName === fileName) { return content; } else if (additionalFiles?.[(0, node_path_1.basename)(compilerFileName)]) { return additionalFiles[(0, node_path_1.basename)(compilerFileName)]; } else { return baseReadFile(compilerFileName); } }; // Create the TypeScript program. const program = typescript_1.default.createProgram([fileName], compilerOptions, compilerHost); return { compilerHost, program }; } function transformTypescript(content, transformers, program, compilerHost) { // Use given context or create a new one. if (content !== undefined) { const typescriptContext = createTypescriptContext(content); if (!program) { program = typescriptContext.program; } if (!compilerHost) { compilerHost = typescriptContext.compilerHost; } } else if (!program || !compilerHost) { throw new Error('transformTypescript needs either `content` or a `program` and `compilerHost'); } const outputFileName = basefileName.replace(/\.tsx?$/, '.js'); let outputContent; // Emit. const { emitSkipped, diagnostics } = program.emit(undefined, (filename, data) => { if (filename === outputFileName) { outputContent = data; } }, undefined, undefined, { before: transformers }); // Throw error with diagnostics if emit wasn't successfull. if (emitSkipped) { throw new Error(typescript_1.default.formatDiagnostics(diagnostics, compilerHost)); } // Return the transpiled js. return outputContent; }