UNPKG

tsc-hooks

Version:

Add tsc compiler hooks to your TypeScript project

60 lines (49 loc) 1.73 kB
const fs = require('fs'); const JSON5 = require('json5'); const path = require('path'); const requireHook = require('./utils/requireHook'); const installDependencies = require('./utils/installDependencies'); const tsconfigDir = process.cwd(); const tsconfigPath = path.resolve(process.cwd(), 'tsconfig.json'); if (fs.existsSync(tsconfigPath)) { const tsconfigStr = fs.readFileSync(tsconfigPath); const tsconfig = JSON5.parse(tsconfigStr); const hookModules = [], dependencies = []; for (const hook of tsconfig.hooks || []) { // Get Hook by URL, by Official ID, or by Path const hookModule = requireHook(hook, tsconfigDir); // Add dependencies dependencies.push(...hookModule.dependencies); // Add hookModule hookModules.push(hookModule); } // Install dependencies installDependencies(dependencies); // Create TSC Hook API const ignoredConfigOptions = [ 'save', 'ignore', 'path', 'directory' ]; const api = { tsconfig: { ...tsconfig, save: function() { const tsconfigCopy = { ...api.tsconfig }; for (const ignoredConfigOption of ignoredConfigOptions) { eval(`delete tsconfigCopy.${ignoredConfigOption}`); } fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfigCopy, null, 2)); }, ignore: function(configOption) { ignoredConfigOptions.push(configOption); api.tsconfig.save(); }, path: tsconfigPath, directory: tsconfigDir } }; // Call each hook for (const hookModule of hookModules || []) { hookModule?.onInitCompilation?.(api); process.on('exit', () => hookModule?.onPostCompilation?.(api)); } // Hooks may mutate the config, so write the original config back process.on('exit', () => fs.writeFileSync(tsconfigPath, tsconfigStr)); }