Skip to content

Commit 5bb911c

Browse files
authored
feat: add static site generation mode (#147)
* docs: add static site mode design spec * feat: add static site generation mode with --preset static * chore: remove design spec from tracked files * fix: address review feedback for static site mode * perf: add picture tag with webp source for static mode and lazy-load mermaid * refactor: consolidate static mode helpers, data URLs, and use local font
1 parent b66e9b4 commit 5bb911c

20 files changed

Lines changed: 1764 additions & 53 deletions

bun.lock

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/chronicle/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
},
2222
"devDependencies": {
2323
"@biomejs/biome": "^2.3.13",
24+
"@playwright/test": "^1.60.0",
2425
"@raystack/tools-config": "0.56.0",
2526
"@types/hast": "^3.0.4",
2627
"@types/lodash-es": "^4.17.12",
@@ -68,6 +69,7 @@
6869
"http-status-codes": "^2.3.0",
6970
"lodash-es": "^4.17.23",
7071
"mermaid": "^11.13.0",
72+
"minisearch": "^7.2.0",
7173
"nitro": "3.0.260311-beta",
7274
"openapi-types": "^12.1.3",
7375
"react": "^19.0.0",
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { defineConfig } from '@playwright/test';
2+
3+
export default defineConfig({
4+
testDir: './tests/e2e',
5+
testMatch: '**/*.e2e.ts',
6+
timeout: 30000,
7+
retries: 0,
8+
use: {
9+
headless: true,
10+
baseURL: 'http://localhost:4173',
11+
},
12+
});
Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import path from 'node:path';
12
import chalk from 'chalk';
23
import { Command } from 'commander';
34
import { loadCLIConfig } from '@/cli/utils/config';
@@ -9,7 +10,7 @@ export const buildCommand = new Command('build')
910
.option('--config <path>', 'Path to chronicle.yaml')
1011
.option(
1112
'--preset <preset>',
12-
'Deploy preset (vercel, cloudflare, node-server)'
13+
'Deploy preset (vercel, cloudflare, node-server, static)'
1314
)
1415
.action(async options => {
1516
const { config, projectRoot, configPath, preset } = await loadCLIConfig(options.config, {
@@ -19,8 +20,8 @@ export const buildCommand = new Command('build')
1920

2021
console.log(chalk.cyan('Building for production...'));
2122

22-
const { createBuilder } = await import('vite');
23-
const { createViteConfig } = await import('@/server/vite-config');
23+
const { createBuilder, build } = await import('vite');
24+
const { createViteConfig, isStaticPreset } = await import('@/server/vite-config');
2425

2526
const viteConfig = await createViteConfig({
2627
packageRoot: PACKAGE_ROOT,
@@ -29,9 +30,28 @@ export const buildCommand = new Command('build')
2930
preset
3031
});
3132

32-
const builder = await createBuilder({ ...viteConfig, builder: {} });
33-
await builder.buildApp();
33+
if (isStaticPreset(preset)) {
34+
await build(viteConfig);
35+
} else {
36+
const builder = await createBuilder({ ...viteConfig, builder: {} });
37+
await builder.buildApp();
38+
}
3439

35-
console.log(chalk.green('Build complete'));
36-
console.log(chalk.cyan('Run `chronicle start` to start the server'));
40+
if (isStaticPreset(preset)) {
41+
const { generateStaticSite } = await import('@/cli/commands/static-generate');
42+
const outputDir = path.resolve(projectRoot, '.output/public');
43+
44+
await generateStaticSite({
45+
projectRoot,
46+
config,
47+
outputDir,
48+
packageRoot: PACKAGE_ROOT,
49+
});
50+
51+
console.log(chalk.green('Static build complete'));
52+
console.log(chalk.cyan(`Output: ${outputDir}`));
53+
} else {
54+
console.log(chalk.green('Build complete'));
55+
console.log(chalk.cyan('Run `chronicle start` to start the server'));
56+
}
3757
});

0 commit comments

Comments
 (0)