@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.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -2
  3. package/dist/app/card-previews.d.ts +14 -0
  4. package/dist/app/card-previews.d.ts.map +1 -0
  5. package/dist/app/card-previews.js +140 -0
  6. package/dist/app/card-previews.js.map +1 -0
  7. package/dist/app/copy.d.ts +48 -0
  8. package/dist/app/copy.d.ts.map +1 -0
  9. package/dist/app/copy.js +52 -0
  10. package/dist/app/copy.js.map +1 -0
  11. package/dist/app/define.d.ts +3 -0
  12. package/dist/app/define.d.ts.map +1 -0
  13. package/dist/app/define.js +10 -0
  14. package/dist/app/define.js.map +1 -0
  15. package/dist/app/details.d.ts +22 -0
  16. package/dist/app/details.d.ts.map +1 -0
  17. package/dist/app/details.js +17 -0
  18. package/dist/app/details.js.map +1 -0
  19. package/dist/app/index.d.ts +12 -0
  20. package/dist/app/index.d.ts.map +1 -0
  21. package/dist/app/index.js +9 -0
  22. package/dist/app/index.js.map +1 -0
  23. package/dist/app/routes.d.ts +26 -0
  24. package/dist/app/routes.d.ts.map +1 -0
  25. package/dist/app/routes.js +96 -0
  26. package/dist/app/routes.js.map +1 -0
  27. package/dist/app/search.d.ts +17 -0
  28. package/dist/app/search.d.ts.map +1 -0
  29. package/dist/app/search.js +52 -0
  30. package/dist/app/search.js.map +1 -0
  31. package/dist/app/shell.d.ts +29 -0
  32. package/dist/app/shell.d.ts.map +1 -0
  33. package/dist/app/shell.js +478 -0
  34. package/dist/app/shell.js.map +1 -0
  35. package/dist/app/styles.d.ts +2 -0
  36. package/dist/app/styles.d.ts.map +1 -0
  37. package/dist/app/styles.js +356 -0
  38. package/dist/app/styles.js.map +1 -0
  39. package/dist/app/theme-studio.d.ts +12 -0
  40. package/dist/app/theme-studio.d.ts.map +1 -0
  41. package/dist/app/theme-studio.js +14 -0
  42. package/dist/app/theme-studio.js.map +1 -0
  43. package/dist/app/views.d.ts +38 -0
  44. package/dist/app/views.d.ts.map +1 -0
  45. package/dist/app/views.js +252 -0
  46. package/dist/app/views.js.map +1 -0
  47. package/dist/config/index.d.ts +170 -0
  48. package/dist/config/index.d.ts.map +1 -0
  49. package/dist/config/index.js +148 -0
  50. package/dist/config/index.js.map +1 -0
  51. package/dist/conformance/button.d.ts +2 -0
  52. package/dist/conformance/button.d.ts.map +1 -0
  53. package/dist/conformance/button.js +233 -0
  54. package/dist/conformance/button.js.map +1 -0
  55. package/dist/conformance/index.d.ts +107 -0
  56. package/dist/conformance/index.d.ts.map +1 -0
  57. package/dist/conformance/index.js +60 -0
  58. package/dist/conformance/index.js.map +1 -0
  59. package/dist/data/build.d.ts +36 -0
  60. package/dist/data/build.d.ts.map +1 -0
  61. package/dist/data/build.js +260 -0
  62. package/dist/data/build.js.map +1 -0
  63. package/dist/data/import-map.d.ts +59 -0
  64. package/dist/data/import-map.d.ts.map +1 -0
  65. package/dist/data/import-map.js +195 -0
  66. package/dist/data/import-map.js.map +1 -0
  67. package/dist/data/index.d.ts +14 -0
  68. package/dist/data/index.d.ts.map +1 -0
  69. package/dist/data/index.js +10 -0
  70. package/dist/data/index.js.map +1 -0
  71. package/dist/data/theme-studio.d.ts +21 -0
  72. package/dist/data/theme-studio.d.ts.map +1 -0
  73. package/dist/data/theme-studio.js +112 -0
  74. package/dist/data/theme-studio.js.map +1 -0
  75. package/dist/data/types.d.ts +187 -0
  76. package/dist/data/types.d.ts.map +1 -0
  77. package/dist/data/types.js +4 -0
  78. package/dist/data/types.js.map +1 -0
  79. package/dist/examples/index.d.ts +101 -0
  80. package/dist/examples/index.d.ts.map +1 -0
  81. package/dist/examples/index.js +106 -0
  82. package/dist/examples/index.js.map +1 -0
  83. package/dist/frame/index.d.ts +9 -0
  84. package/dist/frame/index.d.ts.map +1 -0
  85. package/dist/frame/index.js +482 -0
  86. package/dist/frame/index.js.map +1 -0
  87. package/dist/internal/diagnostics.d.ts +17 -0
  88. package/dist/internal/diagnostics.d.ts.map +1 -0
  89. package/dist/internal/diagnostics.js +19 -0
  90. package/dist/internal/diagnostics.js.map +1 -0
  91. package/dist/node/bin.d.ts +3 -0
  92. package/dist/node/bin.d.ts.map +1 -0
  93. package/dist/node/bin.js +12 -0
  94. package/dist/node/bin.js.map +1 -0
  95. package/dist/node/cli.d.ts +17 -0
  96. package/dist/node/cli.d.ts.map +1 -0
  97. package/dist/node/cli.js +198 -0
  98. package/dist/node/cli.js.map +1 -0
  99. package/dist/node/config.d.ts +28 -0
  100. package/dist/node/config.d.ts.map +1 -0
  101. package/dist/node/config.js +80 -0
  102. package/dist/node/config.js.map +1 -0
  103. package/dist/node/example-modules.d.ts +8 -0
  104. package/dist/node/example-modules.d.ts.map +1 -0
  105. package/dist/node/example-modules.js +28 -0
  106. package/dist/node/example-modules.js.map +1 -0
  107. package/dist/node/generated.d.ts +19 -0
  108. package/dist/node/generated.d.ts.map +1 -0
  109. package/dist/node/generated.js +109 -0
  110. package/dist/node/generated.js.map +1 -0
  111. package/dist/node/html.d.ts +35 -0
  112. package/dist/node/html.d.ts.map +1 -0
  113. package/dist/node/html.js +51 -0
  114. package/dist/node/html.js.map +1 -0
  115. package/dist/node/index.d.ts +24 -0
  116. package/dist/node/index.d.ts.map +1 -0
  117. package/dist/node/index.js +15 -0
  118. package/dist/node/index.js.map +1 -0
  119. package/dist/node/inputs.d.ts +26 -0
  120. package/dist/node/inputs.d.ts.map +1 -0
  121. package/dist/node/inputs.js +282 -0
  122. package/dist/node/inputs.js.map +1 -0
  123. package/dist/node/packages.d.ts +35 -0
  124. package/dist/node/packages.d.ts.map +1 -0
  125. package/dist/node/packages.js +87 -0
  126. package/dist/node/packages.js.map +1 -0
  127. package/dist/node/preload.d.ts +10 -0
  128. package/dist/node/preload.d.ts.map +1 -0
  129. package/dist/node/preload.js +61 -0
  130. package/dist/node/preload.js.map +1 -0
  131. package/dist/node/server.d.ts +42 -0
  132. package/dist/node/server.d.ts.map +1 -0
  133. package/dist/node/server.js +410 -0
  134. package/dist/node/server.js.map +1 -0
  135. package/dist/node/static.d.ts +43 -0
  136. package/dist/node/static.d.ts.map +1 -0
  137. package/dist/node/static.js +157 -0
  138. package/dist/node/static.js.map +1 -0
  139. package/dist/node/workbench.d.ts +43 -0
  140. package/dist/node/workbench.d.ts.map +1 -0
  141. package/dist/node/workbench.js +204 -0
  142. package/dist/node/workbench.js.map +1 -0
  143. package/dist/pages/build.d.ts +22 -0
  144. package/dist/pages/build.d.ts.map +1 -0
  145. package/dist/pages/build.js +363 -0
  146. package/dist/pages/build.js.map +1 -0
  147. package/dist/pages/defaults.d.ts +16 -0
  148. package/dist/pages/defaults.d.ts.map +1 -0
  149. package/dist/pages/defaults.js +88 -0
  150. package/dist/pages/defaults.js.map +1 -0
  151. package/dist/pages/index.d.ts +14 -0
  152. package/dist/pages/index.d.ts.map +1 -0
  153. package/dist/pages/index.js +10 -0
  154. package/dist/pages/index.js.map +1 -0
  155. package/dist/pages/navigation.d.ts +48 -0
  156. package/dist/pages/navigation.d.ts.map +1 -0
  157. package/dist/pages/navigation.js +83 -0
  158. package/dist/pages/navigation.js.map +1 -0
  159. package/dist/pages/types.d.ts +148 -0
  160. package/dist/pages/types.d.ts.map +1 -0
  161. package/dist/pages/types.js +3 -0
  162. package/dist/pages/types.js.map +1 -0
  163. package/dist/panels/catalog-define.d.ts +3 -0
  164. package/dist/panels/catalog-define.d.ts.map +1 -0
  165. package/dist/panels/catalog-define.js +7 -0
  166. package/dist/panels/catalog-define.js.map +1 -0
  167. package/dist/panels/catalog-layout-styles.d.ts +2 -0
  168. package/dist/panels/catalog-layout-styles.d.ts.map +1 -0
  169. package/dist/panels/catalog-layout-styles.js +54 -0
  170. package/dist/panels/catalog-layout-styles.js.map +1 -0
  171. package/dist/panels/catalog-styles.d.ts +2 -0
  172. package/dist/panels/catalog-styles.d.ts.map +1 -0
  173. package/dist/panels/catalog-styles.js +106 -0
  174. package/dist/panels/catalog-styles.js.map +1 -0
  175. package/dist/panels/catalog.d.ts +37 -0
  176. package/dist/panels/catalog.d.ts.map +1 -0
  177. package/dist/panels/catalog.js +74 -0
  178. package/dist/panels/catalog.js.map +1 -0
  179. package/dist/panels/component-define.d.ts +3 -0
  180. package/dist/panels/component-define.d.ts.map +1 -0
  181. package/dist/panels/component-define.js +6 -0
  182. package/dist/panels/component-define.js.map +1 -0
  183. package/dist/panels/component-detail.d.ts +49 -0
  184. package/dist/panels/component-detail.d.ts.map +1 -0
  185. package/dist/panels/component-detail.js +1352 -0
  186. package/dist/panels/component-detail.js.map +1 -0
  187. package/dist/panels/component.d.ts +17 -0
  188. package/dist/panels/component.d.ts.map +1 -0
  189. package/dist/panels/component.js +10 -0
  190. package/dist/panels/component.js.map +1 -0
  191. package/dist/panels/example-styles.d.ts +2 -0
  192. package/dist/panels/example-styles.d.ts.map +1 -0
  193. package/dist/panels/example-styles.js +343 -0
  194. package/dist/panels/example-styles.js.map +1 -0
  195. package/dist/panels/foundation-define.d.ts +3 -0
  196. package/dist/panels/foundation-define.d.ts.map +1 -0
  197. package/dist/panels/foundation-define.js +6 -0
  198. package/dist/panels/foundation-define.js.map +1 -0
  199. package/dist/panels/foundation-detail.d.ts +23 -0
  200. package/dist/panels/foundation-detail.d.ts.map +1 -0
  201. package/dist/panels/foundation-detail.js +216 -0
  202. package/dist/panels/foundation-detail.js.map +1 -0
  203. package/dist/panels/foundation.d.ts +15 -0
  204. package/dist/panels/foundation.d.ts.map +1 -0
  205. package/dist/panels/foundation.js +9 -0
  206. package/dist/panels/foundation.js.map +1 -0
  207. package/dist/panels/model.d.ts +184 -0
  208. package/dist/panels/model.d.ts.map +1 -0
  209. package/dist/panels/model.js +488 -0
  210. package/dist/panels/model.js.map +1 -0
  211. package/dist/panels/styles.d.ts +3 -0
  212. package/dist/panels/styles.d.ts.map +1 -0
  213. package/dist/panels/styles.js +265 -0
  214. package/dist/panels/styles.js.map +1 -0
  215. package/dist/panels/theme-model.d.ts +69 -0
  216. package/dist/panels/theme-model.d.ts.map +1 -0
  217. package/dist/panels/theme-model.js +166 -0
  218. package/dist/panels/theme-model.js.map +1 -0
  219. package/dist/panels/theme-studio.d.ts +32 -0
  220. package/dist/panels/theme-studio.d.ts.map +1 -0
  221. package/dist/panels/theme-studio.js +375 -0
  222. package/dist/panels/theme-studio.js.map +1 -0
  223. package/dist/preview/frame.d.ts +44 -0
  224. package/dist/preview/frame.d.ts.map +1 -0
  225. package/dist/preview/frame.js +260 -0
  226. package/dist/preview/frame.js.map +1 -0
  227. package/dist/preview/index.d.ts +26 -0
  228. package/dist/preview/index.d.ts.map +1 -0
  229. package/dist/preview/index.js +58 -0
  230. package/dist/preview/index.js.map +1 -0
  231. package/dist/preview/theme-generation.d.ts +33 -0
  232. package/dist/preview/theme-generation.d.ts.map +1 -0
  233. package/dist/preview/theme-generation.js +48 -0
  234. package/dist/preview/theme-generation.js.map +1 -0
  235. package/dist/protocol/index.d.ts +222 -0
  236. package/dist/protocol/index.d.ts.map +1 -0
  237. package/dist/protocol/index.js +272 -0
  238. package/dist/protocol/index.js.map +1 -0
  239. package/dist/testing/index.d.ts +47 -0
  240. package/dist/testing/index.d.ts.map +1 -0
  241. package/dist/testing/index.js +145 -0
  242. package/dist/testing/index.js.map +1 -0
  243. package/package.json +118 -4
@@ -0,0 +1,198 @@
1
+ /**
2
+ * The `oddkin` command (workbench.md §10): `analyze` runs `@oddkin/analyzer`'s own command with
3
+ * the same arguments, `workbench dev` serves the Workbench with live updates, and
4
+ * `workbench build` writes it as a static app.
5
+ * Exit codes: 0 success, 1 errors, 2 usage errors.
6
+ */
7
+ import { spawn } from 'node:child_process';
8
+ import { readFileSync } from 'node:fs';
9
+ import { createRequire } from 'node:module';
10
+ import { dirname, join, relative, resolve } from 'node:path';
11
+ import { parseArgs } from 'node:util';
12
+ import { GeneratedDirectoryError } from './generated.js';
13
+ import { DEFAULT_PORT, DevServerError, startDevServer } from './server.js';
14
+ import { buildStatic } from './static.js';
15
+ import { formatDiagnostic, WORKBENCH_DIR } from './workbench.js';
16
+ export const USAGE = `Usage:
17
+ oddkin analyze <tsconfig.json> [options] Analyze a component library with @oddkin/analyzer
18
+ (the options of oddkin-analyze; "oddkin analyze --help")
19
+ oddkin workbench dev [--config <file or directory>] [--port <number>] [--host <name>] [--no-watch]
20
+ Serve the Workbench with live updates (port ${DEFAULT_PORT})
21
+ oddkin workbench build [--config <file or directory>] [--out <directory>] [--base <path>] [--routing history|hash]
22
+ Write the Workbench as a static app (default .oddkin/workbench-build)
23
+ oddkin --help | --version`;
24
+ const version = () => JSON.parse(readFileSync(join(WORKBENCH_DIR, 'package.json'), 'utf8'))
25
+ .version;
26
+ /** The analyzer's command, resolved from this package like any dependency. */
27
+ export function analyzerBin() {
28
+ const require = createRequire(join(WORKBENCH_DIR, 'package.json'));
29
+ const manifest = require.resolve('@oddkin/analyzer/package.json');
30
+ const { bin } = JSON.parse(readFileSync(manifest, 'utf8'));
31
+ return join(dirname(manifest), bin['oddkin-analyze']);
32
+ }
33
+ function analyze(args, io) {
34
+ return new Promise((resolve) => {
35
+ const child = spawn(process.execPath, [analyzerBin(), ...args], {
36
+ stdio: io.inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'],
37
+ });
38
+ let stdout = '';
39
+ let stderr = '';
40
+ child.stdout?.setEncoding('utf8').on('data', (chunk) => (stdout += chunk));
41
+ child.stderr?.setEncoding('utf8').on('data', (chunk) => (stderr += chunk));
42
+ const stop = () => child.kill();
43
+ io.signal?.addEventListener('abort', stop, { once: true });
44
+ child.on('close', (code) => {
45
+ io.signal?.removeEventListener('abort', stop);
46
+ if (stdout.trim())
47
+ io.out(stdout.trimEnd());
48
+ if (stderr.trim())
49
+ io.err(stderr.trimEnd());
50
+ resolve(code ?? 1);
51
+ });
52
+ });
53
+ }
54
+ async function dev(args, io) {
55
+ let values;
56
+ try {
57
+ ({ values } = parseArgs({
58
+ args: [...args],
59
+ options: {
60
+ config: { type: 'string' },
61
+ port: { type: 'string' },
62
+ host: { type: 'string' },
63
+ 'no-watch': { type: 'boolean' },
64
+ help: { type: 'boolean', short: 'h' },
65
+ },
66
+ }));
67
+ }
68
+ catch (error) {
69
+ io.err(`${error instanceof Error ? error.message : String(error)}\n${USAGE}`);
70
+ return 2;
71
+ }
72
+ if (values.help) {
73
+ io.out(USAGE);
74
+ return 0;
75
+ }
76
+ const port = values.port === undefined ? DEFAULT_PORT : Number(values.port);
77
+ if (!/^\d+$/.test(values.port ?? '0') || port > 65535) {
78
+ io.err(`--port must be a whole number from 0 to 65535.\n${USAGE}`);
79
+ return 2;
80
+ }
81
+ let server;
82
+ try {
83
+ server = await startDevServer({
84
+ ...(values.config ? { config: values.config } : {}),
85
+ port,
86
+ ...(values.host ? { host: values.host } : {}),
87
+ watch: !values['no-watch'],
88
+ log: (line) => io.out(line),
89
+ });
90
+ }
91
+ catch (error) {
92
+ if (error instanceof DevServerError) {
93
+ for (const d of error.diagnostics)
94
+ io.err(formatDiagnostic(d));
95
+ io.err(error.message);
96
+ return 1;
97
+ }
98
+ if (error instanceof GeneratedDirectoryError) {
99
+ io.err(`error ${error.code}: ${error.message}`);
100
+ return 1;
101
+ }
102
+ if (error.code === 'EADDRINUSE') {
103
+ io.err(`error: port ${port} is in use; choose another with --port.`);
104
+ return 1;
105
+ }
106
+ throw error;
107
+ }
108
+ for (const d of server.build.diagnostics)
109
+ (d.severity === 'error' ? io.err : io.out)(formatDiagnostic(d));
110
+ io.out(`Workbench: ${server.url}`);
111
+ io.onServer?.(server);
112
+ await new Promise((resolve) => {
113
+ if (io.signal?.aborted)
114
+ resolve();
115
+ else
116
+ io.signal?.addEventListener('abort', () => resolve(), { once: true });
117
+ });
118
+ await server.close();
119
+ return 0;
120
+ }
121
+ async function build(args, io) {
122
+ let values;
123
+ try {
124
+ ({ values } = parseArgs({
125
+ args: [...args],
126
+ options: {
127
+ config: { type: 'string' },
128
+ out: { type: 'string' },
129
+ base: { type: 'string' },
130
+ routing: { type: 'string' },
131
+ help: { type: 'boolean', short: 'h' },
132
+ },
133
+ }));
134
+ }
135
+ catch (error) {
136
+ io.err(`${error instanceof Error ? error.message : String(error)}\n${USAGE}`);
137
+ return 2;
138
+ }
139
+ if (values.help) {
140
+ io.out(USAGE);
141
+ return 0;
142
+ }
143
+ const routing = values.routing;
144
+ if (routing !== undefined && routing !== 'history' && routing !== 'hash') {
145
+ io.err(`--routing must be "history" or "hash".\n${USAGE}`);
146
+ return 2;
147
+ }
148
+ const hosting = {
149
+ ...(values.base !== undefined ? { basePath: values.base } : {}),
150
+ ...(routing ? { routing } : {}),
151
+ };
152
+ let result;
153
+ try {
154
+ result = await buildStatic({
155
+ ...(values.config ? { config: values.config } : {}),
156
+ ...(values.out ? { out: resolve(values.out) } : {}),
157
+ ...(Object.keys(hosting).length ? { hosting } : {}),
158
+ });
159
+ }
160
+ catch (error) {
161
+ if (error instanceof GeneratedDirectoryError) {
162
+ io.err(`error ${error.code}: ${error.message}`);
163
+ return 1;
164
+ }
165
+ throw error;
166
+ }
167
+ for (const d of result.diagnostics)
168
+ (d.severity === 'error' ? io.err : io.out)(formatDiagnostic(d));
169
+ if (!result.out) {
170
+ io.err('The Workbench was not built; nothing was written.');
171
+ return 1;
172
+ }
173
+ io.out(`Workbench build: ${relative(process.cwd(), result.out) || '.'} (${result.files.length} files: ${result.written.length} written, ${result.removed.length} removed), base path ${result.build.config?.hosting.basePath}`);
174
+ return 0;
175
+ }
176
+ /** Run `oddkin` with `args`; resolves with the exit code. */
177
+ export async function run(args, io) {
178
+ const [command, ...rest] = args;
179
+ if (command === '--help' || command === '-h') {
180
+ io.out(USAGE);
181
+ return 0;
182
+ }
183
+ if (command === '--version') {
184
+ io.out(version());
185
+ return 0;
186
+ }
187
+ if (command === 'analyze')
188
+ return analyze(rest, io);
189
+ if (command === 'workbench' && rest[0] === 'dev')
190
+ return dev(rest.slice(1), io);
191
+ if (command === 'workbench' && rest[0] === 'build')
192
+ return build(rest.slice(1), io);
193
+ io.err(command === undefined
194
+ ? USAGE
195
+ : `Unknown command "${[command, ...(command === 'workbench' ? rest.slice(0, 1) : [])].join(' ')}".\n${USAGE}`);
196
+ return 2;
197
+ }
198
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/node/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type ResolvedWorkbenchConfig, type Routing } from '../config/index.js';
2
+ import { type WorkbenchDiagnostic } from '../internal/diagnostics.js';
3
+ export declare const CONFIG_FILES: readonly ['oddkin.config.ts', 'oddkin.config.mts', 'oddkin.config.js', 'oddkin.config.mjs', 'oddkin.config.json'];
4
+ /**
5
+ * A module's default export, or a JSON file's value. Modules are imported under a fresh URL each
6
+ * time, so an edited file is read again (modules it imports are not reloaded).
7
+ */
8
+ export declare function loadDefault(file: string): Promise<unknown>;
9
+ /** Why loading failed, with a hint for TypeScript files. */
10
+ export declare function loadFailure(file: string, error: unknown): string;
11
+ export interface LoadedConfig {
12
+ /** The configuration file, when one was found. */
13
+ readonly file: string | undefined;
14
+ /** The project root: the configuration file's directory. */
15
+ readonly root: string;
16
+ /** The resolved configuration; undefined when it is missing or invalid. */
17
+ readonly config: ResolvedWorkbenchConfig | undefined;
18
+ readonly diagnostics: WorkbenchDiagnostic[];
19
+ }
20
+ /**
21
+ * Find and load the configuration from a file, or from the first `CONFIG_FILES` entry in a
22
+ * directory. `hosting` replaces the file's values (a build's `--base`), validated like them.
23
+ */
24
+ export declare function loadWorkbenchConfig(target?: string, hosting?: {
25
+ readonly basePath?: string;
26
+ readonly routing?: Routing;
27
+ }): Promise<LoadedConfig>;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/node/config.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,OAAO,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtF,eAAO,MAAM,YAAY,YACvB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,CACZ,CAAC;AAKX;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAShE;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAMhE;AAED,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,SAAM,EACZ,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE,OAAO,CAAC,YAAY,CAAC,CAkCvB"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Load `oddkin.config.*` and authored content files. JS and TS files are trusted project code:
3
+ * loading them executes them. TypeScript relies on Node's type stripping (erasable syntax only).
4
+ */
5
+ import { existsSync, statSync } from 'node:fs';
6
+ import { readFile } from 'node:fs/promises';
7
+ import { dirname, extname, join, resolve } from 'node:path';
8
+ import { pathToFileURL } from 'node:url';
9
+ import { resolveWorkbenchConfig, } from '../config/index.js';
10
+ import { DiagnosticList } from '../internal/diagnostics.js';
11
+ export const CONFIG_FILES = [
12
+ 'oddkin.config.ts',
13
+ 'oddkin.config.mts',
14
+ 'oddkin.config.js',
15
+ 'oddkin.config.mjs',
16
+ 'oddkin.config.json',
17
+ ];
18
+ const MODULES = new Set(['.ts', '.mts', '.js', '.mjs']);
19
+ let reloads = 0;
20
+ /**
21
+ * A module's default export, or a JSON file's value. Modules are imported under a fresh URL each
22
+ * time, so an edited file is read again (modules it imports are not reloaded).
23
+ */
24
+ export async function loadDefault(file) {
25
+ const extension = extname(file);
26
+ if (extension === '.json')
27
+ return JSON.parse(await readFile(file, 'utf8'));
28
+ if (!MODULES.has(extension))
29
+ throw new Error(`unsupported extension "${extension}"; use .ts, .mts, .js, .mjs, or .json.`);
30
+ const url = `${pathToFileURL(file).href}?oddkin=${++reloads}`;
31
+ const module = (await import(url));
32
+ if (module.default === undefined)
33
+ throw new Error('has no default export.');
34
+ return module.default;
35
+ }
36
+ /** Why loading failed, with a hint for TypeScript files. */
37
+ export function loadFailure(file, error) {
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ const hint = ['.ts', '.mts'].includes(extname(file))
40
+ ? ' TypeScript files need Node 24.12 or later with erasable syntax only; otherwise compile them to .js.'
41
+ : '';
42
+ return `${file}: ${message}${hint}`;
43
+ }
44
+ /**
45
+ * Find and load the configuration from a file, or from the first `CONFIG_FILES` entry in a
46
+ * directory. `hosting` replaces the file's values (a build's `--base`), validated like them.
47
+ */
48
+ export async function loadWorkbenchConfig(target = '.', hosting) {
49
+ const out = new DiagnosticList();
50
+ const path = resolve(target);
51
+ let file = path;
52
+ if (existsSync(path) && statSync(path).isDirectory()) {
53
+ file = CONFIG_FILES.map((name) => join(path, name)).find((candidate) => existsSync(candidate));
54
+ if (!file) {
55
+ out.error('node.config.missing', `No Workbench configuration in ${path} (looked for ${CONFIG_FILES.join(', ')}).`);
56
+ return { file: undefined, root: path, config: undefined, diagnostics: out.items };
57
+ }
58
+ }
59
+ else if (!existsSync(path)) {
60
+ out.error('node.config.missing', `${path} does not exist.`);
61
+ return { file: undefined, root: dirname(path), config: undefined, diagnostics: out.items };
62
+ }
63
+ const root = dirname(file);
64
+ let raw;
65
+ try {
66
+ raw = await loadDefault(file);
67
+ }
68
+ catch (error) {
69
+ out.error('node.config.load', loadFailure(file, error));
70
+ return { file, root, config: undefined, diagnostics: out.items };
71
+ }
72
+ const { config, diagnostics } = resolveWorkbenchConfig(hosting && raw && typeof raw === 'object' && !Array.isArray(raw)
73
+ ? {
74
+ ...raw,
75
+ hosting: { ...raw.hosting, ...hosting },
76
+ }
77
+ : raw);
78
+ return { file, root, config, diagnostics: [...out.items, ...diagnostics] };
79
+ }
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/node/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { OddkinMetadataLike } from '../pages/types.js';
2
+ /** Registration entries by tag, from the documented libraries' metadata. */
3
+ export declare function registrationsByTag(libraries: readonly {
4
+ readonly metadata?: OddkinMetadataLike;
5
+ }[]): Map<string, string>;
6
+ /** The browser module for one example set's source file. */
7
+ export declare function exampleModule(file: string, registrations: ReadonlyMap<string, string>): Promise<string>;
8
+ //# sourceMappingURL=example-modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-modules.d.ts","sourceRoot":"","sources":["../../src/node/example-modules.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;CAAE,EAAE,GAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQrB;AAED,4DAA4D;AAC5D,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Example modules as preview frames load them (workbench.md §5.1): the `defineExamples` source
3
+ * with its types stripped, the registration of every element its fixtures name, and the
4
+ * template renderer the frame's `mount(content)` uses, so templates and renderer share one copy.
5
+ */
6
+ import { readFile } from 'node:fs/promises';
7
+ import { stripTypeScriptTypes } from 'node:module';
8
+ /** Registration entries by tag, from the documented libraries' metadata. */
9
+ export function registrationsByTag(libraries) {
10
+ const out = new Map();
11
+ for (const library of libraries)
12
+ for (const entry of Object.values(library.metadata?.components ?? {})) {
13
+ const registration = entry.registration;
14
+ if (typeof registration === 'string' && !out.has(entry.tag))
15
+ out.set(entry.tag, registration);
16
+ }
17
+ return out;
18
+ }
19
+ /** The browser module for one example set's source file. */
20
+ export async function exampleModule(file, registrations) {
21
+ const source = await readFile(file, 'utf8');
22
+ const code = /\.m?ts$/.test(file) ? stripTypeScriptTypes(source, { mode: 'strip' }) : source;
23
+ const imports = [...registrations]
24
+ .filter(([tag]) => new RegExp(`(?<![\\w-])${tag}(?![\\w-])`).test(code))
25
+ .map(([, registration]) => `import ${JSON.stringify(registration)};\n`);
26
+ return `${imports.join('')}${code}\nexport { render as oddkinFrameRender } from '@oddkin/core/template';\n`;
27
+ }
28
+ //# sourceMappingURL=example-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-modules.js","sourceRoot":"","sources":["../../src/node/example-modules.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAChC,SAAgE;IAEhE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,SAAS;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACtE,MAAM,YAAY,GAAI,KAAoC,CAAC,YAAY,CAAC;YACxE,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAChG,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,aAA0C;IAE1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7F,MAAM,OAAO,GAAG,CAAC,GAAG,aAAa,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvE,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,0EAA0E,CAAC;AAC9G,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const MARKER = "oddkin-generated.json";
2
+ export declare const MARKER_CONTENT: string;
3
+ /** Text to write, or a file whose bytes are copied. */
4
+ export type GeneratedContent = string | {
5
+ readonly source: string;
6
+ };
7
+ export declare class GeneratedDirectoryError extends Error {
8
+ readonly code: 'node.generated.unmarked' | 'node.generated.path';
9
+ constructor(code: 'node.generated.unmarked' | 'node.generated.path', message: string);
10
+ }
11
+ /**
12
+ * Make `dir` hold exactly `files` (relative POSIX path → text, or a file to copy) plus the
13
+ * marker. Returns the paths written (new or changed) and removed.
14
+ */
15
+ export declare function writeGenerated(dir: string, files: ReadonlyMap<string, GeneratedContent>): Promise<{
16
+ written: string[];
17
+ removed: string[];
18
+ }>;
19
+ //# sourceMappingURL=generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../src/node/generated.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,eAAO,MAAM,cAAc,QAOtB,CAAC;AAEN,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,qBAAa,uBAAwB,SAAQ,KAAK;IAE9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,GAAG,qBAAqB;IADlE,YACW,IAAI,EAAE,yBAAyB,GAAG,qBAAqB,EAChE,OAAO,EAAE,MAAM,EAIhB;CACF;AAiDD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC3C,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqCnD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Generated directories (workbench.md §2.1). Workbench writes and deletes only inside a directory
3
+ * that carries its marker file. It refuses an existing directory without one, rewrites only files
4
+ * whose content changed, and removes files a run no longer produces. Symbolic links are removed
5
+ * as links, never followed.
6
+ */
7
+ import { existsSync } from 'node:fs';
8
+ import { copyFile, lstat, mkdir, readdir, readFile, rm, rmdir, writeFile } from 'node:fs/promises';
9
+ import { dirname, join } from 'node:path';
10
+ export const MARKER = 'oddkin-generated.json';
11
+ export const MARKER_CONTENT = `${JSON.stringify({
12
+ generator: '@oddkin/workbench',
13
+ note: 'Generated by oddkin workbench. Every run replaces or removes the files in this directory; authored files never live here.',
14
+ }, null, 2)}\n`;
15
+ export class GeneratedDirectoryError extends Error {
16
+ code;
17
+ constructor(code, message) {
18
+ super(message);
19
+ this.code = code;
20
+ this.name = 'GeneratedDirectoryError';
21
+ }
22
+ }
23
+ /** Relative POSIX paths only: no empty, `.`, or `..` segments, drive letters, or backslashes. */
24
+ function checkPath(path) {
25
+ const segments = path.split('/');
26
+ const bad = segments.some((segment) => segment === '' || segment === '.' || segment === '..' || /[\\:\0]/.test(segment));
27
+ if (bad || path === MARKER)
28
+ throw new GeneratedDirectoryError('node.generated.path', `"${path}" is not a relative path inside the generated directory.`);
29
+ }
30
+ async function writeIfChanged(file, content) {
31
+ let existing;
32
+ try {
33
+ existing = await readFile(file);
34
+ }
35
+ catch {
36
+ // Missing: written below.
37
+ }
38
+ if (typeof content === 'string') {
39
+ if (existing?.toString('utf8') === content)
40
+ return false;
41
+ await mkdir(dirname(file), { recursive: true });
42
+ await writeFile(file, content);
43
+ return true;
44
+ }
45
+ if (existing && existing.equals(await readFile(content.source)))
46
+ return false;
47
+ await mkdir(dirname(file), { recursive: true });
48
+ await copyFile(content.source, file);
49
+ return true;
50
+ }
51
+ /** Files under `dir` (links included, not followed) as POSIX paths, and directories bottom-up. */
52
+ async function walk(dir, prefix = '') {
53
+ const files = [];
54
+ const dirs = [];
55
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
56
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
57
+ if (entry.isDirectory() && !entry.isSymbolicLink()) {
58
+ const inner = await walk(join(dir, entry.name), rel);
59
+ files.push(...inner.files);
60
+ dirs.push(...inner.dirs, rel);
61
+ }
62
+ else
63
+ files.push(rel);
64
+ }
65
+ return { files, dirs };
66
+ }
67
+ /**
68
+ * Make `dir` hold exactly `files` (relative POSIX path → text, or a file to copy) plus the
69
+ * marker. Returns the paths written (new or changed) and removed.
70
+ */
71
+ export async function writeGenerated(dir, files) {
72
+ for (const path of files.keys())
73
+ checkPath(path);
74
+ if (existsSync(dir)) {
75
+ const stat = await lstat(dir);
76
+ const entries = stat.isDirectory() && !stat.isSymbolicLink() ? await readdir(dir) : undefined;
77
+ if (!entries || (entries.length > 0 && !entries.includes(MARKER)))
78
+ throw new GeneratedDirectoryError('node.generated.unmarked', `${dir} exists and was not generated by Workbench (it has no ${MARKER}), so it is left untouched. Remove it or choose another directory.`);
79
+ }
80
+ await mkdir(dir, { recursive: true });
81
+ await writeIfChanged(join(dir, MARKER), MARKER_CONTENT);
82
+ // Files are independent: a few at a time, so a static build's thousands of copies overlap.
83
+ const entries = [...files];
84
+ const changed = new Array(entries.length).fill(false);
85
+ let next = 0;
86
+ const worker = async () => {
87
+ for (let i = next++; i < entries.length; i = next++) {
88
+ const [path, content] = entries[i];
89
+ changed[i] = await writeIfChanged(join(dir, ...path.split('/')), content);
90
+ }
91
+ };
92
+ await Promise.all(Array.from({ length: Math.min(16, entries.length) }, worker));
93
+ const written = entries.flatMap(([path], i) => (changed[i] ? [path] : []));
94
+ const removed = [];
95
+ const existing = await walk(dir);
96
+ for (const path of existing.files) {
97
+ if (path === MARKER || files.has(path))
98
+ continue;
99
+ await rm(join(dir, ...path.split('/')), { force: true });
100
+ removed.push(path);
101
+ }
102
+ for (const path of existing.dirs) {
103
+ const full = join(dir, ...path.split('/'));
104
+ if ((await readdir(full)).length === 0)
105
+ await rmdir(full);
106
+ }
107
+ return { written, removed };
108
+ }
109
+ //# sourceMappingURL=generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/node/generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,MAAM,GAAG,uBAAuB,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,SAAS,CAC7C;IACE,SAAS,EAAE,mBAAmB;IAC9B,IAAI,EAAE,2HAA2H;CAClI,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CAAC;AAKN,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAErC,IAAI;IADf,YACW,IAAuD,EAChE,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;oBAHN,IAAI;QAIb,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,iGAAiG;AACjG,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CACvB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAC9F,CAAC;IACF,IAAI,GAAG,IAAI,IAAI,KAAK,MAAM;QACxB,MAAM,IAAI,uBAAuB,CAC/B,qBAAqB,EACrB,IAAI,IAAI,0DAA0D,CACnE,CAAC;AACN,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,OAAyB;IACnE,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACzD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kGAAkG;AAClG,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5D,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;;YAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,KAA4C;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,IAAI,uBAAuB,CAC/B,yBAAyB,EACzB,GAAG,GAAG,yDAAyD,MAAM,oEAAoE,CAC1I,CAAC;IACN,CAAC;IACD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;IACxD,2FAA2F;IAC3F,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAU,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAA+B,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACjD,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** HTML documents the Workbench serves and writes: the shell page. */
2
+ import type { ImportMap } from '../data/import-map.js';
3
+ /** JSON for an inline script: `<` is escaped so no string inside can close the element. */
4
+ export declare const inlineJson: (value: unknown) => string;
5
+ export interface ShellDocument {
6
+ readonly title: string;
7
+ readonly lang?: string;
8
+ readonly importMap: ImportMap;
9
+ /** Stylesheet URLs, in order. */
10
+ readonly stylesheets: readonly string[];
11
+ /** URL of the Workbench index. */
12
+ readonly index: string;
13
+ /** URL of the live-update event stream (dev only). */
14
+ readonly events?: string;
15
+ /** The shell's module (a bare specifier resolved by the import map). */
16
+ readonly module: string;
17
+ /** URLs of the module's static graph, fetched in parallel (`modulepreload`). */
18
+ readonly preload?: readonly string[];
19
+ }
20
+ export interface FrameDocument {
21
+ readonly title: string;
22
+ readonly importMap: ImportMap;
23
+ readonly module: string;
24
+ /** Stylesheet URLs loaded into every preview frame, in order. */
25
+ readonly stylesheets?: readonly string[];
26
+ /** Font URLs preloaded in every preview frame. */
27
+ readonly fonts?: readonly string[];
28
+ /** URLs of the frame runtime's static module graph, fetched in parallel (`modulepreload`). */
29
+ readonly preload?: readonly string[];
30
+ }
31
+ /** The shell page: an import map, stylesheets, and `<oddkin-workbench>` pointed at the index. */
32
+ export declare function shellHtml(doc: ShellDocument): string;
33
+ /** One frame document owns its module map, registry, document styles, and preview container. */
34
+ export declare function frameHtml(doc: FrameDocument): string;
35
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/node/html.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKvD,2FAA2F;AAC3F,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,MACI,CAAC;AAMjD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAmBpD;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAyBpD"}
@@ -0,0 +1,51 @@
1
+ const escapeHtml = (text) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
2
+ /** JSON for an inline script: `<` is escaped so no string inside can close the element. */
3
+ export const inlineJson = (value) => JSON.stringify(value).replace(/</g, '\\u003c');
4
+ /** After the import map: a module fetch before it would stop the map from applying. */
5
+ const modulePreloads = (urls = []) => urls.map((href) => ` <link rel="modulepreload" href="${escapeHtml(href)}" />\n`).join('');
6
+ /** The shell page: an import map, stylesheets, and `<oddkin-workbench>` pointed at the index. */
7
+ export function shellHtml(doc) {
8
+ const links = doc.stylesheets
9
+ .map((href) => ` <link rel="stylesheet" href="${escapeHtml(href)}" />\n`)
10
+ .join('');
11
+ const events = doc.events ? ` events="${escapeHtml(doc.events)}"` : '';
12
+ return `<!doctype html>
13
+ <html lang="${escapeHtml(doc.lang ?? 'en')}">
14
+ <head>
15
+ <meta charset="utf-8" />
16
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
17
+ <title>${escapeHtml(doc.title)}</title>
18
+ <script type="importmap">${inlineJson(doc.importMap)}</script>
19
+ ${modulePreloads(doc.preload)}${links} <script type="module">import ${inlineJson(doc.module)};</script>
20
+ </head>
21
+ <body>
22
+ <oddkin-workbench index="${escapeHtml(doc.index)}"${events}></oddkin-workbench>
23
+ </body>
24
+ </html>
25
+ `;
26
+ }
27
+ /** One frame document owns its module map, registry, document styles, and preview container. */
28
+ export function frameHtml(doc) {
29
+ const fonts = (doc.fonts ?? [])
30
+ .map((href) => ` <link rel="preload" as="font" href="${escapeHtml(href)}" crossorigin="anonymous" />\n`)
31
+ .join('');
32
+ const links = (doc.stylesheets ?? [])
33
+ .map((href) => ` <link rel="stylesheet" href="${escapeHtml(href)}" />\n`)
34
+ .join('');
35
+ return `<!doctype html>
36
+ <html lang="en">
37
+ <head>
38
+ <meta charset="utf-8" />
39
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
40
+ <title>${escapeHtml(doc.title)}</title>
41
+ ${fonts}${links} <style>html,body{margin:0;min-block-size:100%;}body{container:preview-frame / inline-size;background:var(--odd-color-canvas,Canvas);color:var(--odd-color-text-primary,CanvasText);}[data-oddkin-preview]{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;min-block-size:100vh;margin-inline:auto;background:var(--odd-color-surface-specimen,transparent);container:preview / inline-size;}[data-oddkin-preview]:has(>[data-oddkin-specimen]){display:block;background:none;}[data-oddkin-specimen]{display:grid;gap:var(--odd-space-md,1rem);padding:var(--odd-space-md,1rem);}[data-oddkin-specimen] figure{margin:0;}[data-oddkin-specimen] figcaption{margin-block-end:var(--odd-space-xs,0.25rem);font:var(--odd-font-size-sm,0.875rem) var(--odd-font-family-sans,system-ui);color:var(--odd-color-text-secondary,GrayText);}</style>
42
+ <script type="importmap">${inlineJson(doc.importMap)}</script>
43
+ ${modulePreloads(doc.preload)} <script type="module">import ${inlineJson(doc.module)};</script>
44
+ </head>
45
+ <body>
46
+ <main data-oddkin-preview></main>
47
+ </body>
48
+ </html>
49
+ `;
50
+ }
51
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/node/html.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAClC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAElG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAU,EAAE,CACnD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEjD,uFAAuF;AACvF,MAAM,cAAc,GAAG,CAAC,IAAI,GAAsB,EAAE,EAAE,EAAE,CACtD,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uCAAuC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AA8B/F,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,GAAkB;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oCAAoC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3E,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO;cACK,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;;;;aAI7B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;+BACH,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;EACtD,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,oCAAoC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;;;+BAGhE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM;;;CAG7D,CAAC;AACF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,SAAS,CAAC,GAAkB;IAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;SAC5B,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,2CAA2C,UAAU,CAAC,IAAI,CAAC,gCAAgC,CAC9F;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;SAClC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oCAAoC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3E,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO;;;;;aAKI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;EAChC,KAAK,GAAG,KAAK;+BACgB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;EACtD,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,oCAAoC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;;;;;;CAMtF,CAAC;AACF,CAAC"}