Files

57 lines
2.6 KiB
JavaScript
Executable File

#!/usr/bin/env node
// Builds the published package in dist/: the toolkit compiled to JavaScript with its declarations, the declaration of
// the font plugin's virtual module, the SQL of the server, README.md, CHANGELOG.md and a package.json whose exports
// name the compiled files.
import { spawnSync } from 'node:child_process';
import { copyFileSync, cpSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';
const ROOT = import.meta.dirname;
const DIST = join(ROOT, 'dist');
const ENTRIES = ['server', 'shared', 'web', 'vite'];
function fail(message) {
console.error(`build: ${message}`);
process.exit(1);
}
rmSync(DIST, { recursive: true, force: true });
const tsc = spawnSync(join(ROOT, 'node_modules', '.bin', 'tsc'), ['-p', join(ROOT, 'tsconfig.build.json')], { stdio: 'inherit' });
if (tsc.error) fail(`tsc: ${tsc.error.message}; run npm ci first`);
if (tsc.status !== 0) process.exit(tsc.status ?? 1);
// The declarations import the other declarations by their .js names, as the compiled JavaScript does.
for (const entry of ENTRIES) {
for (const file of readdirSync(join(DIST, entry)).filter((name) => name.endsWith('.d.ts'))) {
const path = join(DIST, entry, file);
writeFileSync(path, readFileSync(path, 'utf8').replace(/(from\s+|import\s+)(['"])(\.{1,2}\/[^'"]+)\.tsx?\2/g, '$1$2$3.js$2'));
}
}
// The compiled renderApp keeps its import of virtual:font, so its declarations reference the module's declaration.
copyFileSync(join(ROOT, 'web', 'virtual-font.d.ts'), join(DIST, 'web', 'virtual-font.d.ts'));
const renderApp = join(DIST, 'web', 'renderApp.d.ts');
writeFileSync(renderApp, `/// <reference path="./virtual-font.d.ts" />\n${readFileSync(renderApp, 'utf8')}`);
// The tfvars store reads its SQL next to the compiled module.
cpSync(join(ROOT, 'server', 'sql'), join(DIST, 'server', 'sql'), { recursive: true });
for (const file of ['README.md', 'CHANGELOG.md']) copyFileSync(join(ROOT, file), join(DIST, file));
const source = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
const published = {
name: source.name,
version: source.version,
description: source.description,
type: source.type,
engines: source.engines,
repository: source.repository,
exports: Object.fromEntries(ENTRIES.map((entry) => [`./${entry}`, { types: `./${entry}/index.d.ts`, default: `./${entry}/index.js` }])),
peerDependencies: source.peerDependencies,
peerDependenciesMeta: source.peerDependenciesMeta,
};
writeFileSync(join(DIST, 'package.json'), `${JSON.stringify(published, null, 2)}\n`);
console.log(`${published.name}@${published.version} in ${DIST}`);