@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,24 @@
1
+ import { type DocsContent, type ResolvedWorkbenchConfig } from '../config/index.js';
2
+ import type { JsonObject, LibraryInput, TokenInspectionLike } from '../data/types.js';
3
+ import { DiagnosticList } from '../internal/diagnostics.js';
4
+ import { type InstalledPackage } from './packages.js';
5
+ export declare const DOCS_FILES: readonly ['oddkin.docs.ts', 'oddkin.docs.mts', 'oddkin.docs.js', 'oddkin.docs.mjs', 'oddkin.docs.json'];
6
+ export interface WorkbenchInputs {
7
+ readonly libraries: readonly LibraryInput[];
8
+ /** The documented packages and their runtime dependencies: what preview frames load. */
9
+ readonly graph: readonly InstalledPackage[];
10
+ readonly docs?: DocsContent;
11
+ readonly tokens?: TokenInspectionLike;
12
+ /** Theme Studio's baseline: `themeStudio.themeConfig` as its JSON model. */
13
+ readonly theme?: {
14
+ readonly config: JsonObject;
15
+ readonly source: string;
16
+ };
17
+ /** Files read as data; a change to one rebuilds the data. */
18
+ readonly dataFiles: readonly string[];
19
+ /** Authored content files that were read or attempted (watched with the configuration). */
20
+ readonly contentFiles: readonly string[];
21
+ }
22
+ /** Read every input of the Workbench data for the configuration at `root`. */
23
+ export declare function loadInputs(root: string, config: ResolvedWorkbenchConfig, out: DiagnosticList): Promise<WorkbenchInputs>;
24
+ //# sourceMappingURL=inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/node/inputs.ts"],"names":[],"mappings":"AAOA,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEjG,OAAO,KAAK,EAEV,UAAU,EACV,YAAY,EACZ,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAY,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAA6C,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjG,eAAO,MAAM,UAAU,YACrB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,CACV,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,2FAA2F;IAC3F,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAuJD,8EAA8E;AAC9E,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,uBAAuB,EAC/B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,eAAe,CAAC,CA2F1B"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Read what the Workbench documents: each library package's published CEM and enrichment, the
3
+ * token inspection its foundations reference, and authored content (`oddkin.docs.*`).
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { extname, isAbsolute, join, relative, resolve } from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+ import { DOCS_SCHEMA } from '../config/index.js';
9
+ import { resolveExport } from '../data/import-map.js';
10
+ import { toExamplesJSON } from '../examples/index.js';
11
+ import { DiagnosticList, isObject } from '../internal/diagnostics.js';
12
+ import { loadDefault, loadFailure } from './config.js';
13
+ import { findPackageDir, packageGraph, readPackage } from './packages.js';
14
+ export const DOCS_FILES = [
15
+ 'oddkin.docs.ts',
16
+ 'oddkin.docs.mts',
17
+ 'oddkin.docs.js',
18
+ 'oddkin.docs.mjs',
19
+ 'oddkin.docs.json',
20
+ ];
21
+ const inside = (file, dir) => {
22
+ const rel = relative(dir, file);
23
+ return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);
24
+ };
25
+ function readJson(file, out, code) {
26
+ try {
27
+ return JSON.parse(readFileSync(file, 'utf8'));
28
+ }
29
+ catch (error) {
30
+ out.error(code, `${file}: ${error instanceof Error ? error.message : String(error)}`);
31
+ return undefined;
32
+ }
33
+ }
34
+ /** The token inspections the libraries' foundations reference, in order. */
35
+ function inspectionSources(libraries) {
36
+ const found = new Map();
37
+ for (const library of libraries) {
38
+ for (const foundation of Object.values(library.metadata?.foundations ?? {})) {
39
+ const generation = foundation
40
+ .generation;
41
+ const source = generation?.value?.source;
42
+ if (!isObject(source))
43
+ continue;
44
+ const { package: name, export: subpath } = source;
45
+ if (typeof name === 'string' && typeof subpath === 'string')
46
+ found.set(`${name}#${subpath}`, { package: name, export: subpath });
47
+ }
48
+ }
49
+ return [...found.values()];
50
+ }
51
+ async function loadContent(root, config, out) {
52
+ const files = config.content.files
53
+ ? config.content.files.map((file) => resolve(root, file))
54
+ : DOCS_FILES.map((name) => join(root, name))
55
+ .filter((file) => existsSync(file))
56
+ .slice(0, 1);
57
+ const pages = {};
58
+ const aliases = {};
59
+ let locale;
60
+ const loaded = [];
61
+ for (const file of files) {
62
+ if (!existsSync(file)) {
63
+ out.error('node.content.missing', `Content file ${file} does not exist.`, '/content/files');
64
+ continue;
65
+ }
66
+ if (extname(file) === '.md') {
67
+ out.warn('node.content.unsupported', `${file}: Markdown content is not read yet; use oddkin.docs.ts or JSON.`, '/content/files');
68
+ continue;
69
+ }
70
+ let value;
71
+ try {
72
+ value = await loadDefault(file);
73
+ }
74
+ catch (error) {
75
+ out.error('node.content.load', loadFailure(file, error), '/content/files');
76
+ continue;
77
+ }
78
+ if (!isObject(value) || !isObject(value['pages'])) {
79
+ out.error('node.content.invalid', `${file}: authored content must be an object with "pages" (use defineDocs).`, '/content/files');
80
+ continue;
81
+ }
82
+ loaded.push(file);
83
+ const content = value;
84
+ for (const [id, page] of Object.entries(content.pages)) {
85
+ if (id in pages)
86
+ out.warn('node.content.duplicate', `${file} describes page "${id}" again; the first file's content is kept.`, `/pages/${id}`);
87
+ else
88
+ pages[id] = page;
89
+ }
90
+ for (const [from, to] of Object.entries(content.aliases ?? {}))
91
+ aliases[from] ??= to;
92
+ locale ??= content.locale;
93
+ }
94
+ if (loaded.length === 0)
95
+ return { files };
96
+ return {
97
+ docs: {
98
+ schema: DOCS_SCHEMA,
99
+ ...(locale ? { locale } : {}),
100
+ ...(Object.keys(aliases).length ? { aliases } : {}),
101
+ pages,
102
+ },
103
+ files,
104
+ };
105
+ }
106
+ /**
107
+ * The example sets (`defineExamples` modules) the metadata names, as data. Example modules are
108
+ * trusted project code; a package that does not ship them (a published build without sources)
109
+ * keeps its examples listed without values.
110
+ */
111
+ async function loadExampleSets(dir, metadata, out, dataFiles) {
112
+ const files = new Set();
113
+ for (const example of Object.values(metadata?.examples ?? {})) {
114
+ const file = example.file;
115
+ if (typeof file === 'string' && file)
116
+ files.add(file);
117
+ }
118
+ const sets = [];
119
+ for (const file of files) {
120
+ const path = resolve(dir, file);
121
+ if (!inside(path, dir) || !existsSync(path))
122
+ continue;
123
+ dataFiles.push(path);
124
+ let value;
125
+ try {
126
+ value = await loadDefault(path);
127
+ }
128
+ catch (error) {
129
+ out.warn('node.examples.load', loadFailure(path, error), '/examples');
130
+ continue;
131
+ }
132
+ if (!isObject(value) ||
133
+ typeof value['component'] !== 'string' ||
134
+ !isObject(value['examples'])) {
135
+ out.warn('node.examples.invalid', `${path}: the default export is not an example set (use defineExamples).`, '/examples');
136
+ continue;
137
+ }
138
+ sets.push(toExamplesJSON(value));
139
+ }
140
+ return sets;
141
+ }
142
+ /** Read every input of the Workbench data for the configuration at `root`. */
143
+ export async function loadInputs(root, config, out) {
144
+ const graph = packageGraph(config.library.packages, root, out);
145
+ const byName = new Map();
146
+ for (const pkg of graph)
147
+ if (!byName.has(pkg.name))
148
+ byName.set(pkg.name, pkg);
149
+ const explicitCem = (config.library.cem ?? []).map((file) => resolve(root, file));
150
+ const dataFiles = [];
151
+ const libraries = [];
152
+ for (const name of config.library.packages) {
153
+ const pkg = byName.get(name);
154
+ if (!pkg)
155
+ continue;
156
+ const declared = pkg.manifest.customElements;
157
+ const cemFile = declared
158
+ ? join(pkg.dir, declared)
159
+ : explicitCem.find((file) => inside(file, pkg.dir));
160
+ let cem;
161
+ if (cemFile && existsSync(cemFile)) {
162
+ cem = readJson(cemFile, out, 'node.cem.invalid');
163
+ dataFiles.push(cemFile);
164
+ }
165
+ else {
166
+ out.warn('node.cem.missing', cemFile
167
+ ? `${name}: its Custom Elements Manifest ${cemFile} does not exist; build the package first.`
168
+ : `${name} declares no Custom Elements Manifest; add "customElements" to its package.json or list the file in library.cem.`, `/library/packages/${name}`);
169
+ }
170
+ const metadataPath = resolveExport(pkg.manifest, './oddkin.metadata.json');
171
+ const metadataFile = metadataPath ? join(pkg.dir, metadataPath) : undefined;
172
+ let metadata;
173
+ if (metadataFile && existsSync(metadataFile)) {
174
+ metadata = readJson(metadataFile, out, 'node.metadata.invalid');
175
+ dataFiles.push(metadataFile);
176
+ }
177
+ const examples = await loadExampleSets(pkg.dir, metadata, out, dataFiles);
178
+ libraries.push({
179
+ name,
180
+ version: pkg.version,
181
+ ...(cem ? { cem } : {}),
182
+ ...(metadata ? { metadata } : {}),
183
+ ...(examples.length ? { examples } : {}),
184
+ });
185
+ }
186
+ for (const file of explicitCem) {
187
+ if (!graph.some((pkg) => inside(file, pkg.dir)))
188
+ out.warn('node.cem.unattributed', `library.cem lists ${file}, which is not inside any documented package; it is ignored.`, '/library/cem');
189
+ }
190
+ let tokens;
191
+ const sources = inspectionSources(libraries);
192
+ if (sources.length > 1) {
193
+ out.warn('node.tokens.sources', `Foundations reference ${sources.length} token inspections; ${sources[0]?.package}${(sources[0]?.export ?? '').slice(1)} is used.`, '/foundations');
194
+ }
195
+ const source = sources[0];
196
+ if (source) {
197
+ const dir = byName.get(source.package)?.dir ?? findPackageDir(source.package, root);
198
+ const path = dir ? resolveExport(readPackage(dir).manifest, source.export) : undefined;
199
+ const file = dir && path ? join(dir, path) : undefined;
200
+ if (file && existsSync(file)) {
201
+ const value = readJson(file, out, 'node.tokens.invalid');
202
+ if (isObject(value) && Array.isArray(value['tokens']))
203
+ tokens = value;
204
+ dataFiles.push(file);
205
+ }
206
+ else {
207
+ out.warn('node.tokens.missing', `The token inspection ${source.package}${source.export.slice(1)} that the foundations reference was not found.`, '/foundations');
208
+ }
209
+ }
210
+ const theme = await loadThemeConfig(root, config, graph, out, dataFiles);
211
+ const content = await loadContent(root, config, out);
212
+ return {
213
+ ...(theme ? { theme } : {}),
214
+ libraries,
215
+ graph,
216
+ ...(content.docs ? { docs: content.docs } : {}),
217
+ ...(tokens ? { tokens } : {}),
218
+ dataFiles,
219
+ contentFiles: content.files,
220
+ };
221
+ }
222
+ /**
223
+ * `themeStudio.themeConfig` as the JSON-compatible model, loaded with the project's own
224
+ * `@oddkin/tokens/node` `loadConfig()` (theming-and-styling.md ?9): the CLI and Theme Studio
225
+ * start from the same model. JS and TS configurations are trusted project code.
226
+ */
227
+ async function loadThemeConfig(root, config, graph, out, dataFiles) {
228
+ const source = config.themeStudio.themeConfig;
229
+ if (!source)
230
+ return undefined;
231
+ const file = resolve(root, source);
232
+ const path = '/themeStudio/themeConfig';
233
+ if (!existsSync(file)) {
234
+ out.warn('node.themeStudio.config', `themeStudio.themeConfig: ${file} does not exist.`, path);
235
+ return undefined;
236
+ }
237
+ dataFiles.push(file);
238
+ const dir = graph.find((pkg) => pkg.name === '@oddkin/tokens')?.dir ??
239
+ findPackageDir('@oddkin/tokens', root);
240
+ const entry = dir ? resolveExport(readPackage(dir).manifest, './node') : undefined;
241
+ if (!dir || !entry) {
242
+ out.warn('node.themeStudio.loader', 'themeStudio.themeConfig needs @oddkin/tokens (its ./node export) installed to load the configuration.', path);
243
+ return undefined;
244
+ }
245
+ try {
246
+ const tokens = (await import(pathToFileURL(join(dir, entry)).href));
247
+ const result = await tokens.loadConfig(file);
248
+ for (const d of result.diagnostics)
249
+ out.warn('node.themeStudio.config', `${source}${d.path ?? ''}: ${d.message ?? ''}`, path);
250
+ if (!isObject(result.config))
251
+ return undefined;
252
+ return { config: result.config, source };
253
+ }
254
+ catch (error) {
255
+ out.warn('node.themeStudio.config', `themeStudio.themeConfig: ${error instanceof Error ? error.message : String(error)}`, path);
256
+ return undefined;
257
+ }
258
+ }
259
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/node/inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { PackageManifest } from '../data/import-map.js';
2
+ import { DiagnosticList } from '../internal/diagnostics.js';
3
+ export interface PackageJson extends PackageManifest {
4
+ readonly customElements?: string;
5
+ readonly dependencies?: Readonly<Record<string, string>>;
6
+ readonly peerDependencies?: Readonly<Record<string, string>>;
7
+ readonly peerDependenciesMeta?: Readonly<Record<string, {
8
+ readonly optional?: boolean;
9
+ }>>;
10
+ }
11
+ export interface InstalledPackage {
12
+ /** The name importers use (the `node_modules` path it was found under). */
13
+ readonly name: string;
14
+ readonly version: string;
15
+ /** Real path of the package root. */
16
+ readonly dir: string;
17
+ readonly manifest: PackageJson;
18
+ }
19
+ /** A package name that is safe to use as a path: `name` or `@scope/name`; no segment starts with a dot. */
20
+ export declare const isPackageName: (name: string) => boolean;
21
+ /** The real directory of package `name` as seen from `from`, or undefined. */
22
+ export declare function findPackageDir(name: string, from: string): string | undefined;
23
+ /** Read the package at `dir`; `name` is how importers refer to it. */
24
+ export declare function readPackage(dir: string, name?: string): InstalledPackage;
25
+ /**
26
+ * The packages reachable from `roots` (names looked up from `from`, or packages already read),
27
+ * breadth first in manifest order: each package's `dependencies`, then its other
28
+ * `peerDependencies`, looked up from that package's directory. A package installed twice
29
+ * appears twice; import maps keep the first copy and say so. Names in `skip` (Node-only
30
+ * dependencies of a browser document) are left out with their dependencies.
31
+ */
32
+ export declare function packageGraph(roots: readonly (string | InstalledPackage)[], from: string, out: DiagnosticList, options?: {
33
+ readonly skip?: readonly string[];
34
+ }): InstalledPackage[];
35
+ //# sourceMappingURL=packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../src/node/packages.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAID,2GAA2G;AAC3G,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,OAA0B,CAAC;AAExE,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS7E;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAQxE;AASD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,EAC7C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAClD,gBAAgB,EAAE,CAuDpB"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Package lookup as Node does it (`node_modules` directories up the tree), and the module graph
3
+ * a document needs: the packages it imports and, transitively, their runtime dependencies.
4
+ */
5
+ import { existsSync, readFileSync, realpathSync } from 'node:fs';
6
+ import { dirname, join } from 'node:path';
7
+ import { DiagnosticList } from '../internal/diagnostics.js';
8
+ const NAME = /^(?:@[a-z0-9][\w.~-]*\/)?[a-z0-9][\w.~-]*$/i;
9
+ /** A package name that is safe to use as a path: `name` or `@scope/name`; no segment starts with a dot. */
10
+ export const isPackageName = (name) => NAME.test(name);
11
+ /** The real directory of package `name` as seen from `from`, or undefined. */
12
+ export function findPackageDir(name, from) {
13
+ if (!isPackageName(name))
14
+ return undefined;
15
+ for (let dir = from;;) {
16
+ const candidate = join(dir, 'node_modules', ...name.split('/'));
17
+ if (existsSync(join(candidate, 'package.json')))
18
+ return realpathSync(candidate);
19
+ const parent = dirname(dir);
20
+ if (parent === dir)
21
+ return undefined;
22
+ dir = parent;
23
+ }
24
+ }
25
+ /** Read the package at `dir`; `name` is how importers refer to it. */
26
+ export function readPackage(dir, name) {
27
+ const manifest = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
28
+ return {
29
+ name: name ?? manifest.name ?? '',
30
+ version: manifest.version ?? '0.0.0',
31
+ dir: realpathSync(dir),
32
+ manifest,
33
+ };
34
+ }
35
+ /**
36
+ * The packages reachable from `roots` (names looked up from `from`, or packages already read),
37
+ * breadth first in manifest order: each package's `dependencies`, then its other
38
+ * `peerDependencies`, looked up from that package's directory. A package installed twice
39
+ * appears twice; import maps keep the first copy and say so. Names in `skip` (Node-only
40
+ * dependencies of a browser document) are left out with their dependencies.
41
+ */
42
+ export function packageGraph(roots, from, out, options = {}) {
43
+ const skip = new Set(options.skip ?? []);
44
+ const graph = [];
45
+ const seen = new Set();
46
+ const queue = roots.map((root) => typeof root === 'string' ? { name: root, from } : root);
47
+ const visit = (pkg) => {
48
+ if (seen.has(pkg.dir))
49
+ return;
50
+ seen.add(pkg.dir);
51
+ graph.push(pkg);
52
+ const dependencies = Object.keys(pkg.manifest.dependencies ?? {});
53
+ const peers = Object.keys(pkg.manifest.peerDependencies ?? {}).filter((peer) => !dependencies.includes(peer));
54
+ for (const name of dependencies)
55
+ queue.push({ name, from: pkg.dir, requiredBy: pkg.name });
56
+ for (const name of peers) {
57
+ const optional = pkg.manifest.peerDependenciesMeta?.[name]?.optional === true;
58
+ queue.push({ name, from: pkg.dir, requiredBy: pkg.name, optional });
59
+ }
60
+ };
61
+ for (let next = queue.shift(); next; next = queue.shift()) {
62
+ if ('dir' in next) {
63
+ visit(next);
64
+ continue;
65
+ }
66
+ if (skip.has(next.name))
67
+ continue;
68
+ const dir = findPackageDir(next.name, next.from);
69
+ if (!dir) {
70
+ if (next.optional)
71
+ continue;
72
+ if (next.requiredBy)
73
+ out.warn('node.package.missing', `${next.requiredBy} depends on ${next.name}, which is not installed; modules that import it fail to load.`, `/packages/${next.requiredBy}/dependencies/${next.name}`);
74
+ else
75
+ out.error('node.package.missing', `Package "${next.name}" is not installed (looked for node_modules/${next.name} from ${next.from} upwards).`, `/library/packages/${next.name}`);
76
+ continue;
77
+ }
78
+ try {
79
+ visit(readPackage(dir, next.name));
80
+ }
81
+ catch (error) {
82
+ out.error('node.package.unreadable', `${next.name}: package.json could not be read (${error instanceof Error ? error.message : String(error)}).`, `/packages/${next.name}`);
83
+ }
84
+ }
85
+ return graph;
86
+ }
87
+ //# sourceMappingURL=packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.js","sourceRoot":"","sources":["../../src/node/packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ImportMap } from '../data/import-map.js';
2
+ /** Resolve `specifier` from the module at URL path `referrer`, as the browser does with `map`. */
3
+ export declare function resolveModule(map: ImportMap, specifier: string, referrer: string): string | undefined;
4
+ /**
5
+ * Every module `entry` (a bare specifier) imports statically, transitively, entry first.
6
+ * `packages` maps each served package root URL (`…/m/name@version/`) to its directory;
7
+ * modules that are not on disk are left out (loading them reports the error).
8
+ */
9
+ export declare function preloadGraph(map: ImportMap, entry: string, packages: ReadonlyMap<string, string>): string[];
10
+ //# sourceMappingURL=preload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../../src/node/preload.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOvD,kGAAkG;AAClG,wBAAgB,aAAa,CAC3B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CASpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,EAAE,CAyBV"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * The static module graph of a document's entry module, as `modulepreload` URLs: the browser
3
+ * fetches every module at once instead of discovering them one import level at a time.
4
+ * Dynamic `import()` targets are left out; documents load them only when they need them.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ const ORIGIN = 'http://workbench.invalid';
9
+ /** `import … from '…'`, `import '…'`, and `export … from '…'` at the start of a statement. */
10
+ const STATIC_IMPORT = /(?:^|[;}])\s*(?:import|export)\s*(?:[\w$*{}\s,]*?\bfrom\s*)?(['"])([^'"\n]+)\1/gm;
11
+ /** Resolve `specifier` from the module at URL path `referrer`, as the browser does with `map`. */
12
+ export function resolveModule(map, specifier, referrer) {
13
+ if (/^\.{0,2}\//.test(specifier))
14
+ return new URL(specifier, `${ORIGIN}${referrer}`).pathname;
15
+ if (/^[a-z][a-z0-9+.-]*:/i.test(specifier))
16
+ return undefined;
17
+ const exact = map.imports[specifier];
18
+ if (exact)
19
+ return exact;
20
+ const prefix = Object.keys(map.imports)
21
+ .filter((key) => key.endsWith('/') && specifier.startsWith(key))
22
+ .sort((a, b) => b.length - a.length)[0];
23
+ return prefix ? `${map.imports[prefix]}${specifier.slice(prefix.length)}` : undefined;
24
+ }
25
+ /**
26
+ * Every module `entry` (a bare specifier) imports statically, transitively, entry first.
27
+ * `packages` maps each served package root URL (`…/m/name@version/`) to its directory;
28
+ * modules that are not on disk are left out (loading them reports the error).
29
+ */
30
+ export function preloadGraph(map, entry, packages) {
31
+ const roots = [...packages.keys()].sort((a, b) => b.length - a.length);
32
+ const read = (url) => {
33
+ const root = roots.find((prefix) => url.startsWith(prefix));
34
+ if (!root)
35
+ return undefined;
36
+ try {
37
+ return readFileSync(join(packages.get(root), url.slice(root.length)), 'utf8');
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ };
43
+ const first = map.imports[entry];
44
+ const seen = new Set();
45
+ const queue = first ? [first] : [];
46
+ for (let url = queue.shift(); url; url = queue.shift()) {
47
+ if (seen.has(url))
48
+ continue;
49
+ const text = read(url);
50
+ if (text === undefined)
51
+ continue;
52
+ seen.add(url);
53
+ for (const match of text.matchAll(STATIC_IMPORT)) {
54
+ const target = resolveModule(map, match[2], url);
55
+ if (target && !seen.has(target))
56
+ queue.push(target);
57
+ }
58
+ }
59
+ return [...seen];
60
+ }
61
+ //# sourceMappingURL=preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.js","sourceRoot":"","sources":["../../src/node/preload.ts"],"names":[],"mappings":"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"}
@@ -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,CAmUvF"}