@equinor/fusion-framework-cli
Version:
--- title: Fusion Framework CLI ---
45 lines • 1.87 kB
JavaScript
import tsc from 'typescript';
import { dirname, join, resolve } from 'node:path';
import { readPackageUp } from 'read-package-up';
import assert from 'node:assert';
import { existsSync } from 'node:fs';
import { mkdir, readFile, stat, writeFile } from 'node:fs/promises';
import { fileExists } from './file-exists.js';
export const transpile = async (file) => {
const pkg = await readPackageUp();
assert(pkg, `failed to resolve bundle package`);
const pkgRoot = dirname(pkg.path);
const sourceFile = resolve(pkgRoot, file);
assert(sourceFile, `failed to resolve ${file}`);
const cacheDir = join(pkgRoot, 'node_modules', '.cache', 'ffc');
const targetFile = join(cacheDir, file.replace(pkgRoot, '').replace(/.ts$/, '.mjs'));
if (await fileExists(targetFile)) {
const sourceTouch = (await stat(sourceFile)).mtime;
const targetTouch = (await stat(targetFile)).mtime;
if (sourceTouch < targetTouch) {
return targetFile;
}
}
if (!existsSync(dirname(targetFile))) {
await mkdir(cacheDir, { recursive: true });
}
const compilerOptions = await loadCompilerOptions('tsconfig.json');
const tsContent = (await readFile(sourceFile)).toString();
const jsContent = tsc.transpileModule(tsContent, { compilerOptions }).outputText;
assert(jsContent, `failed to transpile [${file}]`);
await writeFile(targetFile, jsContent);
return targetFile;
};
const loadCompilerOptions = (filename) => {
const config = tsc.readConfigFile(filename, tsc.sys.readFile).config;
if (config.extends) {
const extended = resolve(config.extends);
return {
...loadCompilerOptions(extended),
...config.compilerOptions,
};
}
return config.compilerOptions;
};
export default transpile;
//# sourceMappingURL=ts-transpile.js.map