UNPKG

dipend

Version:

This library implements a dependency injection (DI) system in JavaScript/TypeScript, making it easier to manage dependencies in modular applications.

57 lines (55 loc) 2.82 kB
/* * Copyright 2025 Saulo V. Alvarenga. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TransformProgram = void 0; const tslib_1 = require("tslib"); const node_path_1 = tslib_1.__importDefault(require("node:path")); const get_patched_host_1 = require("./get-patched-host"); const ast_visit_handler_1 = require("./ast-visit-handler"); class TransformProgram { transformers; constructor(transformers) { this.transformers = transformers; } getHandler() { const transformers = this.transformers; return (program, host, config, { ts: tsInstance }) => { const compilerOptions = program.getCompilerOptions(); const compilerHost = (0, get_patched_host_1.getPatchedHost)(host, tsInstance, compilerOptions); const rootFileNames = program.getRootFileNames().map(node_path_1.default.normalize); const sourceFiles = [...program.getSourceFiles()]; const astHandlers = transformers.map((transform) => new ast_visit_handler_1.AstVisitHandler(tsInstance, program, transform)); let transformedSourceFileResult = sourceFiles; astHandlers.forEach((astHandler) => { const transformedSourceFile = tsInstance.transform(transformedSourceFileResult, [(context) => astHandler.handle(context)], compilerOptions).transformed; if (transformedSourceFile && transformedSourceFile.length > 0) { transformedSourceFileResult = transformedSourceFile; } }); const { printFile } = tsInstance.createPrinter(); for (const sourceFile of transformedSourceFileResult) { const { fileName, languageVersion } = sourceFile; const fileVersion = sourceFile.version; const updatedSourceFile = tsInstance.createSourceFile(fileName, printFile(sourceFile), languageVersion); updatedSourceFile.version = fileVersion; compilerHost.fileCache.set(fileName, updatedSourceFile); } return tsInstance.createProgram(rootFileNames, compilerOptions, compilerHost); }; } } exports.TransformProgram = TransformProgram;