@oddkin/workbench 0.0.0-stage → 1.0.0-beta.0

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -2
  3. package/dist/app/copy.d.ts +43 -0
  4. package/dist/app/copy.d.ts.map +1 -0
  5. package/dist/app/copy.js +47 -0
  6. package/dist/app/copy.js.map +1 -0
  7. package/dist/app/define.d.ts +3 -0
  8. package/dist/app/define.d.ts.map +1 -0
  9. package/dist/app/define.js +10 -0
  10. package/dist/app/define.js.map +1 -0
  11. package/dist/app/details.d.ts +22 -0
  12. package/dist/app/details.d.ts.map +1 -0
  13. package/dist/app/details.js +16 -0
  14. package/dist/app/details.js.map +1 -0
  15. package/dist/app/index.d.ts +12 -0
  16. package/dist/app/index.d.ts.map +1 -0
  17. package/dist/app/index.js +9 -0
  18. package/dist/app/index.js.map +1 -0
  19. package/dist/app/routes.d.ts +26 -0
  20. package/dist/app/routes.d.ts.map +1 -0
  21. package/dist/app/routes.js +94 -0
  22. package/dist/app/routes.js.map +1 -0
  23. package/dist/app/search.d.ts +17 -0
  24. package/dist/app/search.d.ts.map +1 -0
  25. package/dist/app/search.js +52 -0
  26. package/dist/app/search.js.map +1 -0
  27. package/dist/app/shell.d.ts +29 -0
  28. package/dist/app/shell.d.ts.map +1 -0
  29. package/dist/app/shell.js +435 -0
  30. package/dist/app/shell.js.map +1 -0
  31. package/dist/app/styles.d.ts +2 -0
  32. package/dist/app/styles.d.ts.map +1 -0
  33. package/dist/app/styles.js +373 -0
  34. package/dist/app/styles.js.map +1 -0
  35. package/dist/app/theme-studio.d.ts +12 -0
  36. package/dist/app/theme-studio.d.ts.map +1 -0
  37. package/dist/app/theme-studio.js +14 -0
  38. package/dist/app/theme-studio.js.map +1 -0
  39. package/dist/app/views.d.ts +34 -0
  40. package/dist/app/views.d.ts.map +1 -0
  41. package/dist/app/views.js +230 -0
  42. package/dist/app/views.js.map +1 -0
  43. package/dist/config/index.d.ts +170 -0
  44. package/dist/config/index.d.ts.map +1 -0
  45. package/dist/config/index.js +148 -0
  46. package/dist/config/index.js.map +1 -0
  47. package/dist/conformance/button.d.ts +2 -0
  48. package/dist/conformance/button.d.ts.map +1 -0
  49. package/dist/conformance/button.js +233 -0
  50. package/dist/conformance/button.js.map +1 -0
  51. package/dist/conformance/index.d.ts +107 -0
  52. package/dist/conformance/index.d.ts.map +1 -0
  53. package/dist/conformance/index.js +60 -0
  54. package/dist/conformance/index.js.map +1 -0
  55. package/dist/data/build.d.ts +36 -0
  56. package/dist/data/build.d.ts.map +1 -0
  57. package/dist/data/build.js +248 -0
  58. package/dist/data/build.js.map +1 -0
  59. package/dist/data/import-map.d.ts +53 -0
  60. package/dist/data/import-map.d.ts.map +1 -0
  61. package/dist/data/import-map.js +160 -0
  62. package/dist/data/import-map.js.map +1 -0
  63. package/dist/data/index.d.ts +14 -0
  64. package/dist/data/index.d.ts.map +1 -0
  65. package/dist/data/index.js +10 -0
  66. package/dist/data/index.js.map +1 -0
  67. package/dist/data/theme-studio.d.ts +21 -0
  68. package/dist/data/theme-studio.d.ts.map +1 -0
  69. package/dist/data/theme-studio.js +116 -0
  70. package/dist/data/theme-studio.js.map +1 -0
  71. package/dist/data/types.d.ts +169 -0
  72. package/dist/data/types.d.ts.map +1 -0
  73. package/dist/data/types.js +4 -0
  74. package/dist/data/types.js.map +1 -0
  75. package/dist/examples/index.d.ts +101 -0
  76. package/dist/examples/index.d.ts.map +1 -0
  77. package/dist/examples/index.js +106 -0
  78. package/dist/examples/index.js.map +1 -0
  79. package/dist/frame/index.d.ts +9 -0
  80. package/dist/frame/index.d.ts.map +1 -0
  81. package/dist/frame/index.js +468 -0
  82. package/dist/frame/index.js.map +1 -0
  83. package/dist/internal/diagnostics.d.ts +17 -0
  84. package/dist/internal/diagnostics.d.ts.map +1 -0
  85. package/dist/internal/diagnostics.js +19 -0
  86. package/dist/internal/diagnostics.js.map +1 -0
  87. package/dist/node/bin.d.ts +3 -0
  88. package/dist/node/bin.d.ts.map +1 -0
  89. package/dist/node/bin.js +12 -0
  90. package/dist/node/bin.js.map +1 -0
  91. package/dist/node/cli.d.ts +17 -0
  92. package/dist/node/cli.d.ts.map +1 -0
  93. package/dist/node/cli.js +198 -0
  94. package/dist/node/cli.js.map +1 -0
  95. package/dist/node/config.d.ts +28 -0
  96. package/dist/node/config.d.ts.map +1 -0
  97. package/dist/node/config.js +80 -0
  98. package/dist/node/config.js.map +1 -0
  99. package/dist/node/generated.d.ts +19 -0
  100. package/dist/node/generated.d.ts.map +1 -0
  101. package/dist/node/generated.js +109 -0
  102. package/dist/node/generated.js.map +1 -0
  103. package/dist/node/html.d.ts +35 -0
  104. package/dist/node/html.d.ts.map +1 -0
  105. package/dist/node/html.js +51 -0
  106. package/dist/node/html.js.map +1 -0
  107. package/dist/node/index.d.ts +24 -0
  108. package/dist/node/index.d.ts.map +1 -0
  109. package/dist/node/index.js +15 -0
  110. package/dist/node/index.js.map +1 -0
  111. package/dist/node/inputs.d.ts +24 -0
  112. package/dist/node/inputs.d.ts.map +1 -0
  113. package/dist/node/inputs.js +259 -0
  114. package/dist/node/inputs.js.map +1 -0
  115. package/dist/node/packages.d.ts +35 -0
  116. package/dist/node/packages.d.ts.map +1 -0
  117. package/dist/node/packages.js +87 -0
  118. package/dist/node/packages.js.map +1 -0
  119. package/dist/node/preload.d.ts +10 -0
  120. package/dist/node/preload.d.ts.map +1 -0
  121. package/dist/node/preload.js +61 -0
  122. package/dist/node/preload.js.map +1 -0
  123. package/dist/node/server.d.ts +42 -0
  124. package/dist/node/server.d.ts.map +1 -0
  125. package/dist/node/server.js +369 -0
  126. package/dist/node/server.js.map +1 -0
  127. package/dist/node/static.d.ts +33 -0
  128. package/dist/node/static.d.ts.map +1 -0
  129. package/dist/node/static.js +141 -0
  130. package/dist/node/static.js.map +1 -0
  131. package/dist/node/workbench.d.ts +43 -0
  132. package/dist/node/workbench.d.ts.map +1 -0
  133. package/dist/node/workbench.js +183 -0
  134. package/dist/node/workbench.js.map +1 -0
  135. package/dist/pages/build.d.ts +22 -0
  136. package/dist/pages/build.d.ts.map +1 -0
  137. package/dist/pages/build.js +363 -0
  138. package/dist/pages/build.js.map +1 -0
  139. package/dist/pages/defaults.d.ts +16 -0
  140. package/dist/pages/defaults.d.ts.map +1 -0
  141. package/dist/pages/defaults.js +88 -0
  142. package/dist/pages/defaults.js.map +1 -0
  143. package/dist/pages/index.d.ts +14 -0
  144. package/dist/pages/index.d.ts.map +1 -0
  145. package/dist/pages/index.js +10 -0
  146. package/dist/pages/index.js.map +1 -0
  147. package/dist/pages/navigation.d.ts +48 -0
  148. package/dist/pages/navigation.d.ts.map +1 -0
  149. package/dist/pages/navigation.js +83 -0
  150. package/dist/pages/navigation.js.map +1 -0
  151. package/dist/pages/types.d.ts +143 -0
  152. package/dist/pages/types.d.ts.map +1 -0
  153. package/dist/pages/types.js +3 -0
  154. package/dist/pages/types.js.map +1 -0
  155. package/dist/panels/catalog-define.d.ts +3 -0
  156. package/dist/panels/catalog-define.d.ts.map +1 -0
  157. package/dist/panels/catalog-define.js +7 -0
  158. package/dist/panels/catalog-define.js.map +1 -0
  159. package/dist/panels/catalog.d.ts +33 -0
  160. package/dist/panels/catalog.d.ts.map +1 -0
  161. package/dist/panels/catalog.js +54 -0
  162. package/dist/panels/catalog.js.map +1 -0
  163. package/dist/panels/component-define.d.ts +3 -0
  164. package/dist/panels/component-define.d.ts.map +1 -0
  165. package/dist/panels/component-define.js +6 -0
  166. package/dist/panels/component-define.js.map +1 -0
  167. package/dist/panels/component-detail.d.ts +46 -0
  168. package/dist/panels/component-detail.d.ts.map +1 -0
  169. package/dist/panels/component-detail.js +1120 -0
  170. package/dist/panels/component-detail.js.map +1 -0
  171. package/dist/panels/component.d.ts +17 -0
  172. package/dist/panels/component.d.ts.map +1 -0
  173. package/dist/panels/component.js +10 -0
  174. package/dist/panels/component.js.map +1 -0
  175. package/dist/panels/foundation-define.d.ts +3 -0
  176. package/dist/panels/foundation-define.d.ts.map +1 -0
  177. package/dist/panels/foundation-define.js +6 -0
  178. package/dist/panels/foundation-define.js.map +1 -0
  179. package/dist/panels/foundation-detail.d.ts +23 -0
  180. package/dist/panels/foundation-detail.d.ts.map +1 -0
  181. package/dist/panels/foundation-detail.js +216 -0
  182. package/dist/panels/foundation-detail.js.map +1 -0
  183. package/dist/panels/foundation.d.ts +15 -0
  184. package/dist/panels/foundation.d.ts.map +1 -0
  185. package/dist/panels/foundation.js +9 -0
  186. package/dist/panels/foundation.js.map +1 -0
  187. package/dist/panels/model.d.ts +173 -0
  188. package/dist/panels/model.d.ts.map +1 -0
  189. package/dist/panels/model.js +462 -0
  190. package/dist/panels/model.js.map +1 -0
  191. package/dist/panels/styles.d.ts +3 -0
  192. package/dist/panels/styles.d.ts.map +1 -0
  193. package/dist/panels/styles.js +316 -0
  194. package/dist/panels/styles.js.map +1 -0
  195. package/dist/panels/theme-model.d.ts +49 -0
  196. package/dist/panels/theme-model.d.ts.map +1 -0
  197. package/dist/panels/theme-model.js +146 -0
  198. package/dist/panels/theme-model.js.map +1 -0
  199. package/dist/panels/theme-studio.d.ts +32 -0
  200. package/dist/panels/theme-studio.d.ts.map +1 -0
  201. package/dist/panels/theme-studio.js +312 -0
  202. package/dist/panels/theme-studio.js.map +1 -0
  203. package/dist/preview/frame.d.ts +44 -0
  204. package/dist/preview/frame.d.ts.map +1 -0
  205. package/dist/preview/frame.js +250 -0
  206. package/dist/preview/frame.js.map +1 -0
  207. package/dist/preview/index.d.ts +26 -0
  208. package/dist/preview/index.d.ts.map +1 -0
  209. package/dist/preview/index.js +58 -0
  210. package/dist/preview/index.js.map +1 -0
  211. package/dist/preview/theme-generation.d.ts +33 -0
  212. package/dist/preview/theme-generation.d.ts.map +1 -0
  213. package/dist/preview/theme-generation.js +48 -0
  214. package/dist/preview/theme-generation.js.map +1 -0
  215. package/dist/protocol/index.d.ts +207 -0
  216. package/dist/protocol/index.d.ts.map +1 -0
  217. package/dist/protocol/index.js +261 -0
  218. package/dist/protocol/index.js.map +1 -0
  219. package/dist/testing/index.d.ts +47 -0
  220. package/dist/testing/index.d.ts.map +1 -0
  221. package/dist/testing/index.js +145 -0
  222. package/dist/testing/index.js.map +1 -0
  223. package/package.json +118 -4
@@ -0,0 +1,369 @@
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 { 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
+ let pending = new Set();
190
+ let timer;
191
+ let running = Promise.resolve();
192
+ let closed = false;
193
+ const changed = (path) => {
194
+ if (closed)
195
+ return;
196
+ pending.add(path);
197
+ clearTimeout(timer);
198
+ timer = setTimeout(() => {
199
+ const paths = [...pending];
200
+ pending = new Set();
201
+ running = running
202
+ .then(() => update(paths))
203
+ .catch((error) => log(`error: rebuild failed: ${error instanceof Error ? error.message : String(error)}`));
204
+ }, 80);
205
+ };
206
+ function watchTargets(build) {
207
+ const targets = new Map();
208
+ const packages = build.inputs?.graph ?? [];
209
+ const ignored = new Set(['node_modules', '.oddkin', '.git']);
210
+ for (const pkg of packages)
211
+ targets.set(`r:${pkg.dir}`, (name) => !name.split(/[\\/]/).some((s) => ignored.has(s)));
212
+ const names = new Set([...CONFIG_FILES, ...DOCS_FILES]);
213
+ const files = [
214
+ ...(build.configFile ? [build.configFile] : []),
215
+ ...(build.inputs?.contentFiles ?? []),
216
+ ...(build.inputs?.dataFiles ?? []).filter((f) => !packages.some((p) => inside(f, p.dir))),
217
+ ];
218
+ for (const file of files)
219
+ names.add(basename(file));
220
+ for (const dir of new Set([build.root, ...files.map((file) => dirname(file))]))
221
+ targets.set(`d:${dir}`, (name) => names.has(name));
222
+ return targets;
223
+ }
224
+ function rewatch(build) {
225
+ if (options.watch === false)
226
+ return;
227
+ const targets = watchTargets(build);
228
+ for (const [key, watcher] of watchers)
229
+ if (!targets.has(key)) {
230
+ watcher.close();
231
+ watchers.delete(key);
232
+ }
233
+ for (const [key, accept] of targets) {
234
+ if (watchers.has(key))
235
+ continue;
236
+ const dir = key.slice(2);
237
+ try {
238
+ const watcher = watch(dir, { recursive: key.startsWith('r:') }, (_event, name) => {
239
+ if (name && accept(String(name)))
240
+ changed(join(dir, String(name)));
241
+ });
242
+ watcher.on('error', (error) => {
243
+ log(`warning: stopped watching ${dir}: ${error.message}`);
244
+ watcher.close();
245
+ watchers.delete(key);
246
+ });
247
+ watchers.set(key, watcher);
248
+ }
249
+ catch (error) {
250
+ log(`warning: cannot watch ${dir}: ${error instanceof Error ? error.message : String(error)}`);
251
+ }
252
+ }
253
+ }
254
+ const broadcast = (event) => {
255
+ const text = `event: update\ndata: ${JSON.stringify(event)}\n\n`;
256
+ for (const client of clients)
257
+ client.write(text);
258
+ };
259
+ async function update(paths = []) {
260
+ const next = await buildWorkbench(buildOptions);
261
+ const dataFiles = new Set([
262
+ ...(next.inputs?.dataFiles ?? []),
263
+ ...(current.inputs?.dataFiles ?? []),
264
+ ]);
265
+ const modules = new Set();
266
+ for (const path of paths) {
267
+ if (dataFiles.has(path))
268
+ continue;
269
+ for (const pkg of current.inputs?.graph ?? [])
270
+ if (inside(path, pkg.dir))
271
+ modules.add(`${pkg.name}@${pkg.version}`);
272
+ }
273
+ let event;
274
+ if (!next.data ||
275
+ !next.config ||
276
+ next.config.hosting.basePath !== base ||
277
+ next.config.hosting.routing !== routing) {
278
+ const restart = next.config &&
279
+ (next.config.hosting.basePath !== base || next.config.hosting.routing !== routing)
280
+ ? [
281
+ {
282
+ code: 'node.dev.restart',
283
+ severity: 'error',
284
+ message: 'hosting.basePath or hosting.routing changed; restart the dev server to apply it.',
285
+ },
286
+ ]
287
+ : [];
288
+ event = {
289
+ ok: false,
290
+ index: false,
291
+ pages: [],
292
+ modules: [...modules],
293
+ shell: false,
294
+ diagnostics: [...restart, ...next.diagnostics],
295
+ };
296
+ }
297
+ else {
298
+ const pages = new Set();
299
+ const before = current.data?.index.pages ?? {};
300
+ const after = next.data.index.pages;
301
+ for (const id of new Set([...Object.keys(before), ...Object.keys(after)])) {
302
+ const file = after[id] ?? before[id];
303
+ if (file && current.files.get(file) !== next.files.get(file))
304
+ pages.add(id);
305
+ }
306
+ try {
307
+ await writeGenerated(join(next.root, ...OUTPUT), next.files);
308
+ }
309
+ catch (error) {
310
+ log(`error: ${error instanceof Error ? error.message : String(error)}`);
311
+ }
312
+ event = {
313
+ ok: true,
314
+ index: current.files.get('index.json') !== next.files.get('index.json'),
315
+ pages: [...pages],
316
+ modules: [...modules],
317
+ shell: current.shell !== next.shell,
318
+ diagnostics: next.diagnostics,
319
+ };
320
+ current = next;
321
+ rewatch(current);
322
+ }
323
+ if (!closed)
324
+ broadcast(event);
325
+ const what = event.ok
326
+ ? [
327
+ event.index && 'index',
328
+ event.pages.length && `${event.pages.length} page(s)`,
329
+ event.modules.length && `modules of ${event.modules.join(', ')}`,
330
+ event.shell && 'shell',
331
+ ]
332
+ .filter(Boolean)
333
+ .join(', ') || 'nothing changed'
334
+ : `kept the last valid data (${event.diagnostics.filter((d) => d.severity === 'error').length} error(s))`;
335
+ log(`update: ${what}`);
336
+ for (const d of event.diagnostics)
337
+ if (d.severity === 'error')
338
+ log(formatDiagnostic(d));
339
+ return event;
340
+ }
341
+ rewatch(current);
342
+ return {
343
+ url,
344
+ get build() {
345
+ return current;
346
+ },
347
+ rebuild(paths = []) {
348
+ const result = running.then(() => update(paths));
349
+ running = result.catch(() => undefined);
350
+ return result;
351
+ },
352
+ async close() {
353
+ closed = true;
354
+ clearTimeout(timer);
355
+ for (const watcher of watchers.values())
356
+ watcher.close();
357
+ watchers.clear();
358
+ await running.catch(() => { });
359
+ for (const client of clients)
360
+ client.end();
361
+ clients.clear();
362
+ await Promise.all(servers.map((server) => new Promise((resolve) => {
363
+ server.close(() => resolve());
364
+ server.closeAllConnections();
365
+ })));
366
+ },
367
+ };
368
+ }
369
+ //# 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,33 @@
1
+ import type { Routing } from '../config/index.js';
2
+ import { type WorkbenchDiagnostic } from '../internal/diagnostics.js';
3
+ import { type WorkbenchBuild } from './workbench.js';
4
+ export interface StaticBuildOptions {
5
+ /** A configuration file or the directory holding it. Default: the working directory. */
6
+ readonly config?: string;
7
+ /** Output directory. Default: `.oddkin/workbench-build` in the project. */
8
+ readonly out?: string;
9
+ /** Replaces the configuration's `hosting` values for this build. */
10
+ readonly hosting?: {
11
+ readonly basePath?: string;
12
+ readonly routing?: Routing;
13
+ };
14
+ }
15
+ export interface StaticBuild {
16
+ readonly build: WorkbenchBuild;
17
+ /** The output directory; undefined when nothing was written. */
18
+ readonly out: string | undefined;
19
+ /** Relative paths of every file in the output, sorted. */
20
+ readonly files: readonly string[];
21
+ readonly written: readonly string[];
22
+ readonly removed: readonly string[];
23
+ readonly diagnostics: readonly WorkbenchDiagnostic[];
24
+ }
25
+ /** Every path the shell's router answers in history mode (app/routes.ts `shellRoutes`). */
26
+ export declare function shellPaths(build: WorkbenchBuild): string[];
27
+ /**
28
+ * Build the Workbench and write it as a static app. Writes nothing when the configuration or
29
+ * metadata has errors. The output directory carries the generated-directory marker, so a later
30
+ * build replaces it and an unmarked directory is refused (`GeneratedDirectoryError`).
31
+ */
32
+ export declare function buildStatic(options?: StaticBuildOptions): Promise<StaticBuild>;
33
+ //# 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;AAGtF,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,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDxF"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `oddkin workbench build`: the dev server's URL layout written as files for a static host
3
+ * (workbench.md §2.1, §10). The output directory maps to `hosting.basePath`: the shell at its
4
+ * root, data and the frame document under `_oddkin/`, and each package's published browser files
5
+ * under `_oddkin/m/<name>@<version>/`, copied as published. In history mode every page path, and
6
+ * every legacy path, gets a copy of the shell, so deep links and refreshes load on any static
7
+ * host; `404.html` is the shell too, for hosts that serve it for unknown paths. Legacy paths
8
+ * redirect in the app, which keeps their query (`/playground?component=…`). Hash mode writes
9
+ * the shell once. No Node or analyzer backend is needed to serve the result.
10
+ */
11
+ import { readdir } from 'node:fs/promises';
12
+ import { join } from 'node:path';
13
+ import { DiagnosticList } from '../internal/diagnostics.js';
14
+ import { writeGenerated } from './generated.js';
15
+ import { readPackage } from './packages.js';
16
+ import { ASSET_DIR, buildWorkbench } from './workbench.js';
17
+ /**
18
+ * Package files a browser loads. Type declarations, sources, and documents stay behind, and so
19
+ * do source maps: only developer tools read them, and they name sources packages do not publish.
20
+ */
21
+ const BROWSER_FILE = /\.(m?js|css|json|svg|png|jpe?g|gif|webp|avif|ico|woff2?|ttf|otf)$/i;
22
+ const GLOB = /[*?[\]{}!]/;
23
+ /** Regular files below `dir` as sorted POSIX paths; links, `node_modules`, and dot entries skipped. */
24
+ async function walk(dir, prefix = '') {
25
+ let entries;
26
+ try {
27
+ entries = await readdir(dir, { withFileTypes: true });
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ const files = [];
33
+ for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))) {
34
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
35
+ continue;
36
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
37
+ if (entry.isDirectory())
38
+ files.push(...(await walk(join(dir, entry.name), rel)));
39
+ else if (entry.isFile())
40
+ files.push(rel);
41
+ }
42
+ return files;
43
+ }
44
+ /**
45
+ * A package's published browser files: what its `files` field names (as npm packs it), or, for
46
+ * a package installed without one, everything in it.
47
+ */
48
+ async function publishedFiles(dir, manifest, name, out) {
49
+ const field = manifest.files;
50
+ const listed = Array.isArray(field)
51
+ ? field.filter((f) => typeof f === 'string')
52
+ : undefined;
53
+ let files;
54
+ if (!listed || listed.some((entry) => GLOB.test(entry))) {
55
+ if (listed)
56
+ out.warn('node.build.filesPattern', `${name}: "files" uses patterns; every file in the package is considered.`, `/packages/${name}/files`);
57
+ files = await walk(dir);
58
+ }
59
+ else {
60
+ const all = await walk(dir);
61
+ const roots = listed.map((entry) => entry.replace(/^\.\//, '').replace(/\/+$/, ''));
62
+ files = all.filter((file) => file === 'package.json' ||
63
+ roots.some((root) => file === root || file.startsWith(`${root}/`)));
64
+ }
65
+ return files.filter((file) => BROWSER_FILE.test(file));
66
+ }
67
+ /** Every path the shell's router answers in history mode (app/routes.ts `shellRoutes`). */
68
+ export function shellPaths(build) {
69
+ const registry = build.data?.index.registry;
70
+ if (!registry)
71
+ return [];
72
+ const paths = new Set();
73
+ for (const page of registry.pages) {
74
+ if (!page.visible)
75
+ continue;
76
+ paths.add(page.route);
77
+ for (const legacy of page.legacyRoutes ?? [])
78
+ paths.add(legacy);
79
+ }
80
+ if (!registry.pages.some((p) => p.id === 'products' && p.visible))
81
+ paths.add('/foundations/products');
82
+ return [...paths]
83
+ .map((path) => path.split('/').filter(Boolean).join('/'))
84
+ .filter(Boolean)
85
+ .sort();
86
+ }
87
+ /**
88
+ * Build the Workbench and write it as a static app. Writes nothing when the configuration or
89
+ * metadata has errors. The output directory carries the generated-directory marker, so a later
90
+ * build replaces it and an unmarked directory is refused (`GeneratedDirectoryError`).
91
+ */
92
+ export async function buildStatic(options = {}) {
93
+ const build = await buildWorkbench({
94
+ ...(options.config ? { config: options.config } : {}),
95
+ ...(options.hosting ? { hosting: options.hosting } : {}),
96
+ });
97
+ const out = new DiagnosticList();
98
+ out.items.push(...build.diagnostics);
99
+ const nothing = { build, out: undefined, files: [], written: [], removed: [] };
100
+ if (!build.config || !build.data || !build.shell || out.items.some((d) => d.severity === 'error'))
101
+ return { ...nothing, diagnostics: out.items };
102
+ const base = build.config.hosting.basePath;
103
+ const files = new Map();
104
+ files.set('index.html', build.shell);
105
+ if (build.config.hosting.routing === 'history') {
106
+ for (const path of shellPaths(build))
107
+ files.set(`${path}/index.html`, build.shell);
108
+ files.set('404.html', build.shell);
109
+ }
110
+ for (const [path, content] of build.files)
111
+ files.set(`${ASSET_DIR}${path}`, content);
112
+ const packages = [...build.packages].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
113
+ for (const [versioned, dir] of packages) {
114
+ const name = versioned.slice(0, versioned.lastIndexOf('@'));
115
+ for (const file of await publishedFiles(dir, readPackage(dir).manifest, name, out))
116
+ files.set(`${ASSET_DIR}m/${versioned}/${file}`, { source: join(dir, ...file.split('/')) });
117
+ }
118
+ // Every browser file each document's import map names is in the output.
119
+ const prefix = `${base}${ASSET_DIR}`;
120
+ for (const name of ['shell.importmap.json', 'frame.importmap.json']) {
121
+ const map = JSON.parse(build.files.get(name) ?? '{"imports":{}}');
122
+ for (const [specifier, url] of Object.entries(map.imports)) {
123
+ if (!url.startsWith(prefix) || !BROWSER_FILE.test(url))
124
+ continue;
125
+ if (!files.has(url.slice(base.length)))
126
+ out.warn('node.build.unpublished', `"${specifier}" maps to ${url}, which is not among its package's published files; importing it fails.`, `/${name}/imports/${specifier}`);
127
+ }
128
+ }
129
+ const target = options.out ?? join(build.root, '.oddkin', 'workbench-build');
130
+ const sorted = new Map([...files].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
131
+ const { written, removed } = await writeGenerated(target, sorted);
132
+ return {
133
+ build,
134
+ out: target,
135
+ files: [...sorted.keys()],
136
+ written,
137
+ removed,
138
+ diagnostics: out.items,
139
+ };
140
+ }
141
+ //# sourceMappingURL=static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/node/static.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { ResolvedWorkbenchConfig, Routing } from '../config/index.js';
2
+ import { type ImportMap } from '../data/import-map.js';
3
+ import type { WorkbenchData } from '../data/types.js';
4
+ import { type WorkbenchDiagnostic } from '../internal/diagnostics.js';
5
+ import { type WorkbenchInputs } from './inputs.js';
6
+ /** This package's root (two levels above `dist/node/` and `src/node/`). */
7
+ export declare const WORKBENCH_DIR: string;
8
+ /** Everything the Workbench serves besides the shell lives below `<base>_oddkin/`. */
9
+ export declare const ASSET_DIR = "_oddkin/";
10
+ export interface WorkbenchBuild {
11
+ readonly root: string;
12
+ readonly configFile: string | undefined;
13
+ readonly config: ResolvedWorkbenchConfig | undefined;
14
+ readonly data: WorkbenchData | undefined;
15
+ readonly inputs: WorkbenchInputs | undefined;
16
+ /** Generated files below `<base>_oddkin/` by relative path: index, page data, import maps. */
17
+ readonly files: ReadonlyMap<string, string>;
18
+ /** `name@version` → directory for every package the shell or a frame may load. */
19
+ readonly packages: ReadonlyMap<string, string>;
20
+ /** Import map of preview frames: the documented packages and their dependencies. */
21
+ readonly frameImportMap: ImportMap | undefined;
22
+ /** The shell page; undefined without a valid configuration. */
23
+ readonly shell: string | undefined;
24
+ readonly diagnostics: readonly WorkbenchDiagnostic[];
25
+ }
26
+ export interface BuildOptions {
27
+ /** A configuration file or the directory holding it. Default: the working directory. */
28
+ readonly config?: string;
29
+ /** Point the shell at the live-update stream (dev server). */
30
+ readonly events?: boolean;
31
+ /** Replaces the configuration's `hosting` values. */
32
+ readonly hosting?: {
33
+ readonly basePath?: string;
34
+ readonly routing?: Routing;
35
+ };
36
+ }
37
+ /** Theme Studio's generation worker, next to the data files. */
38
+ export declare const THEME_WORKER = "theme-studio.worker.js";
39
+ /** Build everything the Workbench serves or writes for one configuration. Never throws for bad input. */
40
+ export declare function buildWorkbench(options?: BuildOptions): Promise<WorkbenchBuild>;
41
+ /** A diagnostic as one line: `error code /path: message`. */
42
+ export declare function formatDiagnostic(d: WorkbenchDiagnostic): string;
43
+ //# sourceMappingURL=workbench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench.d.ts","sourceRoot":"","sources":["../../src/node/workbench.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAI/D,2EAA2E;AAC3E,eAAO,MAAM,aAAa,QAAoD,CAAC;AAG/E,sFAAsF;AACtF,eAAO,MAAM,SAAS,aAAa,CAAC;AAMpC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,oFAAoF;IACpF,QAAQ,CAAC,cAAc,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,qDAAqD;IACrD,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;AAID,gEAAgE;AAChE,eAAO,MAAM,YAAY,2BAA2B,CAAC;AAkFrD,yGAAyG;AACzG,wBAAsB,cAAc,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAkGxF;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAE/D"}