@oddkin/workbench 0.0.0-stage → 1.0.0-beta.1
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 +21 -0
- package/README.md +66 -2
- package/dist/app/card-previews.d.ts +14 -0
- package/dist/app/card-previews.d.ts.map +1 -0
- package/dist/app/card-previews.js +140 -0
- package/dist/app/card-previews.js.map +1 -0
- package/dist/app/copy.d.ts +48 -0
- package/dist/app/copy.d.ts.map +1 -0
- package/dist/app/copy.js +52 -0
- package/dist/app/copy.js.map +1 -0
- package/dist/app/define.d.ts +3 -0
- package/dist/app/define.d.ts.map +1 -0
- package/dist/app/define.js +10 -0
- package/dist/app/define.js.map +1 -0
- package/dist/app/details.d.ts +22 -0
- package/dist/app/details.d.ts.map +1 -0
- package/dist/app/details.js +17 -0
- package/dist/app/details.js.map +1 -0
- package/dist/app/index.d.ts +12 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +9 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/routes.d.ts +26 -0
- package/dist/app/routes.d.ts.map +1 -0
- package/dist/app/routes.js +96 -0
- package/dist/app/routes.js.map +1 -0
- package/dist/app/search.d.ts +17 -0
- package/dist/app/search.d.ts.map +1 -0
- package/dist/app/search.js +52 -0
- package/dist/app/search.js.map +1 -0
- package/dist/app/shell.d.ts +29 -0
- package/dist/app/shell.d.ts.map +1 -0
- package/dist/app/shell.js +478 -0
- package/dist/app/shell.js.map +1 -0
- package/dist/app/styles.d.ts +2 -0
- package/dist/app/styles.d.ts.map +1 -0
- package/dist/app/styles.js +356 -0
- package/dist/app/styles.js.map +1 -0
- package/dist/app/theme-studio.d.ts +12 -0
- package/dist/app/theme-studio.d.ts.map +1 -0
- package/dist/app/theme-studio.js +14 -0
- package/dist/app/theme-studio.js.map +1 -0
- package/dist/app/views.d.ts +38 -0
- package/dist/app/views.d.ts.map +1 -0
- package/dist/app/views.js +252 -0
- package/dist/app/views.js.map +1 -0
- package/dist/config/index.d.ts +170 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +148 -0
- package/dist/config/index.js.map +1 -0
- package/dist/conformance/button.d.ts +2 -0
- package/dist/conformance/button.d.ts.map +1 -0
- package/dist/conformance/button.js +233 -0
- package/dist/conformance/button.js.map +1 -0
- package/dist/conformance/index.d.ts +107 -0
- package/dist/conformance/index.d.ts.map +1 -0
- package/dist/conformance/index.js +60 -0
- package/dist/conformance/index.js.map +1 -0
- package/dist/data/build.d.ts +36 -0
- package/dist/data/build.d.ts.map +1 -0
- package/dist/data/build.js +260 -0
- package/dist/data/build.js.map +1 -0
- package/dist/data/import-map.d.ts +59 -0
- package/dist/data/import-map.d.ts.map +1 -0
- package/dist/data/import-map.js +195 -0
- package/dist/data/import-map.js.map +1 -0
- package/dist/data/index.d.ts +14 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +10 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/theme-studio.d.ts +21 -0
- package/dist/data/theme-studio.d.ts.map +1 -0
- package/dist/data/theme-studio.js +112 -0
- package/dist/data/theme-studio.js.map +1 -0
- package/dist/data/types.d.ts +187 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +4 -0
- package/dist/data/types.js.map +1 -0
- package/dist/examples/index.d.ts +101 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +106 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/frame/index.d.ts +9 -0
- package/dist/frame/index.d.ts.map +1 -0
- package/dist/frame/index.js +482 -0
- package/dist/frame/index.js.map +1 -0
- package/dist/internal/diagnostics.d.ts +17 -0
- package/dist/internal/diagnostics.d.ts.map +1 -0
- package/dist/internal/diagnostics.js +19 -0
- package/dist/internal/diagnostics.js.map +1 -0
- package/dist/node/bin.d.ts +3 -0
- package/dist/node/bin.d.ts.map +1 -0
- package/dist/node/bin.js +12 -0
- package/dist/node/bin.js.map +1 -0
- package/dist/node/cli.d.ts +17 -0
- package/dist/node/cli.d.ts.map +1 -0
- package/dist/node/cli.js +198 -0
- package/dist/node/cli.js.map +1 -0
- package/dist/node/config.d.ts +28 -0
- package/dist/node/config.d.ts.map +1 -0
- package/dist/node/config.js +80 -0
- package/dist/node/config.js.map +1 -0
- package/dist/node/example-modules.d.ts +8 -0
- package/dist/node/example-modules.d.ts.map +1 -0
- package/dist/node/example-modules.js +28 -0
- package/dist/node/example-modules.js.map +1 -0
- package/dist/node/generated.d.ts +19 -0
- package/dist/node/generated.d.ts.map +1 -0
- package/dist/node/generated.js +109 -0
- package/dist/node/generated.js.map +1 -0
- package/dist/node/html.d.ts +35 -0
- package/dist/node/html.d.ts.map +1 -0
- package/dist/node/html.js +51 -0
- package/dist/node/html.js.map +1 -0
- package/dist/node/index.d.ts +24 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +15 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/inputs.d.ts +26 -0
- package/dist/node/inputs.d.ts.map +1 -0
- package/dist/node/inputs.js +282 -0
- package/dist/node/inputs.js.map +1 -0
- package/dist/node/packages.d.ts +35 -0
- package/dist/node/packages.d.ts.map +1 -0
- package/dist/node/packages.js +87 -0
- package/dist/node/packages.js.map +1 -0
- package/dist/node/preload.d.ts +10 -0
- package/dist/node/preload.d.ts.map +1 -0
- package/dist/node/preload.js +61 -0
- package/dist/node/preload.js.map +1 -0
- package/dist/node/server.d.ts +42 -0
- package/dist/node/server.d.ts.map +1 -0
- package/dist/node/server.js +410 -0
- package/dist/node/server.js.map +1 -0
- package/dist/node/static.d.ts +43 -0
- package/dist/node/static.d.ts.map +1 -0
- package/dist/node/static.js +157 -0
- package/dist/node/static.js.map +1 -0
- package/dist/node/workbench.d.ts +43 -0
- package/dist/node/workbench.d.ts.map +1 -0
- package/dist/node/workbench.js +204 -0
- package/dist/node/workbench.js.map +1 -0
- package/dist/pages/build.d.ts +22 -0
- package/dist/pages/build.d.ts.map +1 -0
- package/dist/pages/build.js +363 -0
- package/dist/pages/build.js.map +1 -0
- package/dist/pages/defaults.d.ts +16 -0
- package/dist/pages/defaults.d.ts.map +1 -0
- package/dist/pages/defaults.js +88 -0
- package/dist/pages/defaults.js.map +1 -0
- package/dist/pages/index.d.ts +14 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +10 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/pages/navigation.d.ts +48 -0
- package/dist/pages/navigation.d.ts.map +1 -0
- package/dist/pages/navigation.js +83 -0
- package/dist/pages/navigation.js.map +1 -0
- package/dist/pages/types.d.ts +148 -0
- package/dist/pages/types.d.ts.map +1 -0
- package/dist/pages/types.js +3 -0
- package/dist/pages/types.js.map +1 -0
- package/dist/panels/catalog-define.d.ts +3 -0
- package/dist/panels/catalog-define.d.ts.map +1 -0
- package/dist/panels/catalog-define.js +7 -0
- package/dist/panels/catalog-define.js.map +1 -0
- package/dist/panels/catalog-layout-styles.d.ts +2 -0
- package/dist/panels/catalog-layout-styles.d.ts.map +1 -0
- package/dist/panels/catalog-layout-styles.js +54 -0
- package/dist/panels/catalog-layout-styles.js.map +1 -0
- package/dist/panels/catalog-styles.d.ts +2 -0
- package/dist/panels/catalog-styles.d.ts.map +1 -0
- package/dist/panels/catalog-styles.js +106 -0
- package/dist/panels/catalog-styles.js.map +1 -0
- package/dist/panels/catalog.d.ts +37 -0
- package/dist/panels/catalog.d.ts.map +1 -0
- package/dist/panels/catalog.js +74 -0
- package/dist/panels/catalog.js.map +1 -0
- package/dist/panels/component-define.d.ts +3 -0
- package/dist/panels/component-define.d.ts.map +1 -0
- package/dist/panels/component-define.js +6 -0
- package/dist/panels/component-define.js.map +1 -0
- package/dist/panels/component-detail.d.ts +49 -0
- package/dist/panels/component-detail.d.ts.map +1 -0
- package/dist/panels/component-detail.js +1352 -0
- package/dist/panels/component-detail.js.map +1 -0
- package/dist/panels/component.d.ts +17 -0
- package/dist/panels/component.d.ts.map +1 -0
- package/dist/panels/component.js +10 -0
- package/dist/panels/component.js.map +1 -0
- package/dist/panels/example-styles.d.ts +2 -0
- package/dist/panels/example-styles.d.ts.map +1 -0
- package/dist/panels/example-styles.js +343 -0
- package/dist/panels/example-styles.js.map +1 -0
- package/dist/panels/foundation-define.d.ts +3 -0
- package/dist/panels/foundation-define.d.ts.map +1 -0
- package/dist/panels/foundation-define.js +6 -0
- package/dist/panels/foundation-define.js.map +1 -0
- package/dist/panels/foundation-detail.d.ts +23 -0
- package/dist/panels/foundation-detail.d.ts.map +1 -0
- package/dist/panels/foundation-detail.js +216 -0
- package/dist/panels/foundation-detail.js.map +1 -0
- package/dist/panels/foundation.d.ts +15 -0
- package/dist/panels/foundation.d.ts.map +1 -0
- package/dist/panels/foundation.js +9 -0
- package/dist/panels/foundation.js.map +1 -0
- package/dist/panels/model.d.ts +184 -0
- package/dist/panels/model.d.ts.map +1 -0
- package/dist/panels/model.js +488 -0
- package/dist/panels/model.js.map +1 -0
- package/dist/panels/styles.d.ts +3 -0
- package/dist/panels/styles.d.ts.map +1 -0
- package/dist/panels/styles.js +265 -0
- package/dist/panels/styles.js.map +1 -0
- package/dist/panels/theme-model.d.ts +69 -0
- package/dist/panels/theme-model.d.ts.map +1 -0
- package/dist/panels/theme-model.js +166 -0
- package/dist/panels/theme-model.js.map +1 -0
- package/dist/panels/theme-studio.d.ts +32 -0
- package/dist/panels/theme-studio.d.ts.map +1 -0
- package/dist/panels/theme-studio.js +375 -0
- package/dist/panels/theme-studio.js.map +1 -0
- package/dist/preview/frame.d.ts +44 -0
- package/dist/preview/frame.d.ts.map +1 -0
- package/dist/preview/frame.js +260 -0
- package/dist/preview/frame.js.map +1 -0
- package/dist/preview/index.d.ts +26 -0
- package/dist/preview/index.d.ts.map +1 -0
- package/dist/preview/index.js +58 -0
- package/dist/preview/index.js.map +1 -0
- package/dist/preview/theme-generation.d.ts +33 -0
- package/dist/preview/theme-generation.d.ts.map +1 -0
- package/dist/preview/theme-generation.js +48 -0
- package/dist/preview/theme-generation.js.map +1 -0
- package/dist/protocol/index.d.ts +222 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +272 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/testing/index.d.ts +47 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +145 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +118 -4
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { WorkbenchDiagnostic } from '../internal/diagnostics.js';
|
|
2
|
+
import { type WorkbenchBuild } from './workbench.js';
|
|
3
|
+
export declare const DEFAULT_PORT = 4175;
|
|
4
|
+
export interface DevServerOptions {
|
|
5
|
+
/** A configuration file or the directory holding it. Default: the working directory. */
|
|
6
|
+
readonly config?: string;
|
|
7
|
+
/** Default 4175; 0 picks a free port. */
|
|
8
|
+
readonly port?: number;
|
|
9
|
+
/** Default `localhost`, bound to both loopback addresses and not reachable from other machines. */
|
|
10
|
+
readonly host?: string;
|
|
11
|
+
/** Watch the inputs and push updates. Default true. */
|
|
12
|
+
readonly watch?: boolean;
|
|
13
|
+
readonly log?: (line: string) => void;
|
|
14
|
+
}
|
|
15
|
+
/** What one rebuild changed, as sent to the shell (`event: update`). */
|
|
16
|
+
export interface UpdateEvent {
|
|
17
|
+
/** False when the new configuration or data is invalid; the last valid data stays served. */
|
|
18
|
+
readonly ok: boolean;
|
|
19
|
+
readonly index: boolean;
|
|
20
|
+
/** Ids of pages whose data changed, appeared, or disappeared. */
|
|
21
|
+
readonly pages: readonly string[];
|
|
22
|
+
/** `name@version` of packages whose files (other than data inputs) changed. */
|
|
23
|
+
readonly modules: readonly string[];
|
|
24
|
+
/** The shell page changed (its import map or stylesheets): reload it. */
|
|
25
|
+
readonly shell: boolean;
|
|
26
|
+
readonly diagnostics: readonly WorkbenchDiagnostic[];
|
|
27
|
+
}
|
|
28
|
+
export interface DevServer {
|
|
29
|
+
/** `http://host:port<base>`. */
|
|
30
|
+
readonly url: string;
|
|
31
|
+
/** The build being served (the last valid one). */
|
|
32
|
+
readonly build: WorkbenchBuild;
|
|
33
|
+
/** Rebuild now, as a watched change does. */
|
|
34
|
+
rebuild(changed?: readonly string[]): Promise<UpdateEvent>;
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export declare class DevServerError extends Error {
|
|
38
|
+
readonly diagnostics: readonly WorkbenchDiagnostic[];
|
|
39
|
+
constructor(message: string, diagnostics: readonly WorkbenchDiagnostic[]);
|
|
40
|
+
}
|
|
41
|
+
export declare function startDevServer(options?: DevServerOptions): Promise<DevServer>;
|
|
42
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/node/server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE,OAAO,EAA+C,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAElG,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mGAAmG;IACnG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAGrC,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE;IAFtD,YACE,OAAO,EAAE,MAAM,EACN,WAAW,EAAE,SAAS,mBAAmB,EAAE,EAIrD;CACF;AAgCD,wBAAsB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CA8WvF"}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oddkin workbench dev`: serves the shell, the data files, and package files from one origin
|
|
3
|
+
* (workbench.md §2.1), watches the inputs, rebuilds, and pushes updates over Server-Sent Events.
|
|
4
|
+
* An invalid edit keeps the last valid data and reports what is wrong.
|
|
5
|
+
*/
|
|
6
|
+
import { statSync, watch } from 'node:fs';
|
|
7
|
+
import { readFile, realpath, stat } from 'node:fs/promises';
|
|
8
|
+
import { createServer } from 'node:http';
|
|
9
|
+
import { basename, dirname, extname, isAbsolute, join, relative } from 'node:path';
|
|
10
|
+
import { CONFIG_FILES } from './config.js';
|
|
11
|
+
import { writeGenerated } from './generated.js';
|
|
12
|
+
import { DOCS_FILES } from './inputs.js';
|
|
13
|
+
import { ASSET_DIR, buildWorkbench, formatDiagnostic } from './workbench.js';
|
|
14
|
+
export const DEFAULT_PORT = 4175;
|
|
15
|
+
export class DevServerError extends Error {
|
|
16
|
+
diagnostics;
|
|
17
|
+
constructor(message, diagnostics) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.diagnostics = diagnostics;
|
|
20
|
+
this.name = 'DevServerError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const TYPES = {
|
|
24
|
+
'.html': 'text/html; charset=utf-8',
|
|
25
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
26
|
+
'.mjs': 'text/javascript; charset=utf-8',
|
|
27
|
+
'.css': 'text/css; charset=utf-8',
|
|
28
|
+
'.json': 'application/json; charset=utf-8',
|
|
29
|
+
'.map': 'application/json; charset=utf-8',
|
|
30
|
+
'.svg': 'image/svg+xml',
|
|
31
|
+
'.png': 'image/png',
|
|
32
|
+
'.jpg': 'image/jpeg',
|
|
33
|
+
'.jpeg': 'image/jpeg',
|
|
34
|
+
'.gif': 'image/gif',
|
|
35
|
+
'.webp': 'image/webp',
|
|
36
|
+
'.avif': 'image/avif',
|
|
37
|
+
'.ico': 'image/x-icon',
|
|
38
|
+
'.woff': 'font/woff',
|
|
39
|
+
'.woff2': 'font/woff2',
|
|
40
|
+
'.ttf': 'font/ttf',
|
|
41
|
+
'.otf': 'font/otf',
|
|
42
|
+
'.txt': 'text/plain; charset=utf-8',
|
|
43
|
+
'.md': 'text/markdown; charset=utf-8',
|
|
44
|
+
};
|
|
45
|
+
const inside = (file, dir) => {
|
|
46
|
+
const rel = relative(dir, file);
|
|
47
|
+
return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);
|
|
48
|
+
};
|
|
49
|
+
const OUTPUT = ['.oddkin', 'workbench'];
|
|
50
|
+
export async function startDevServer(options = {}) {
|
|
51
|
+
const log = options.log ?? (() => { });
|
|
52
|
+
const buildOptions = { ...(options.config ? { config: options.config } : {}), events: true };
|
|
53
|
+
let current = await buildWorkbench(buildOptions);
|
|
54
|
+
const config = current.config;
|
|
55
|
+
if (!current.data || !config)
|
|
56
|
+
throw new DevServerError('The Workbench could not be built.', current.diagnostics);
|
|
57
|
+
const base = config.hosting.basePath;
|
|
58
|
+
const routing = config.hosting.routing;
|
|
59
|
+
await writeGenerated(join(current.root, ...OUTPUT), current.files);
|
|
60
|
+
const clients = new Set();
|
|
61
|
+
const send = (res, status, type, body) => {
|
|
62
|
+
res.writeHead(status, { 'content-type': type, 'cache-control': 'no-cache' });
|
|
63
|
+
res.end(body);
|
|
64
|
+
};
|
|
65
|
+
const notFound = (res) => send(res, 404, 'text/plain; charset=utf-8', 'Not found');
|
|
66
|
+
async function packageFile(req, res, path) {
|
|
67
|
+
let segments;
|
|
68
|
+
try {
|
|
69
|
+
segments = path.split('/').map(decodeURIComponent);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return notFound(res);
|
|
73
|
+
}
|
|
74
|
+
const scoped = segments[0]?.startsWith('@');
|
|
75
|
+
const key = scoped ? `${segments[0]}/${segments[1]}` : segments[0];
|
|
76
|
+
const rest = segments.slice(scoped ? 2 : 1);
|
|
77
|
+
const dir = key ? current.packages.get(key) : undefined;
|
|
78
|
+
const unsafe = rest.some((s) => s === '' || s === '.' || s === '..' || s === 'node_modules' || /[\\/:\0]/.test(s));
|
|
79
|
+
if (!dir || rest.length === 0 || unsafe)
|
|
80
|
+
return notFound(res);
|
|
81
|
+
let file;
|
|
82
|
+
try {
|
|
83
|
+
file = await realpath(join(dir, ...rest));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return notFound(res);
|
|
87
|
+
}
|
|
88
|
+
const info = inside(file, dir) ? await stat(file) : undefined;
|
|
89
|
+
if (!info?.isFile())
|
|
90
|
+
return notFound(res);
|
|
91
|
+
const etag = `W/"${info.size}-${Math.trunc(info.mtimeMs)}"`;
|
|
92
|
+
if (req.headers['if-none-match'] === etag) {
|
|
93
|
+
res.writeHead(304, { etag, 'cache-control': 'no-cache' }).end();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
res.writeHead(200, {
|
|
97
|
+
'content-type': TYPES[extname(file).toLowerCase()] ?? 'application/octet-stream',
|
|
98
|
+
'cache-control': 'no-cache',
|
|
99
|
+
etag,
|
|
100
|
+
});
|
|
101
|
+
res.end(req.method === 'HEAD' ? undefined : await readFile(file));
|
|
102
|
+
}
|
|
103
|
+
function events(req, res) {
|
|
104
|
+
res.writeHead(200, {
|
|
105
|
+
'content-type': 'text/event-stream; charset=utf-8',
|
|
106
|
+
'cache-control': 'no-cache',
|
|
107
|
+
connection: 'keep-alive',
|
|
108
|
+
});
|
|
109
|
+
res.write('retry: 1000\n\n');
|
|
110
|
+
clients.add(res);
|
|
111
|
+
req.on('close', () => clients.delete(res));
|
|
112
|
+
}
|
|
113
|
+
async function handle(req, res) {
|
|
114
|
+
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
115
|
+
res.writeHead(405, { allow: 'GET, HEAD' }).end();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
119
|
+
const path = url.pathname;
|
|
120
|
+
if (base !== '/' && path === base.slice(0, -1)) {
|
|
121
|
+
res.writeHead(308, { location: `${base}${url.search}` }).end();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (!path.startsWith(base))
|
|
125
|
+
return notFound(res);
|
|
126
|
+
const rest = path.slice(base.length);
|
|
127
|
+
if (rest.startsWith(ASSET_DIR)) {
|
|
128
|
+
const asset = rest.slice(ASSET_DIR.length);
|
|
129
|
+
if (asset === 'events')
|
|
130
|
+
return events(req, res);
|
|
131
|
+
if (asset.startsWith('m/'))
|
|
132
|
+
return packageFile(req, res, asset.slice(2));
|
|
133
|
+
const file = current.files.get(asset);
|
|
134
|
+
return file === undefined
|
|
135
|
+
? notFound(res)
|
|
136
|
+
: send(res, 200, TYPES[extname(asset).toLowerCase()] ?? 'application/octet-stream', file);
|
|
137
|
+
}
|
|
138
|
+
// History mode serves the shell for every page path, as a host with rewrites does; hash
|
|
139
|
+
// mode serves it only at the entry, as a static host without rewrites does.
|
|
140
|
+
const entry = rest === '' || rest === 'index.html';
|
|
141
|
+
const html = (req.headers.accept ?? '').includes('text/html');
|
|
142
|
+
if (!entry && (routing === 'hash' || !html))
|
|
143
|
+
return notFound(res);
|
|
144
|
+
send(res, 200, TYPES['.html'], current.shell);
|
|
145
|
+
}
|
|
146
|
+
const handleRequest = (req, res) => {
|
|
147
|
+
handle(req, res).catch((error) => {
|
|
148
|
+
log(`error ${req.url}: ${error instanceof Error ? error.message : String(error)}`);
|
|
149
|
+
if (!res.headersSent)
|
|
150
|
+
res.writeHead(500);
|
|
151
|
+
res.end();
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const host = options.host ?? 'localhost';
|
|
155
|
+
const servers = [];
|
|
156
|
+
const listen = (server, port, address) => new Promise((resolve, reject) => {
|
|
157
|
+
server.once('error', reject);
|
|
158
|
+
server.listen(port, address, () => {
|
|
159
|
+
server.off('error', reject);
|
|
160
|
+
resolve();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
let port = options.port ?? DEFAULT_PORT;
|
|
164
|
+
try {
|
|
165
|
+
const addresses = host === 'localhost' ? ['127.0.0.1', '::1'] : [host];
|
|
166
|
+
for (const address of addresses) {
|
|
167
|
+
const server = createServer(handleRequest);
|
|
168
|
+
servers.push(server);
|
|
169
|
+
await listen(server, port, address);
|
|
170
|
+
if (options.port === undefined || options.port === 0)
|
|
171
|
+
port = server.address().port;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
await Promise.all(servers.map((server) => new Promise((resolve) => {
|
|
176
|
+
if (server.listening) {
|
|
177
|
+
server.close(() => resolve());
|
|
178
|
+
server.closeAllConnections();
|
|
179
|
+
}
|
|
180
|
+
else
|
|
181
|
+
resolve();
|
|
182
|
+
})));
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
const url = `http://${host.includes(':') ? `[${host}]` : host}:${port}${base}`;
|
|
186
|
+
// Watching: package directories recursively; the configuration's directory and the
|
|
187
|
+
// directories of authored content and data files outside packages, by file name.
|
|
188
|
+
const watchers = new Map();
|
|
189
|
+
/** Each watched directory's inode when its watcher started. */
|
|
190
|
+
const identities = new Map();
|
|
191
|
+
/** Every directory watched so far, with the names it reacts to (from the latest build). */
|
|
192
|
+
const wanted = new Map();
|
|
193
|
+
/**
|
|
194
|
+
* Watched directories that went away: deleted (a reinstall deletes a package's) or replaced by
|
|
195
|
+
* a new directory, whose old watcher hears nothing more. Each is watched again once it is back.
|
|
196
|
+
*/
|
|
197
|
+
const gone = new Set();
|
|
198
|
+
let pending = new Set();
|
|
199
|
+
let timer;
|
|
200
|
+
let running = Promise.resolve();
|
|
201
|
+
let closed = false;
|
|
202
|
+
const changed = (path) => {
|
|
203
|
+
if (closed)
|
|
204
|
+
return;
|
|
205
|
+
pending.add(path);
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
timer = setTimeout(() => {
|
|
208
|
+
const paths = [...pending];
|
|
209
|
+
pending = new Set();
|
|
210
|
+
running = running
|
|
211
|
+
.then(() => update(paths))
|
|
212
|
+
.catch((error) => log(`error: rebuild failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
213
|
+
}, 80);
|
|
214
|
+
};
|
|
215
|
+
function watchTargets(build) {
|
|
216
|
+
const targets = new Map();
|
|
217
|
+
const packages = build.inputs?.graph ?? [];
|
|
218
|
+
const ignored = new Set(['node_modules', '.oddkin', '.git']);
|
|
219
|
+
for (const pkg of packages)
|
|
220
|
+
targets.set(`r:${pkg.dir}`, (name) => !name.split(/[\\/]/).some((s) => ignored.has(s)));
|
|
221
|
+
const names = new Set([...CONFIG_FILES, ...DOCS_FILES]);
|
|
222
|
+
const files = [
|
|
223
|
+
...(build.configFile ? [build.configFile] : []),
|
|
224
|
+
...(build.inputs?.contentFiles ?? []),
|
|
225
|
+
...(build.inputs?.dataFiles ?? []).filter((f) => !packages.some((p) => inside(f, p.dir))),
|
|
226
|
+
];
|
|
227
|
+
for (const file of files)
|
|
228
|
+
names.add(basename(file));
|
|
229
|
+
for (const dir of new Set([build.root, ...files.map((file) => dirname(file))]))
|
|
230
|
+
targets.set(`d:${dir}`, (name) => names.has(name));
|
|
231
|
+
return targets;
|
|
232
|
+
}
|
|
233
|
+
function rewatch(build) {
|
|
234
|
+
if (options.watch === false || closed)
|
|
235
|
+
return;
|
|
236
|
+
// Kept even when a later build lacks one, as a build with a package missing mid-reinstall
|
|
237
|
+
// does: the directory's next files rebuild, and the build that finds them again.
|
|
238
|
+
for (const [key, accept] of watchTargets(build))
|
|
239
|
+
wanted.set(key, accept);
|
|
240
|
+
for (const key of wanted.keys()) {
|
|
241
|
+
if (watchers.has(key))
|
|
242
|
+
continue;
|
|
243
|
+
const dir = key.slice(2);
|
|
244
|
+
// The directory itself, which a watcher follows even through a rename.
|
|
245
|
+
const identity = statSync(dir, { throwIfNoEntry: false, bigint: true })?.ino;
|
|
246
|
+
if (identity === undefined) {
|
|
247
|
+
gone.add(key);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const watcher = watch(dir, { recursive: key.startsWith('r:') }, (_event, name) => {
|
|
252
|
+
if (name && wanted.get(key)?.(String(name)))
|
|
253
|
+
changed(join(dir, String(name)));
|
|
254
|
+
});
|
|
255
|
+
watcher.on('error', () => lose(key, watcher));
|
|
256
|
+
watchers.set(key, watcher);
|
|
257
|
+
identities.set(key, identity);
|
|
258
|
+
// Back after it went away: rebuild with what it holds now.
|
|
259
|
+
if (gone.delete(key)) {
|
|
260
|
+
log(`${dir} is back`);
|
|
261
|
+
changed(dir);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
log(`warning: cannot watch ${dir}: ${error instanceof Error ? error.message : String(error)}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** A watched directory was deleted or replaced: rebuild, and watch it again once it is back. */
|
|
270
|
+
function lose(key, watcher) {
|
|
271
|
+
if (watchers.get(key) !== watcher)
|
|
272
|
+
return;
|
|
273
|
+
watcher.close();
|
|
274
|
+
watchers.delete(key);
|
|
275
|
+
identities.delete(key);
|
|
276
|
+
gone.add(key);
|
|
277
|
+
log(`warning: ${key.slice(2)} went away; watching for it to come back`);
|
|
278
|
+
changed(key.slice(2));
|
|
279
|
+
rewatch(current);
|
|
280
|
+
}
|
|
281
|
+
// Not every change has an event: Windows reports none for a watched directory renamed away
|
|
282
|
+
// (npm moves a package aside before writing the new one), and a swapped symlink has none.
|
|
283
|
+
const poll = options.watch === false
|
|
284
|
+
? undefined
|
|
285
|
+
: setInterval(() => {
|
|
286
|
+
for (const [key, watcher] of watchers)
|
|
287
|
+
if (statSync(key.slice(2), { throwIfNoEntry: false, bigint: true })?.ino !==
|
|
288
|
+
identities.get(key))
|
|
289
|
+
lose(key, watcher);
|
|
290
|
+
if (gone.size)
|
|
291
|
+
rewatch(current);
|
|
292
|
+
}, 500);
|
|
293
|
+
poll?.unref();
|
|
294
|
+
const broadcast = (event) => {
|
|
295
|
+
const text = `event: update\ndata: ${JSON.stringify(event)}\n\n`;
|
|
296
|
+
for (const client of clients)
|
|
297
|
+
client.write(text);
|
|
298
|
+
};
|
|
299
|
+
async function update(paths = []) {
|
|
300
|
+
const next = await buildWorkbench(buildOptions);
|
|
301
|
+
const dataFiles = new Set([
|
|
302
|
+
...(next.inputs?.dataFiles ?? []),
|
|
303
|
+
...(current.inputs?.dataFiles ?? []),
|
|
304
|
+
]);
|
|
305
|
+
const modules = new Set();
|
|
306
|
+
for (const path of paths) {
|
|
307
|
+
if (dataFiles.has(path))
|
|
308
|
+
continue;
|
|
309
|
+
for (const pkg of current.inputs?.graph ?? [])
|
|
310
|
+
if (inside(path, pkg.dir))
|
|
311
|
+
modules.add(`${pkg.name}@${pkg.version}`);
|
|
312
|
+
}
|
|
313
|
+
let event;
|
|
314
|
+
if (!next.data ||
|
|
315
|
+
!next.config ||
|
|
316
|
+
next.config.hosting.basePath !== base ||
|
|
317
|
+
next.config.hosting.routing !== routing) {
|
|
318
|
+
const restart = next.config &&
|
|
319
|
+
(next.config.hosting.basePath !== base || next.config.hosting.routing !== routing)
|
|
320
|
+
? [
|
|
321
|
+
{
|
|
322
|
+
code: 'node.dev.restart',
|
|
323
|
+
severity: 'error',
|
|
324
|
+
message: 'hosting.basePath or hosting.routing changed; restart the dev server to apply it.',
|
|
325
|
+
},
|
|
326
|
+
]
|
|
327
|
+
: [];
|
|
328
|
+
event = {
|
|
329
|
+
ok: false,
|
|
330
|
+
index: false,
|
|
331
|
+
pages: [],
|
|
332
|
+
modules: [...modules],
|
|
333
|
+
shell: false,
|
|
334
|
+
diagnostics: [...restart, ...next.diagnostics],
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
const pages = new Set();
|
|
339
|
+
const before = current.data?.index.pages ?? {};
|
|
340
|
+
const after = next.data.index.pages;
|
|
341
|
+
for (const id of new Set([...Object.keys(before), ...Object.keys(after)])) {
|
|
342
|
+
const file = after[id] ?? before[id];
|
|
343
|
+
if (file && current.files.get(file) !== next.files.get(file))
|
|
344
|
+
pages.add(id);
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
await writeGenerated(join(next.root, ...OUTPUT), next.files);
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
log(`error: ${error instanceof Error ? error.message : String(error)}`);
|
|
351
|
+
}
|
|
352
|
+
event = {
|
|
353
|
+
ok: true,
|
|
354
|
+
index: current.files.get('index.json') !== next.files.get('index.json'),
|
|
355
|
+
pages: [...pages],
|
|
356
|
+
modules: [...modules],
|
|
357
|
+
shell: current.shell !== next.shell,
|
|
358
|
+
diagnostics: next.diagnostics,
|
|
359
|
+
};
|
|
360
|
+
current = next;
|
|
361
|
+
rewatch(current);
|
|
362
|
+
}
|
|
363
|
+
if (!closed)
|
|
364
|
+
broadcast(event);
|
|
365
|
+
const what = event.ok
|
|
366
|
+
? [
|
|
367
|
+
event.index && 'index',
|
|
368
|
+
event.pages.length && `${event.pages.length} page(s)`,
|
|
369
|
+
event.modules.length && `modules of ${event.modules.join(', ')}`,
|
|
370
|
+
event.shell && 'shell',
|
|
371
|
+
]
|
|
372
|
+
.filter(Boolean)
|
|
373
|
+
.join(', ') || 'nothing changed'
|
|
374
|
+
: `kept the last valid data (${event.diagnostics.filter((d) => d.severity === 'error').length} error(s))`;
|
|
375
|
+
log(`update: ${what}`);
|
|
376
|
+
for (const d of event.diagnostics)
|
|
377
|
+
if (d.severity === 'error')
|
|
378
|
+
log(formatDiagnostic(d));
|
|
379
|
+
return event;
|
|
380
|
+
}
|
|
381
|
+
rewatch(current);
|
|
382
|
+
return {
|
|
383
|
+
url,
|
|
384
|
+
get build() {
|
|
385
|
+
return current;
|
|
386
|
+
},
|
|
387
|
+
rebuild(paths = []) {
|
|
388
|
+
const result = running.then(() => update(paths));
|
|
389
|
+
running = result.catch(() => undefined);
|
|
390
|
+
return result;
|
|
391
|
+
},
|
|
392
|
+
async close() {
|
|
393
|
+
closed = true;
|
|
394
|
+
clearTimeout(timer);
|
|
395
|
+
clearInterval(poll);
|
|
396
|
+
for (const watcher of watchers.values())
|
|
397
|
+
watcher.close();
|
|
398
|
+
watchers.clear();
|
|
399
|
+
await running.catch(() => { });
|
|
400
|
+
for (const client of clients)
|
|
401
|
+
client.end();
|
|
402
|
+
clients.clear();
|
|
403
|
+
await Promise.all(servers.map((server) => new Promise((resolve) => {
|
|
404
|
+
server.close(() => resolve());
|
|
405
|
+
server.closeAllConnections();
|
|
406
|
+
})));
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/node/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Routing } from '../config/index.js';
|
|
2
|
+
import { type WorkbenchDiagnostic } from '../internal/diagnostics.js';
|
|
3
|
+
import { type GeneratedContent } from './generated.js';
|
|
4
|
+
import { type WorkbenchBuild } from './workbench.js';
|
|
5
|
+
export interface StaticBuildOptions {
|
|
6
|
+
/** A configuration file or the directory holding it. Default: the working directory. */
|
|
7
|
+
readonly config?: string;
|
|
8
|
+
/** Output directory. Default: `.oddkin/workbench-build` in the project. */
|
|
9
|
+
readonly out?: string;
|
|
10
|
+
/** Replaces the configuration's `hosting` values for this build. */
|
|
11
|
+
readonly hosting?: {
|
|
12
|
+
readonly basePath?: string;
|
|
13
|
+
readonly routing?: Routing;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface StaticBuild {
|
|
17
|
+
readonly build: WorkbenchBuild;
|
|
18
|
+
/** The output directory; undefined when nothing was written. */
|
|
19
|
+
readonly out: string | undefined;
|
|
20
|
+
/** Relative paths of every file in the output, sorted. */
|
|
21
|
+
readonly files: readonly string[];
|
|
22
|
+
readonly written: readonly string[];
|
|
23
|
+
readonly removed: readonly string[];
|
|
24
|
+
readonly diagnostics: readonly WorkbenchDiagnostic[];
|
|
25
|
+
}
|
|
26
|
+
/** Every path the shell's router answers in history mode (app/routes.ts `shellRoutes`). */
|
|
27
|
+
export declare function shellPaths(build: WorkbenchBuild): string[];
|
|
28
|
+
/**
|
|
29
|
+
* The files below `_oddkin/` (relative to the base path): data, the frame document and import
|
|
30
|
+
* maps, Theme Studio's worker, and the packages' published browser files. A site that serves its
|
|
31
|
+
* own pages and embeds the panels (apps/docs) needs these and no shell.
|
|
32
|
+
*/
|
|
33
|
+
export declare function embedFiles(build: WorkbenchBuild): Promise<{
|
|
34
|
+
files: Map<string, GeneratedContent>;
|
|
35
|
+
diagnostics: WorkbenchDiagnostic[];
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Build the Workbench and write it as a static app. Writes nothing when the configuration or
|
|
39
|
+
* metadata has errors. The output directory carries the generated-directory marker, so a later
|
|
40
|
+
* build replaces it and an unmarked directory is refused (`GeneratedDirectoryError`).
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildStatic(options?: StaticBuildOptions): Promise<StaticBuild>;
|
|
43
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/node/static.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC/E;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACtD;AA8DD,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAe1D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAAC,WAAW,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAC,CA8BvF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAgCxF"}
|