@patryk-w-bl/ts-migrate-server
Version:
A package that contains the main migration runner and spawns a TSServer process
96 lines • 5 kB
JavaScript
;
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