@ketvietlab/ketjs-view-tools 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 KETVIET JSC, Vietnam
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @ketvietlab/ketjs-view-tools
2
+
3
+ Static-site tooling for `@ketvietlab/ketjs-view`. It renders marker-free page HTML, bundles CSS and JavaScript, and preserves hydration markers only inside explicit islands.
4
+
5
+ Use `npm create @ketvietlab/view@latest my-site` to start a project, then run `npm run dev`.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view-tools/src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { buildProject, checkProject } from './project.js';
3
+ import { serveProject } from './server.js';
4
+ const VERSION = '0.1.24';
5
+ const HELP = `Ket view tools ${VERSION}
6
+
7
+ Usage:
8
+ ket-view dev [--host HOST] [--port PORT]
9
+ ket-view build
10
+ ket-view preview [--host HOST] [--port PORT]
11
+ ket-view check
12
+
13
+ Commands:
14
+ dev build, watch and live-reload the static site
15
+ build write deployable HTML, CSS and JavaScript to dist
16
+ preview serve the current dist directory
17
+ check validate routes, pages and browser bundles without writing dist`;
18
+ const args = process.argv.slice(2);
19
+ const command = args[0];
20
+ const option = (name) => {
21
+ const index = args.indexOf(`--${name}`);
22
+ return index < 0 ? undefined : args[index + 1];
23
+ };
24
+ const portOption = () => {
25
+ const raw = option('port');
26
+ if (!raw)
27
+ return undefined;
28
+ const port = Number(raw);
29
+ if (!Number.isInteger(port) || port < 1 || port > 65_535)
30
+ throw new Error(`invalid port "${raw}"`);
31
+ return port;
32
+ };
33
+ try {
34
+ if (!command || command === 'help' || command === '--help') {
35
+ console.log(HELP);
36
+ }
37
+ else if (command === '--version') {
38
+ console.log(VERSION);
39
+ }
40
+ else if (command === 'build') {
41
+ const result = await buildProject();
42
+ console.log(`built ${result.pages.length} page(s) in ${result.outDir}`);
43
+ }
44
+ else if (command === 'check') {
45
+ const result = await checkProject();
46
+ console.log(`checked ${result.pages.length} page(s)`);
47
+ }
48
+ else if (command === 'dev' || command === 'preview') {
49
+ const running = await serveProject(process.cwd(), {
50
+ dev: command === 'dev',
51
+ host: option('host'),
52
+ port: portOption(),
53
+ });
54
+ console.log(`${command === 'dev' ? 'development server' : 'preview'} at ${running.url}`);
55
+ const stop = async () => {
56
+ await running.close();
57
+ process.exit(0);
58
+ };
59
+ process.once('SIGINT', () => void stop());
60
+ process.once('SIGTERM', () => void stop());
61
+ }
62
+ else {
63
+ throw new Error(`unknown command "${command}"\n\n${HELP}`);
64
+ }
65
+ }
66
+ catch (error) {
67
+ console.error(error instanceof Error ? error.message : error);
68
+ process.exitCode = 1;
69
+ }
70
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view-tools/src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { IslandProps, Markup } from '@ketvietlab/ketjs-view';
2
+ import type { PageDefinition, StaticIslandFactory, StaticIslandOptions, ViewConfig } from './types.ts';
3
+ export { buildProject, checkProject, loadConfig } from './project.ts';
4
+ export type { BuildResult, ClientIslandDefinition, PageDefinition, PageHead, PageLink, PageMeta, ResolvedViewConfig, StaticIslandFactory, StaticIslandOptions, ViewConfig, } from './types.ts';
5
+ export declare const defineConfig: <Config extends ViewConfig>(config: Config) => Config;
6
+ export declare const definePage: <Page extends PageDefinition>(page: Page) => Page;
7
+ /**
8
+ * Render an explicit client island into an otherwise inert static page.
9
+ * The island name must also be registered in ket-view.config.ts.
10
+ */
11
+ export declare function island<Props extends IslandProps>(name: string, factory: StaticIslandFactory<Props>, props: Props, options?: StaticIslandOptions<Props>): Markup;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view-tools/src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErE,YAAY,EACV,WAAW,EACX,sBAAsB,EACtB,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,GACX,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,UAAU,UAAU,MAAM,KAAG,MAAgB,CAAA;AAEzF,eAAO,MAAM,UAAU,GAAI,IAAI,SAAS,cAAc,QAAQ,IAAI,KAAG,IAAY,CAAA;AAEjF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,SAAS,WAAW,EAC9C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,EACnC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,mBAAmB,CAAC,KAAK,CAAM,GACvC,MAAM,CAOR"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ import { renderIsland, trustedMarkup } from '@ketvietlab/ketjs-view';
2
+ export { buildProject, checkProject, loadConfig } from './project.js';
3
+ export const defineConfig = (config) => config;
4
+ export const definePage = (page) => page;
5
+ /**
6
+ * Render an explicit client island into an otherwise inert static page.
7
+ * The island name must also be registered in ket-view.config.ts.
8
+ */
9
+ export function island(name, factory, props, options = {}) {
10
+ return trustedMarkup(renderIsland(name, factory, props, {
11
+ key: options.key,
12
+ tag: 'div',
13
+ }));
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view-tools/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAIpE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAerE,MAAM,CAAC,MAAM,YAAY,GAAG,CAA4B,MAAc,EAAU,EAAE,CAAC,MAAM,CAAA;AAEzF,MAAM,CAAC,MAAM,UAAU,GAAG,CAA8B,IAAU,EAAQ,EAAE,CAAC,IAAI,CAAA;AAEjF;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,IAAY,EACZ,OAAmC,EACnC,KAAY,EACZ,OAAO,GAA+B,EAAE;IAExC,OAAO,aAAa,CAClB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,KAAK;KACX,CAAC,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { BuildResult, ResolvedViewConfig } from './types.ts';
2
+ export declare function loadConfig(root?: string): Promise<ResolvedViewConfig>;
3
+ export declare function discoverPages(config: ResolvedViewConfig): string[];
4
+ export declare function checkProject(root?: string): Promise<BuildResult>;
5
+ export declare function buildProject(root?: string, options?: {
6
+ reload?: boolean;
7
+ }): Promise<BuildResult>;
8
+ export declare function readProjectFile(path: string): Uint8Array;
9
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view-tools/src/project.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,WAAW,EAGX,kBAAkB,EAEnB,MAAM,YAAY,CAAA;AAgDnB,wBAAsB,UAAU,CAAC,IAAI,SAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuDlF;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAMlE;AA4KD,wBAAsB,YAAY,CAAC,IAAI,SAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAM7E;AAED,wBAAsB,YAAY,CAChC,IAAI,SAAgB,EACpB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,WAAW,CAAC,CAiCtB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAExD"}
@@ -0,0 +1,326 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
10
+ import { tmpdir } from 'node:os';
11
+ import { dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path';
12
+ import { pathToFileURL } from 'node:url';
13
+ import { build } from 'esbuild';
14
+ import { escapeHtml, renderToStaticString } from '@ketvietlab/ketjs-view';
15
+ const CONFIG_NAMES = [
16
+ 'ket-view.config.ts',
17
+ 'ket-view.config.mts',
18
+ 'ket-view.config.js',
19
+ 'ket-view.config.mjs',
20
+ ];
21
+ const PAGE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs']);
22
+ const slash = (path) => path.split(sep).join('/');
23
+ const assertInside = (root, path, label) => {
24
+ const child = relative(root, path);
25
+ if (child === '' || child === '..' || child.startsWith(`..${sep}`) || isAbsolute(child))
26
+ throw new Error(`${label} must be inside the project root`);
27
+ };
28
+ const contains = (parent, child) => {
29
+ const path = relative(parent, child);
30
+ return path === '' || (!path.startsWith(`..${sep}`) && path !== '..' && !isAbsolute(path));
31
+ };
32
+ async function importSource(path, root) {
33
+ const temporary = join(root, 'node_modules', '.ket-view');
34
+ mkdirSync(temporary, { recursive: true });
35
+ const outfile = join(temporary, `module-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`);
36
+ try {
37
+ await build({
38
+ entryPoints: [path],
39
+ outfile,
40
+ bundle: true,
41
+ packages: 'external',
42
+ platform: 'node',
43
+ format: 'esm',
44
+ target: 'node24',
45
+ sourcemap: 'inline',
46
+ logLevel: 'silent',
47
+ });
48
+ return (await import(__rewriteRelativeImportExtension(`${pathToFileURL(outfile).href}?v=${Date.now()}`)));
49
+ }
50
+ finally {
51
+ rmSync(outfile, { force: true });
52
+ }
53
+ }
54
+ export async function loadConfig(root = process.cwd()) {
55
+ const projectRoot = resolve(root);
56
+ const configFile = CONFIG_NAMES.map((name) => join(projectRoot, name)).find(existsSync);
57
+ if (!configFile)
58
+ throw new Error(`missing ket-view.config.ts in ${projectRoot}`);
59
+ const imported = await importSource(configFile, projectRoot);
60
+ const source = imported.default;
61
+ if (typeof source !== 'object' || source === null || Array.isArray(source))
62
+ throw new Error(`${configFile} must export defineConfig(...) as default`);
63
+ const config = source;
64
+ const pages = resolve(projectRoot, config.pages ?? 'src/pages');
65
+ const publicDir = resolve(projectRoot, config.publicDir ?? 'public');
66
+ const outDir = resolve(projectRoot, config.outDir ?? 'dist');
67
+ assertInside(projectRoot, pages, 'pages');
68
+ assertInside(projectRoot, publicDir, 'publicDir');
69
+ assertInside(projectRoot, outDir, 'outDir');
70
+ if (contains(outDir, pages) || contains(pages, outDir))
71
+ throw new Error('pages and outDir must not contain one another');
72
+ if (contains(outDir, publicDir) || contains(publicDir, outDir))
73
+ throw new Error('publicDir and outDir must not contain one another');
74
+ const base = !config.base || config.base === '.' ? './' : config.base;
75
+ if (base !== './' && (!base.startsWith('/') || !base.endsWith('/')))
76
+ throw new Error('base must be "./" or an absolute URL path ending in "/"');
77
+ const islands = Object.fromEntries(Object.entries(config.islands ?? {}).map(([name, definition]) => {
78
+ if (!/^[a-z][a-z0-9-]*$/.test(name))
79
+ throw new Error(`invalid island name "${name}"; use lowercase kebab-case`);
80
+ const normalized = typeof definition === 'string' ? { entry: definition } : definition;
81
+ if (!normalized.entry)
82
+ throw new Error(`island "${name}" is missing its entry module`);
83
+ if (normalized.export && !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(normalized.export))
84
+ throw new Error(`island "${name}" has invalid export name "${normalized.export}"`);
85
+ return [name, normalized];
86
+ }));
87
+ for (const [label, path] of [
88
+ ...(config.styles ?? []).map((path, index) => [`styles[${index}]`, resolve(projectRoot, path)]),
89
+ ...Object.entries(islands).map(([name, definition]) => [`islands.${name}`, resolve(projectRoot, definition.entry)]),
90
+ ]) {
91
+ assertInside(projectRoot, path, label);
92
+ if (contains(outDir, path))
93
+ throw new Error(`${label} must not be inside outDir`);
94
+ }
95
+ return {
96
+ root: projectRoot,
97
+ configFile,
98
+ pages,
99
+ publicDir,
100
+ outDir,
101
+ base,
102
+ styles: config.styles ?? [],
103
+ islands,
104
+ host: config.host ?? '127.0.0.1',
105
+ port: config.port ?? 5173,
106
+ };
107
+ }
108
+ const visit = (directory, files) => {
109
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
110
+ const path = join(directory, entry.name);
111
+ if (entry.isDirectory())
112
+ visit(path, files);
113
+ else if (PAGE_EXTENSIONS.has(extname(entry.name)))
114
+ files.push(path);
115
+ }
116
+ };
117
+ export function discoverPages(config) {
118
+ if (!existsSync(config.pages))
119
+ throw new Error(`pages directory does not exist: ${config.pages}`);
120
+ const files = [];
121
+ visit(config.pages, files);
122
+ if (files.length === 0)
123
+ throw new Error(`no page modules found in ${config.pages}`);
124
+ return files.sort();
125
+ }
126
+ const inferredRoute = (config, file) => {
127
+ let name = slash(relative(config.pages, file)).replace(/\.(?:[cm]?[jt]sx?)$/, '');
128
+ if (name.split('/').some((part) => part.startsWith('[')))
129
+ throw new Error(`dynamic page names are not supported: ${relative(config.root, file)}`);
130
+ if (name === 'index')
131
+ return '/';
132
+ if (name.endsWith('/index'))
133
+ name = name.slice(0, -'/index'.length);
134
+ return `/${name}/`;
135
+ };
136
+ const checkedRoute = (route, file) => {
137
+ if (!route.startsWith('/') || !route.endsWith('/') || route.includes('?') || route.includes('#'))
138
+ throw new Error(`page route "${route}" from ${file} must start and end with "/"`);
139
+ if (route.includes('..') || route.includes('//') || route.includes('\\'))
140
+ throw new Error(`unsafe page route "${route}" from ${file}`);
141
+ return route;
142
+ };
143
+ async function loadPages(config) {
144
+ const loaded = [];
145
+ const routes = new Map();
146
+ for (const file of discoverPages(config)) {
147
+ const imported = await importSource(file, config.root);
148
+ const page = imported.default;
149
+ if (!page || typeof page !== 'object' || typeof page.view !== 'function')
150
+ throw new Error(`${relative(config.root, file)} must default-export definePage({ head, view })`);
151
+ if (!page.head || typeof page.head.title !== 'string')
152
+ throw new Error(`${relative(config.root, file)} must define head.title`);
153
+ const route = checkedRoute(page.path ?? inferredRoute(config, file), relative(config.root, file));
154
+ const previous = routes.get(route);
155
+ if (previous)
156
+ throw new Error(`duplicate page route "${route}": ${previous} and ${relative(config.root, file)}`);
157
+ routes.set(route, relative(config.root, file));
158
+ loaded.push({ source: file, route, page });
159
+ }
160
+ return loaded;
161
+ }
162
+ const quoted = (value) => JSON.stringify(value);
163
+ const clientSource = (config) => {
164
+ const imports = [];
165
+ const registry = [];
166
+ for (const [index, [name, definition]] of Object.entries(config.islands).entries()) {
167
+ const binding = `island${index}`;
168
+ const path = slash(resolve(config.root, definition.entry));
169
+ const imported = definition.export ?? 'default';
170
+ imports.push(imported === 'default'
171
+ ? `import ${binding} from ${quoted(path)}`
172
+ : `import { ${imported} as ${binding} } from ${quoted(path)}`);
173
+ registry.push(`${quoted(name)}: ${binding}`);
174
+ }
175
+ for (const style of config.styles)
176
+ imports.push(`import ${quoted(slash(resolve(config.root, style)))}`);
177
+ if (registry.length)
178
+ imports.push(`import { domHost, hydrateIslands } from '@ketvietlab/ketjs-view'`, `hydrateIslands(domHost(document), document, { ${registry.join(', ')} })`);
179
+ return imports.join('\n');
180
+ };
181
+ const listFiles = (directory) => {
182
+ if (!existsSync(directory))
183
+ return [];
184
+ const files = [];
185
+ const collect = (path) => {
186
+ for (const entry of readdirSync(path, { withFileTypes: true })) {
187
+ const child = join(path, entry.name);
188
+ if (entry.isDirectory())
189
+ collect(child);
190
+ else
191
+ files.push(slash(relative(directory, child)));
192
+ }
193
+ };
194
+ collect(directory);
195
+ return files.sort();
196
+ };
197
+ async function bundleAssets(config, write) {
198
+ const hasIslands = Object.keys(config.islands).length > 0;
199
+ if (!hasIslands && config.styles.length === 0)
200
+ return [];
201
+ const temporary = write ? null : mkdtempSync(join(tmpdir(), 'ket-view-check-'));
202
+ const outdir = temporary ?? config.outDir;
203
+ const source = hasIslands
204
+ ? { contents: clientSource(config), sourcefile: 'ket-view-client.ts', loader: 'ts' }
205
+ : {
206
+ contents: config.styles
207
+ .map((style) => `@import ${quoted(slash(resolve(config.root, style)))};`)
208
+ .join('\n'),
209
+ sourcefile: 'ket-view-client.css',
210
+ loader: 'css',
211
+ };
212
+ try {
213
+ await build({
214
+ stdin: {
215
+ resolveDir: config.root,
216
+ ...source,
217
+ },
218
+ outdir,
219
+ bundle: true,
220
+ platform: 'browser',
221
+ format: 'esm',
222
+ target: 'es2022',
223
+ entryNames: 'assets/app-[hash]',
224
+ assetNames: 'assets/[name]-[hash]',
225
+ minify: write,
226
+ sourcemap: write,
227
+ logLevel: 'silent',
228
+ write,
229
+ });
230
+ return write ? listFiles(config.outDir).filter((file) => file.startsWith('assets/')) : [];
231
+ }
232
+ finally {
233
+ if (temporary)
234
+ rmSync(temporary, { recursive: true, force: true });
235
+ }
236
+ }
237
+ const assetUrl = (config, htmlFile, asset) => {
238
+ if (config.base !== './')
239
+ return `${config.base}${asset}`;
240
+ const path = slash(relative(dirname(htmlFile), join(config.outDir, asset)));
241
+ return path.startsWith('.') ? path : `./${path}`;
242
+ };
243
+ const documentHtml = (config, page, htmlFile, body, assets, reload) => {
244
+ const css = assets.filter((file) => file.endsWith('.css'));
245
+ const js = assets.find((file) => file.endsWith('.js'));
246
+ const head = page.head;
247
+ const hasIslands = body.includes(' data-island="');
248
+ const tags = [
249
+ '<meta charset="utf-8">',
250
+ '<meta name="viewport" content="width=device-width, initial-scale=1">',
251
+ `<title>${escapeHtml(head.title)}</title>`,
252
+ ...(head.description ? [`<meta name="description" content="${escapeHtml(head.description)}">`] : []),
253
+ ...(head.meta ?? []).map((meta) => `<meta name="${escapeHtml(meta.name)}" content="${escapeHtml(meta.content)}">`),
254
+ ...(head.links ?? []).map((link) => `<link rel="${escapeHtml(link.rel)}" href="${escapeHtml(link.href)}"${link.type ? ` type="${escapeHtml(link.type)}"` : ''}>`),
255
+ ...css.map((file) => `<link rel="stylesheet" href="${assetUrl(config, htmlFile, file)}">`),
256
+ ];
257
+ const scripts = [
258
+ ...(js && hasIslands ? [`<script type="module" src="${assetUrl(config, htmlFile, js)}"></script>`] : []),
259
+ ...(reload
260
+ ? [
261
+ `<script>new EventSource('/__ket_view_events').onmessage=function(event){if(event.data==='reload')location.reload()}</script>`,
262
+ ]
263
+ : []),
264
+ ];
265
+ return `<!doctype html>\n<html lang="${escapeHtml(head.lang ?? 'en')}">\n<head>\n ${tags.join('\n ')}\n</head>\n<body>\n${body}\n${scripts.map((tag) => ` ${tag}`).join('\n')}\n</body>\n</html>\n`;
266
+ };
267
+ const outputFile = (config, route) => route === '/' ? join(config.outDir, 'index.html') : join(config.outDir, route.slice(1), 'index.html');
268
+ const validateIslands = (config, body) => {
269
+ for (const match of body.matchAll(/\sdata-island="([^"]+)"/g)) {
270
+ const name = match[1];
271
+ if (!(name in config.islands))
272
+ throw new Error(`page uses island "${name}", but ket-view.config.ts does not register it`);
273
+ }
274
+ };
275
+ export async function checkProject(root = process.cwd()) {
276
+ const config = await loadConfig(root);
277
+ const pages = await loadPages(config);
278
+ await bundleAssets(config, false);
279
+ for (const { page } of pages)
280
+ validateIslands(config, renderToStaticString(page.view()));
281
+ return { outDir: config.outDir, pages: pages.map(({ route }) => ({ route, file: '' })), assets: [] };
282
+ }
283
+ export async function buildProject(root = process.cwd(), options = {}) {
284
+ const config = await loadConfig(root);
285
+ const pages = await loadPages(config);
286
+ const stage = mkdtempSync(join(config.root, '.ket-view-stage-'));
287
+ const backup = `${config.outDir}.ket-view-backup-${process.pid}`;
288
+ const stagedConfig = { ...config, outDir: stage };
289
+ try {
290
+ if (existsSync(config.publicDir))
291
+ cpSync(config.publicDir, stage, { recursive: true });
292
+ const assets = await bundleAssets(stagedConfig, true);
293
+ const output = [];
294
+ for (const { route, page } of pages) {
295
+ const file = outputFile(stagedConfig, route);
296
+ const body = renderToStaticString(page.view());
297
+ validateIslands(config, body);
298
+ mkdirSync(dirname(file), { recursive: true });
299
+ writeFileSync(file, documentHtml(stagedConfig, page, file, body, assets, options.reload ?? false));
300
+ output.push({ route, file: join(config.outDir, relative(stage, file)) });
301
+ }
302
+ rmSync(backup, { recursive: true, force: true });
303
+ if (existsSync(config.outDir))
304
+ renameSync(config.outDir, backup);
305
+ try {
306
+ renameSync(stage, config.outDir);
307
+ rmSync(backup, { recursive: true, force: true });
308
+ }
309
+ catch (error) {
310
+ if (!existsSync(config.outDir) && existsSync(backup))
311
+ renameSync(backup, config.outDir);
312
+ throw error;
313
+ }
314
+ return { outDir: config.outDir, pages: output, assets };
315
+ }
316
+ catch (error) {
317
+ rmSync(stage, { recursive: true, force: true });
318
+ if (!existsSync(config.outDir) && existsSync(backup))
319
+ renameSync(backup, config.outDir);
320
+ throw error;
321
+ }
322
+ }
323
+ export function readProjectFile(path) {
324
+ return readFileSync(path);
325
+ }
326
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view-tools/src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function serveProject(root?: string, options?: {
2
+ dev?: boolean;
3
+ host?: string;
4
+ port?: number;
5
+ }): Promise<{
6
+ url: string;
7
+ close(): Promise<void>;
8
+ }>;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view-tools/src/server.ts"],"names":[],"mappings":"AAuCA,wBAAsB,YAAY,CAChC,IAAI,SAAgB,EACpB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAgGlD"}
package/dist/server.js ADDED
@@ -0,0 +1,135 @@
1
+ import { existsSync, statSync, watch } from 'node:fs';
2
+ import { createServer } from 'node:http';
3
+ import { extname, join, normalize, relative, resolve, sep } from 'node:path';
4
+ import { buildProject, loadConfig, readProjectFile } from './project.js';
5
+ const MIME = {
6
+ '.css': 'text/css; charset=utf-8',
7
+ '.html': 'text/html; charset=utf-8',
8
+ '.ico': 'image/x-icon',
9
+ '.jpeg': 'image/jpeg',
10
+ '.jpg': 'image/jpeg',
11
+ '.js': 'text/javascript; charset=utf-8',
12
+ '.json': 'application/json; charset=utf-8',
13
+ '.png': 'image/png',
14
+ '.svg': 'image/svg+xml',
15
+ '.webp': 'image/webp',
16
+ };
17
+ const send = (response, status, body) => {
18
+ response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });
19
+ response.end(body);
20
+ };
21
+ const fileFor = (outDir, requestPath) => {
22
+ let decoded;
23
+ try {
24
+ decoded = decodeURIComponent(requestPath);
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ const candidate = resolve(outDir, `.${normalize(decoded)}`);
30
+ const child = relative(outDir, candidate);
31
+ if (child === '..' || child.startsWith(`..${sep}`))
32
+ return null;
33
+ if (existsSync(candidate) && statSync(candidate).isFile())
34
+ return candidate;
35
+ const index = join(candidate, 'index.html');
36
+ return existsSync(index) && statSync(index).isFile() ? index : null;
37
+ };
38
+ export async function serveProject(root = process.cwd(), options = {}) {
39
+ const config = await loadConfig(root);
40
+ const dev = options.dev ?? false;
41
+ if (dev)
42
+ await buildProject(root, { reload: true });
43
+ else if (!existsSync(config.outDir))
44
+ throw new Error(`output directory does not exist: ${config.outDir}; run ket-view build first`);
45
+ const clients = new Set();
46
+ const server = createServer((request, response) => {
47
+ const url = new URL(request.url ?? '/', 'http://localhost');
48
+ if (dev && url.pathname === '/__ket_view_events') {
49
+ response.writeHead(200, {
50
+ 'cache-control': 'no-cache',
51
+ connection: 'keep-alive',
52
+ 'content-type': 'text/event-stream',
53
+ });
54
+ response.write(': connected\n\n');
55
+ clients.add(response);
56
+ request.on('close', () => clients.delete(response));
57
+ return;
58
+ }
59
+ const file = fileFor(config.outDir, url.pathname);
60
+ if (!file)
61
+ return send(response, 404, 'Not found');
62
+ response.writeHead(200, {
63
+ 'cache-control': dev ? 'no-store' : 'public, max-age=0',
64
+ 'content-type': MIME[extname(file)] ?? 'application/octet-stream',
65
+ });
66
+ response.end(readProjectFile(file));
67
+ });
68
+ const host = options.host ?? config.host;
69
+ const port = options.port ?? (dev ? config.port : 4173);
70
+ await new Promise((resolveListen, reject) => {
71
+ server.once('error', reject);
72
+ server.listen(port, host, () => {
73
+ server.off('error', reject);
74
+ resolveListen();
75
+ });
76
+ });
77
+ let watcher;
78
+ let timer;
79
+ let building = false;
80
+ let queued = false;
81
+ const rebuild = async () => {
82
+ if (building) {
83
+ queued = true;
84
+ return;
85
+ }
86
+ building = true;
87
+ try {
88
+ await buildProject(root, { reload: true });
89
+ for (const client of clients)
90
+ client.write('data: reload\n\n');
91
+ console.log('rebuilt static site');
92
+ }
93
+ catch (error) {
94
+ console.error(error instanceof Error ? error.message : error);
95
+ }
96
+ finally {
97
+ building = false;
98
+ if (queued) {
99
+ queued = false;
100
+ void rebuild();
101
+ }
102
+ }
103
+ };
104
+ if (dev) {
105
+ const out = relative(config.root, config.outDir);
106
+ watcher = watch(config.root, { recursive: true }, (_event, filename) => {
107
+ const path = String(filename ?? '');
108
+ const parts = path.split(/[\\/]/);
109
+ if (!path ||
110
+ path === out ||
111
+ path.startsWith(`${out}${sep}`) ||
112
+ path.startsWith(`${out}.ket-view-backup-`) ||
113
+ parts.includes('.git') ||
114
+ parts.includes('node_modules') ||
115
+ parts.some((part) => part.startsWith('.ket-view-stage-')))
116
+ return;
117
+ if (timer)
118
+ clearTimeout(timer);
119
+ timer = setTimeout(() => void rebuild(), 80);
120
+ });
121
+ }
122
+ const url = `http://${host}:${port}`;
123
+ return {
124
+ url,
125
+ close: async () => {
126
+ if (timer)
127
+ clearTimeout(timer);
128
+ watcher?.close();
129
+ for (const client of clients)
130
+ client.end();
131
+ await new Promise((resolveClose, reject) => server.close((error) => (error ? reject(error) : resolveClose())));
132
+ },
133
+ };
134
+ }
135
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view-tools/src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { IslandFactory, IslandProps, TemplateResult } from '@ketvietlab/ketjs-view';
2
+ export type PageMeta = {
3
+ name: string;
4
+ content: string;
5
+ };
6
+ export type PageLink = {
7
+ rel: string;
8
+ href: string;
9
+ type?: string;
10
+ };
11
+ export type PageHead = {
12
+ title: string;
13
+ description?: string;
14
+ lang?: string;
15
+ meta?: readonly PageMeta[];
16
+ links?: readonly PageLink[];
17
+ };
18
+ export type PageDefinition = {
19
+ /** Override the route inferred from the file name. Must end with a slash. */
20
+ path?: string;
21
+ head: PageHead;
22
+ view(): TemplateResult;
23
+ };
24
+ export type ClientIslandDefinition = {
25
+ /** Module path relative to ket-view.config.ts. */
26
+ entry: string;
27
+ /** Named export containing the IslandFactory. Defaults to `default`. */
28
+ export?: string;
29
+ };
30
+ export type ViewConfig = {
31
+ pages?: string;
32
+ publicDir?: string;
33
+ outDir?: string;
34
+ base?: string;
35
+ styles?: readonly string[];
36
+ islands?: Readonly<Record<string, string | ClientIslandDefinition>>;
37
+ host?: string;
38
+ port?: number;
39
+ };
40
+ export type ResolvedViewConfig = {
41
+ root: string;
42
+ configFile: string;
43
+ pages: string;
44
+ publicDir: string;
45
+ outDir: string;
46
+ base: string;
47
+ styles: readonly string[];
48
+ islands: Readonly<Record<string, ClientIslandDefinition>>;
49
+ host: string;
50
+ port: number;
51
+ };
52
+ export type BuildResult = {
53
+ outDir: string;
54
+ pages: readonly {
55
+ route: string;
56
+ file: string;
57
+ }[];
58
+ assets: readonly string[];
59
+ };
60
+ export type StaticIslandOptions<Props extends IslandProps> = {
61
+ key?: readonly (keyof Props & string)[];
62
+ };
63
+ export type StaticIslandFactory<Props extends IslandProps> = IslandFactory<Props>;
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view-tools/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAExF,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,IAAI,cAAc,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAA;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAA;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACjD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,WAAW,IAAI;IAC3D,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,WAAW,IAAI,aAAa,CAAC,KAAK,CAAC,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view-tools/src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@ketvietlab/ketjs-view-tools",
3
+ "version": "0.1.24",
4
+ "description": "Static-site development and build tools for Ket view.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "ket-view": "./dist/cli.js"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/ketvietlab/ketjs.git",
15
+ "directory": "packages/ketjs-view-tools"
16
+ },
17
+ "homepage": "https://github.com/ketvietlab/ketjs#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/ketvietlab/ketjs/issues"
20
+ },
21
+ "keywords": [
22
+ "static-site",
23
+ "ssg",
24
+ "islands",
25
+ "ketjs",
26
+ "typescript"
27
+ ],
28
+ "engines": {
29
+ "node": ">=24.0.0"
30
+ },
31
+ "scripts": {
32
+ "prepack": "npm run build --prefix ../.."
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js"
38
+ }
39
+ },
40
+ "dependencies": {
41
+ "@ketvietlab/ketjs-view": "0.1.24",
42
+ "esbuild": "0.28.2"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public",
46
+ "provenance": true,
47
+ "registry": "https://registry.npmjs.org/"
48
+ },
49
+ "files": [
50
+ "dist"
51
+ ]
52
+ }