Some checks failed
📦 Build / build (push) Has been cancelled
🧪 CI Test / test shard (1/4) (push) Has been cancelled
🧪 CI Test / test shard (2/4) (push) Has been cancelled
🧪 CI Test / test shard (3/4) (push) Has been cancelled
🧪 CI Test / test shard (4/4) (push) Has been cancelled
🧪 CI Test / test (push) Has been cancelled
🧪 CI Test / eslint (push) Has been cancelled
🧪 CI Test / typecheck (push) Has been cancelled
🔫 Sync to Pro / dispatch-sync (push) Has been cancelled
🔮 Sync Mirror / sync (push) Has been cancelled
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
import type { IPresetPackageJson } from './types.ts';
|
|
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
import path from 'node:path';
|
|
|
|
function getDependencyDir(packageDir: string, dependencyName: string) {
|
|
return path.join(packageDir, 'node_modules', dependencyName);
|
|
}
|
|
|
|
function getBuiltStyleDependencyCssFiles(packageDir: string, packageJson: IPresetPackageJson) {
|
|
return Object.keys(packageJson.dependencies ?? {})
|
|
.flatMap((dependencyName) => {
|
|
if (!dependencyName.startsWith('@univerjs')) {
|
|
return [];
|
|
}
|
|
|
|
const dependencyDir = getDependencyDir(packageDir, dependencyName);
|
|
const sourceGlobalCss = path.join(dependencyDir, 'src/global.css');
|
|
const builtCss = path.join(dependencyDir, 'lib/index.css');
|
|
|
|
if (!existsSync(sourceGlobalCss)) {
|
|
return [];
|
|
}
|
|
|
|
if (!existsSync(builtCss)) {
|
|
throw new Error(`Missing built CSS for ${dependencyName}. Build dependency packages before building preset CSS.`);
|
|
}
|
|
|
|
return [builtCss];
|
|
});
|
|
}
|
|
|
|
function writePresetCss(packageDir: string, cssFiles: string[]) {
|
|
const outputFile = path.join(packageDir, 'lib/index.css');
|
|
|
|
mkdirSync(path.dirname(outputFile), { recursive: true });
|
|
|
|
const content = cssFiles
|
|
.map((cssFile) => readFileSync(cssFile, 'utf8').trimEnd())
|
|
.filter(Boolean)
|
|
.join('\n');
|
|
|
|
writeFileSync(outputFile, `${content}\n`);
|
|
}
|
|
|
|
export async function buildPresetStyles(options: {
|
|
packageDir: string;
|
|
packageJson: IPresetPackageJson;
|
|
}) {
|
|
const { packageDir, packageJson } = options;
|
|
const cssFiles = getBuiltStyleDependencyCssFiles(packageDir, packageJson);
|
|
|
|
if (cssFiles.length === 0) {
|
|
rmSync(path.join(packageDir, 'lib/index.css'), { force: true });
|
|
return;
|
|
}
|
|
|
|
writePresetCss(packageDir, cssFiles);
|
|
}
|