UNPKG

vite-plugin-tsconfig

Version:

Vite plugin that allows you to use alternate tsconfig files.

131 lines (129 loc) 4.21 kB
// src/index.ts import fs2 from "node:fs"; import path2 from "node:path"; import { findMonorepoRoot } from "@alienfast/find-monorepo-root"; import { marked as marked2 } from "marked"; import TerminalRenderer2 from "marked-terminal"; import { createLogger } from "vite"; // src/util.ts import fs from "node:fs"; import path from "node:path"; import { marked } from "marked"; import TerminalRenderer from "marked-terminal"; marked.setOptions({ renderer: new TerminalRenderer() }); var TSCONFIG = "tsconfig.json"; var BANNER = `// GENERATED via 'vite-plugin-tsconfig' - this should be automatically created and deleted inside the build process. `; var BAK = "bak.vite-plugin-tsconfig"; var hasBanner = (tsconfigPath) => { const content = fs.readFileSync(tsconfigPath, "utf8"); return content.startsWith(BANNER.trim()); }; var swapTsConfig = (filename, dir, log) => { if (!fs.existsSync) { throw new Error(`Expected dir ${dir} to exist`); } const tsconfigPath = path.resolve(dir, TSCONFIG); let backupFilePath = void 0; if (fs.existsSync(tsconfigPath)) { log.info(`${TSCONFIG} already exists, moving it to ${TSCONFIG}.${BAK} at ${dir}`); backupFilePath = path.resolve(dir, `${TSCONFIG}.${BAK}`); if (fs.existsSync(backupFilePath)) { fs.rmSync(backupFilePath); } fs.renameSync(tsconfigPath, `${tsconfigPath}.${BAK}`); } const providedTsConfig = path.resolve(dir, filename); if (!fs.existsSync(providedTsConfig)) { throw new Error(`${providedTsConfig} does not exist.`); } log.info(`Creating ${TSCONFIG} from ${filename} at ${dir}`); const providedTsConfigContent = fs.readFileSync(providedTsConfig, "utf8"); fs.writeFileSync(tsconfigPath, BANNER + providedTsConfigContent); return { dir, backupFilePath }; }; var revertTsConfig = (swapped, log) => { const { dir, backupFilePath } = swapped; if (!fs.existsSync) { throw new Error(`Expected dir ${dir} to exist`); } const tsconfigPath = path.resolve(dir, TSCONFIG); if (!fs.existsSync(tsconfigPath)) { log.info(`No tsconfig file found at ${dir}, nothing to do.`); return; } if (!hasBanner(tsconfigPath)) { log.info(`tsconfig.json found at ${dir} but it does not contain theb banner, nothing to do.`); return; } log.info(`Removing generated tsconfig.json at ${dir}`); fs.rmSync(tsconfigPath); if (!backupFilePath) { log.info(`No backup file to restore at ${dir}`); return; } if (fs.existsSync(backupFilePath)) { log.info(`Restoring ${TSCONFIG} from backup at ${dir}`); fs.renameSync(backupFilePath, tsconfigPath); } else { log.error(`Backup file ${backupFilePath} does not exist.`); } }; // src/index.ts marked2.setOptions({ renderer: new TerminalRenderer2() }); var LogLevels = { silent: 0, error: 1, warn: 2, info: 3 }; var factory = (options) => { const { filename, logLevel = "warn" } = options; const log = createLogger(logLevel, { prefix: "[tsconfig]" }); let root; const swapped = []; const plugin = { name: "vite-plugin-tsconfig", async config(config) { root ??= config.root ?? process.cwd(); let monorepoRoot; try { monorepoRoot = await findMonorepoRoot(root); } catch (e) { } log.info(`monorepoRoot: ${monorepoRoot ? monorepoRoot.dir : "(none)"}`); const isAtMonoRepoRoot = monorepoRoot !== void 0 && monorepoRoot.dir === root; if (isAtMonoRepoRoot && options.workspaces) { for (const workspace of options.workspaces) { const dir = path2.resolve(root, workspace); if (!fs2.existsSync(dir)) { throw new Error(`Expected workspace ${dir} to exist`); } const swap2 = swapTsConfig(filename, dir, log); swapped.push(swap2); } } const swap = swapTsConfig(filename, root, log); swapped.push(swap); }, closeBundle() { if (!root) { throw new Error("Expected root to be set in the vite config hook."); } for (const swap of swapped) { revertTsConfig(swap, log); } } }; return plugin; }; var src_default = factory; export { LogLevels, src_default as default }; //# sourceMappingURL=index.js.map