vite-plugin-tsconfig
Version:
Vite plugin that allows you to use alternate tsconfig files.
131 lines (129 loc) • 4.21 kB
JavaScript
// 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