UNPKG

@patryk-w-bl/ts-migrate-server

Version:

A package that contains the main migration runner and spawns a TSServer process

96 lines 5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MigrateConfig = void 0; const bootstrap_1 = require("@ts-morph/bootstrap"); const typescript_1 = __importDefault(require("typescript")); const path_1 = __importDefault(require("path")); const updatable_log_1 = __importDefault(require("updatable-log")); const MigrateConfig_1 = __importDefault(require("./MigrateConfig")); exports.MigrateConfig = MigrateConfig_1.default; const PerfTimer_1 = __importDefault(require("../utils/PerfTimer")); async function migrate({ rootDir, tsConfigDir = rootDir, config, sources, lintConfig, }) { let exitCode = 0; updatable_log_1.default.info(`TypeScript version: ${typescript_1.default.version}`); const serverInitTimer = new PerfTimer_1.default(); // Normalize sources to be an array of full paths. if (sources !== undefined) { sources = Array.isArray(sources) ? sources : [sources]; sources = sources.map((source) => path_1.default.resolve(rootDir, source)); updatable_log_1.default.info(`Ignoring sources from tsconfig.json, using the ones provided manually instead.`); } const tsConfigFilePath = path_1.default.join(tsConfigDir, 'tsconfig.json'); const project = await (0, bootstrap_1.createProject)({ tsConfigFilePath, skipAddingFilesFromTsConfig: sources !== undefined, skipFileDependencyResolution: true, }); // If we passed in our own sources, let's add them to the project. // If not, let's just get all the sources in the project. if (sources) { await project.addSourceFilesByPaths(sources); } updatable_log_1.default.info(`Initialized tsserver project in ${serverInitTimer.elapsedStr()}.`); updatable_log_1.default.info('Start...'); const pluginsTimer = new PerfTimer_1.default(); const updatedSourceFiles = new Set(); const originalSourceFilesToMigrate = new Set(getSourceFilesToMigrate(project).map((file) => file.fileName)); for (let i = 0; i < config.plugins.length; i += 1) { const { plugin, options: pluginOptions } = config.plugins[i]; const pluginLogPrefix = `[${plugin.name}]`; const pluginTimer = new PerfTimer_1.default(); updatable_log_1.default.info(`${pluginLogPrefix} Plugin ${i + 1} of ${config.plugins.length}. Start...`); const sourceFiles = getSourceFilesToMigrate(project).filter(({ fileName }) => originalSourceFilesToMigrate.has(fileName)); // eslint-disable-next-line no-restricted-syntax for (const sourceFile of sourceFiles) { const { fileName } = sourceFile; // const fileTimer = new PerfTimer(); const relFile = path_1.default.relative(rootDir, sourceFile.fileName); const fileLogPrefix = `${pluginLogPrefix}[${relFile}]`; const getLanguageService = () => project.getLanguageService(); const params = { fileName, rootDir, sourceFile, text: sourceFile.text, options: pluginOptions, getLanguageService, }; try { // eslint-disable-next-line no-await-in-loop const newText = await plugin.run(params, lintConfig); if (typeof newText === 'string' && newText !== sourceFile.text) { project.updateSourceFile(fileName, newText); updatedSourceFiles.add(sourceFile.fileName); } } catch (pluginErr) { updatable_log_1.default.error(`${fileLogPrefix} Error:\n`, pluginErr); exitCode = -1; } // log.info(`${fileLogPrefix} Finished in ${fileTimer.elapsedStr()}.`); } updatable_log_1.default.info(`${pluginLogPrefix} Finished in ${pluginTimer.elapsedStr()}.`); } updatable_log_1.default.info(`Finished in ${pluginsTimer.elapsedStr()}, for ${config.plugins.length} plugin(s).`); const writeTimer = new PerfTimer_1.default(); updatable_log_1.default.info(`Writing ${updatedSourceFiles.size} updated file(s)...`); const writes = []; // eslint-disable-next-line no-restricted-syntax for (const fileName of updatedSourceFiles) { const sourceFile = project.getSourceFileOrThrow(fileName); writes.push(project.fileSystem.writeFile(sourceFile.fileName, sourceFile.text)); } await Promise.all(writes); updatable_log_1.default.info(`Wrote ${updatedSourceFiles.size} updated file(s) in ${writeTimer.elapsedStr()}.`); return { updatedSourceFiles, exitCode }; } exports.default = migrate; function getSourceFilesToMigrate(project) { return project .getSourceFiles() .filter(({ fileName }) => !/(\.d\.ts|\.json)$|node_modules/.test(fileName)); } //# sourceMappingURL=index.js.map