@pie-element/cli 0.1.1 → 0.1.2-next.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 (281) hide show
  1. package/README.md +48 -10
  2. package/dist/commands/dev/demo/index.d.ts +1 -1
  3. package/dist/commands/dev/demo/index.js +21 -0
  4. package/dist/commands/dev/demo/index.js.map +1 -1
  5. package/dist/commands/dev/test-bundler.d.ts +0 -1
  6. package/dist/commands/dev/test-bundler.js +2 -10
  7. package/dist/commands/dev/test-bundler.js.map +1 -1
  8. package/dist/commands/docs/generate.d.ts +16 -0
  9. package/dist/commands/docs/generate.js +150 -0
  10. package/dist/commands/docs/generate.js.map +1 -0
  11. package/dist/commands/docs/verify.d.ts +12 -0
  12. package/dist/commands/docs/verify.js +40 -0
  13. package/dist/commands/docs/verify.js.map +1 -0
  14. package/dist/commands/packages/create-controllers.d.ts +0 -1
  15. package/dist/commands/packages/create-controllers.js.map +1 -1
  16. package/dist/commands/packages/create-lib-react.d.ts +0 -1
  17. package/dist/commands/packages/create-lib-react.js +1 -3
  18. package/dist/commands/packages/create-lib-react.js.map +1 -1
  19. package/dist/commands/packages/create-react-elements.d.ts +0 -1
  20. package/dist/commands/packages/create-react-elements.js +2 -3
  21. package/dist/commands/packages/create-react-elements.js.map +1 -1
  22. package/dist/commands/packages/enable-publishing.d.ts +0 -1
  23. package/dist/commands/packages/enable-publishing.js +26 -23
  24. package/dist/commands/packages/enable-publishing.js.map +1 -1
  25. package/dist/commands/packages/init-synced-elements.d.ts +0 -1
  26. package/dist/commands/packages/init-synced-elements.js +1 -1
  27. package/dist/commands/packages/init-synced-elements.js.map +1 -1
  28. package/dist/commands/upstream/analyze-esm.d.ts +0 -1
  29. package/dist/commands/upstream/analyze-esm.js +5 -1
  30. package/dist/commands/upstream/analyze-esm.js.map +1 -1
  31. package/dist/commands/upstream/check.d.ts +0 -1
  32. package/dist/commands/upstream/check.js.map +1 -1
  33. package/dist/commands/upstream/deps.d.ts +0 -1
  34. package/dist/commands/upstream/deps.js.map +1 -1
  35. package/dist/commands/upstream/sync.d.ts +11 -2
  36. package/dist/commands/upstream/sync.js +364 -25
  37. package/dist/commands/upstream/sync.js.map +1 -1
  38. package/dist/commands/upstream/track.d.ts +0 -1
  39. package/dist/commands/upstream/track.js.map +1 -1
  40. package/dist/commands/upstream/update.d.ts +0 -1
  41. package/dist/commands/upstream/update.js +37 -7
  42. package/dist/commands/upstream/update.js.map +1 -1
  43. package/dist/commands/verify/controllers.d.ts +0 -1
  44. package/dist/commands/verify/controllers.js +213 -59
  45. package/dist/commands/verify/controllers.js.map +1 -1
  46. package/dist/commands/verify/dependency-integrity.d.ts +18 -0
  47. package/dist/commands/verify/dependency-integrity.js +147 -0
  48. package/dist/commands/verify/dependency-integrity.js.map +1 -0
  49. package/dist/commands/verify/react-build.d.ts +0 -1
  50. package/dist/commands/verify/react-build.js.map +1 -1
  51. package/dist/index.d.ts +0 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/lib/docs/contract-validator.d.ts +12 -0
  54. package/dist/lib/docs/contract-validator.js +38 -0
  55. package/dist/lib/docs/contract-validator.js.map +1 -0
  56. package/dist/lib/docs/contracts.d.ts +11 -0
  57. package/dist/lib/docs/contracts.js +241 -0
  58. package/dist/lib/docs/contracts.js.map +1 -0
  59. package/dist/lib/docs/discovery.d.ts +10 -0
  60. package/dist/lib/docs/discovery.js +91 -0
  61. package/dist/lib/docs/discovery.js.map +1 -0
  62. package/dist/lib/docs/generator.d.ts +14 -0
  63. package/dist/lib/docs/generator.js +450 -0
  64. package/dist/lib/docs/generator.js.map +1 -0
  65. package/dist/lib/docs/source-extractor.d.ts +2 -0
  66. package/dist/lib/docs/source-extractor.js +209 -0
  67. package/dist/lib/docs/source-extractor.js.map +1 -0
  68. package/dist/lib/docs/types.d.ts +77 -0
  69. package/dist/lib/docs/types.js +2 -0
  70. package/dist/lib/docs/types.js.map +1 -0
  71. package/dist/lib/upstream/repo-utils.d.ts +0 -1
  72. package/dist/lib/upstream/repo-utils.js.map +1 -1
  73. package/dist/lib/upstream/sync-compatibility.d.ts +0 -1
  74. package/dist/lib/upstream/sync-compatibility.js.map +1 -1
  75. package/dist/lib/upstream/sync-constants.d.ts +35 -7
  76. package/dist/lib/upstream/sync-constants.js +40 -11
  77. package/dist/lib/upstream/sync-constants.js.map +1 -1
  78. package/dist/lib/upstream/sync-controllers-strategy.d.ts +0 -1
  79. package/dist/lib/upstream/sync-controllers-strategy.js +14 -4
  80. package/dist/lib/upstream/sync-controllers-strategy.js.map +1 -1
  81. package/dist/lib/upstream/sync-demo-metadata.d.ts +0 -1
  82. package/dist/lib/upstream/sync-demo-metadata.js +1 -1
  83. package/dist/lib/upstream/sync-demo-metadata.js.map +1 -1
  84. package/dist/lib/upstream/sync-entry-discovery.d.ts +3 -0
  85. package/dist/lib/upstream/sync-entry-discovery.js +23 -0
  86. package/dist/lib/upstream/sync-entry-discovery.js.map +1 -0
  87. package/dist/lib/upstream/sync-externals.d.ts +7 -7
  88. package/dist/lib/upstream/sync-externals.js +51 -35
  89. package/dist/lib/upstream/sync-externals.js.map +1 -1
  90. package/dist/lib/upstream/sync-filesystem.d.ts +0 -1
  91. package/dist/lib/upstream/sync-filesystem.js.map +1 -1
  92. package/dist/lib/upstream/sync-imports.d.ts +82 -62
  93. package/dist/lib/upstream/sync-imports.js +658 -185
  94. package/dist/lib/upstream/sync-imports.js.map +1 -1
  95. package/dist/lib/upstream/sync-package-json.d.ts +0 -1
  96. package/dist/lib/upstream/sync-package-json.js +7 -0
  97. package/dist/lib/upstream/sync-package-json.js.map +1 -1
  98. package/dist/lib/upstream/sync-package-manager.d.ts +14 -4
  99. package/dist/lib/upstream/sync-package-manager.js +405 -72
  100. package/dist/lib/upstream/sync-package-manager.js.map +1 -1
  101. package/dist/lib/upstream/sync-pielib-strategy.d.ts +2 -1
  102. package/dist/lib/upstream/sync-pielib-strategy.js +228 -110
  103. package/dist/lib/upstream/sync-pielib-strategy.js.map +1 -1
  104. package/dist/lib/upstream/sync-presets.d.ts +52 -0
  105. package/dist/lib/upstream/sync-presets.js +175 -0
  106. package/dist/lib/upstream/sync-presets.js.map +1 -0
  107. package/dist/lib/upstream/sync-react-strategy.d.ts +6 -1
  108. package/dist/lib/upstream/sync-react-strategy.js +342 -134
  109. package/dist/lib/upstream/sync-react-strategy.js.map +1 -1
  110. package/dist/lib/upstream/sync-source-edit.d.ts +14 -0
  111. package/dist/lib/upstream/sync-source-edit.js +89 -0
  112. package/dist/lib/upstream/sync-source-edit.js.map +1 -0
  113. package/dist/lib/upstream/sync-source-tree.d.ts +22 -0
  114. package/dist/lib/upstream/sync-source-tree.js +99 -0
  115. package/dist/lib/upstream/sync-source-tree.js.map +1 -0
  116. package/dist/lib/upstream/sync-strategy.d.ts +1 -1
  117. package/dist/lib/upstream/sync-strategy.js.map +1 -1
  118. package/dist/lib/upstream/sync-summary.d.ts +0 -1
  119. package/dist/lib/upstream/sync-summary.js.map +1 -1
  120. package/dist/lib/upstream/sync-transforms.d.ts +13 -11
  121. package/dist/lib/upstream/sync-transforms.js +23 -17
  122. package/dist/lib/upstream/sync-transforms.js.map +1 -1
  123. package/dist/lib/upstream/sync-vite-config.d.ts +13 -1
  124. package/dist/lib/upstream/sync-vite-config.js +65 -46
  125. package/dist/lib/upstream/sync-vite-config.js.map +1 -1
  126. package/dist/utils/compatibility.d.ts +13 -1
  127. package/dist/utils/compatibility.js +143 -2
  128. package/dist/utils/compatibility.js.map +1 -1
  129. package/dist/utils/conversion.d.ts +0 -1
  130. package/dist/utils/conversion.js.map +1 -1
  131. package/dist/utils/dependency-integrity.d.ts +37 -0
  132. package/dist/utils/dependency-integrity.js +557 -0
  133. package/dist/utils/dependency-integrity.js.map +1 -0
  134. package/dist/utils/git.d.ts +0 -1
  135. package/dist/utils/git.js.map +1 -1
  136. package/dist/utils/logger.d.ts +0 -1
  137. package/dist/utils/logger.js.map +1 -1
  138. package/dist/utils/package-json.d.ts +0 -1
  139. package/dist/utils/package-json.js.map +1 -1
  140. package/package.json +25 -8
  141. package/.compatibility/report.json +0 -2491
  142. package/.turbo/turbo-build.log +0 -1
  143. package/CHANGELOG.md +0 -8
  144. package/REFACTORING.md +0 -131
  145. package/bin/dev.js +0 -5
  146. package/dist/commands/dev/demo/index.d.ts.map +0 -1
  147. package/dist/commands/dev/test-bundler.d.ts.map +0 -1
  148. package/dist/commands/mathquill/migrate.d.ts +0 -20
  149. package/dist/commands/mathquill/migrate.d.ts.map +0 -1
  150. package/dist/commands/mathquill/migrate.js +0 -240
  151. package/dist/commands/mathquill/migrate.js.map +0 -1
  152. package/dist/commands/mathquill/status.d.ts +0 -20
  153. package/dist/commands/mathquill/status.d.ts.map +0 -1
  154. package/dist/commands/mathquill/status.js +0 -231
  155. package/dist/commands/mathquill/status.js.map +0 -1
  156. package/dist/commands/packages/create-controllers.d.ts.map +0 -1
  157. package/dist/commands/packages/create-lib-react.d.ts.map +0 -1
  158. package/dist/commands/packages/create-react-elements.d.ts.map +0 -1
  159. package/dist/commands/packages/enable-publishing.d.ts.map +0 -1
  160. package/dist/commands/packages/init-synced-elements.d.ts.map +0 -1
  161. package/dist/commands/upstream/analyze-esm.d.ts.map +0 -1
  162. package/dist/commands/upstream/check.d.ts.map +0 -1
  163. package/dist/commands/upstream/deps.d.ts.map +0 -1
  164. package/dist/commands/upstream/sync-mathquill.d.ts +0 -12
  165. package/dist/commands/upstream/sync-mathquill.d.ts.map +0 -1
  166. package/dist/commands/upstream/sync-mathquill.js +0 -97
  167. package/dist/commands/upstream/sync-mathquill.js.map +0 -1
  168. package/dist/commands/upstream/sync.d.ts.map +0 -1
  169. package/dist/commands/upstream/track.d.ts.map +0 -1
  170. package/dist/commands/upstream/update.d.ts.map +0 -1
  171. package/dist/commands/verify/controllers.d.ts.map +0 -1
  172. package/dist/commands/verify/react-build.d.ts.map +0 -1
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/lib/mathquill/extension-generator.d.ts +0 -9
  175. package/dist/lib/mathquill/extension-generator.d.ts.map +0 -1
  176. package/dist/lib/mathquill/extension-generator.js +0 -107
  177. package/dist/lib/mathquill/extension-generator.js.map +0 -1
  178. package/dist/lib/mathquill/khan-extractor.d.ts +0 -16
  179. package/dist/lib/mathquill/khan-extractor.d.ts.map +0 -1
  180. package/dist/lib/mathquill/khan-extractor.js +0 -148
  181. package/dist/lib/mathquill/khan-extractor.js.map +0 -1
  182. package/dist/lib/mathquill/learnosity-extractor.d.ts +0 -15
  183. package/dist/lib/mathquill/learnosity-extractor.d.ts.map +0 -1
  184. package/dist/lib/mathquill/learnosity-extractor.js +0 -170
  185. package/dist/lib/mathquill/learnosity-extractor.js.map +0 -1
  186. package/dist/lib/mathquill/migration-orchestrator.d.ts +0 -77
  187. package/dist/lib/mathquill/migration-orchestrator.d.ts.map +0 -1
  188. package/dist/lib/mathquill/migration-orchestrator.js +0 -391
  189. package/dist/lib/mathquill/migration-orchestrator.js.map +0 -1
  190. package/dist/lib/mathquill/package-updater.d.ts +0 -9
  191. package/dist/lib/mathquill/package-updater.d.ts.map +0 -1
  192. package/dist/lib/mathquill/package-updater.js +0 -103
  193. package/dist/lib/mathquill/package-updater.js.map +0 -1
  194. package/dist/lib/mathquill/pie-extractor.d.ts +0 -14
  195. package/dist/lib/mathquill/pie-extractor.d.ts.map +0 -1
  196. package/dist/lib/mathquill/pie-extractor.js +0 -167
  197. package/dist/lib/mathquill/pie-extractor.js.map +0 -1
  198. package/dist/lib/upstream/repo-utils.d.ts.map +0 -1
  199. package/dist/lib/upstream/sync-compatibility.d.ts.map +0 -1
  200. package/dist/lib/upstream/sync-constants.d.ts.map +0 -1
  201. package/dist/lib/upstream/sync-controllers-strategy.d.ts.map +0 -1
  202. package/dist/lib/upstream/sync-demo-metadata.d.ts.map +0 -1
  203. package/dist/lib/upstream/sync-dev-exports.d.ts +0 -13
  204. package/dist/lib/upstream/sync-dev-exports.d.ts.map +0 -1
  205. package/dist/lib/upstream/sync-dev-exports.js +0 -115
  206. package/dist/lib/upstream/sync-dev-exports.js.map +0 -1
  207. package/dist/lib/upstream/sync-externals.d.ts.map +0 -1
  208. package/dist/lib/upstream/sync-filesystem.d.ts.map +0 -1
  209. package/dist/lib/upstream/sync-imports.d.ts.map +0 -1
  210. package/dist/lib/upstream/sync-mathquill.d.ts +0 -19
  211. package/dist/lib/upstream/sync-mathquill.d.ts.map +0 -1
  212. package/dist/lib/upstream/sync-mathquill.js +0 -160
  213. package/dist/lib/upstream/sync-mathquill.js.map +0 -1
  214. package/dist/lib/upstream/sync-package-json.d.ts.map +0 -1
  215. package/dist/lib/upstream/sync-package-manager.d.ts.map +0 -1
  216. package/dist/lib/upstream/sync-pielib-strategy.d.ts.map +0 -1
  217. package/dist/lib/upstream/sync-react-strategy.d.ts.map +0 -1
  218. package/dist/lib/upstream/sync-strategy.d.ts.map +0 -1
  219. package/dist/lib/upstream/sync-summary.d.ts.map +0 -1
  220. package/dist/lib/upstream/sync-transforms.d.ts.map +0 -1
  221. package/dist/lib/upstream/sync-vite-config.d.ts.map +0 -1
  222. package/dist/utils/compatibility.d.ts.map +0 -1
  223. package/dist/utils/conversion.d.ts.map +0 -1
  224. package/dist/utils/git.d.ts.map +0 -1
  225. package/dist/utils/logger.d.ts.map +0 -1
  226. package/dist/utils/package-json.d.ts.map +0 -1
  227. package/packages/cli/bin/dev.js +0 -5
  228. package/packages/cli/bin/run.js +0 -5
  229. package/src/commands/dev/demo/index.ts +0 -313
  230. package/src/commands/dev/test-bundler.ts +0 -345
  231. package/src/commands/mathquill/migrate.ts +0 -269
  232. package/src/commands/mathquill/status.ts +0 -267
  233. package/src/commands/packages/create-controllers.ts +0 -127
  234. package/src/commands/packages/create-lib-react.ts +0 -279
  235. package/src/commands/packages/create-react-elements.ts +0 -306
  236. package/src/commands/packages/enable-publishing.ts +0 -161
  237. package/src/commands/packages/init-synced-elements.ts +0 -259
  238. package/src/commands/upstream/README.md +0 -444
  239. package/src/commands/upstream/analyze-esm.ts +0 -1973
  240. package/src/commands/upstream/check.ts +0 -228
  241. package/src/commands/upstream/deps.ts +0 -222
  242. package/src/commands/upstream/sync-mathquill.ts +0 -108
  243. package/src/commands/upstream/sync.ts +0 -687
  244. package/src/commands/upstream/track.ts +0 -145
  245. package/src/commands/upstream/update.ts +0 -110
  246. package/src/commands/verify/controllers.ts +0 -166
  247. package/src/commands/verify/react-build.ts +0 -171
  248. package/src/index.ts +0 -1
  249. package/src/lib/mathquill/extension-generator.ts +0 -111
  250. package/src/lib/mathquill/khan-extractor.ts +0 -175
  251. package/src/lib/mathquill/learnosity-extractor.ts +0 -198
  252. package/src/lib/mathquill/migration-orchestrator.ts +0 -513
  253. package/src/lib/mathquill/package-updater.ts +0 -120
  254. package/src/lib/mathquill/pie-extractor.ts +0 -194
  255. package/src/lib/upstream/repo-utils.ts +0 -18
  256. package/src/lib/upstream/sync-compatibility.ts +0 -89
  257. package/src/lib/upstream/sync-constants.ts +0 -77
  258. package/src/lib/upstream/sync-controllers-strategy.ts +0 -291
  259. package/src/lib/upstream/sync-demo-metadata.ts +0 -199
  260. package/src/lib/upstream/sync-dev-exports.ts +0 -151
  261. package/src/lib/upstream/sync-externals.ts +0 -159
  262. package/src/lib/upstream/sync-filesystem.ts +0 -87
  263. package/src/lib/upstream/sync-imports.ts +0 -992
  264. package/src/lib/upstream/sync-mathquill.ts +0 -194
  265. package/src/lib/upstream/sync-package-json.ts +0 -86
  266. package/src/lib/upstream/sync-package-manager.ts +0 -694
  267. package/src/lib/upstream/sync-pielib-strategy.ts +0 -441
  268. package/src/lib/upstream/sync-react-strategy.ts +0 -945
  269. package/src/lib/upstream/sync-strategy.ts +0 -61
  270. package/src/lib/upstream/sync-summary.ts +0 -194
  271. package/src/lib/upstream/sync-transforms.ts +0 -154
  272. package/src/lib/upstream/sync-vite-config.ts +0 -243
  273. package/src/types/es-module-lexer.d.ts +0 -4
  274. package/src/utils/compatibility.ts +0 -182
  275. package/src/utils/conversion.ts +0 -153
  276. package/src/utils/git.ts +0 -63
  277. package/src/utils/logger.ts +0 -69
  278. package/src/utils/package-json.ts +0 -43
  279. package/tests/sync-package-manager.test.ts +0 -112
  280. package/tests/transform-assign-props.test.ts +0 -101
  281. package/tsconfig.json +0 -15
@@ -0,0 +1,450 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { join, relative } from 'node:path';
4
+ import { loadPointerValue } from './source-extractor.js';
5
+ const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
6
+ const inferType = (value) => {
7
+ if (value === null)
8
+ return 'null';
9
+ if (Array.isArray(value))
10
+ return 'array';
11
+ switch (typeof value) {
12
+ case 'string':
13
+ case 'number':
14
+ case 'boolean':
15
+ return typeof value;
16
+ case 'object':
17
+ return 'object';
18
+ default:
19
+ return 'unknown';
20
+ }
21
+ };
22
+ const flattenProperties = (value, basePath = '') => {
23
+ if (isRecord(value)) {
24
+ const keys = Object.keys(value).sort();
25
+ if (keys.length === 0 && basePath) {
26
+ return [{ path: basePath, type: 'object', required: false, defaultValue: {} }];
27
+ }
28
+ const flattened = [];
29
+ for (const key of keys) {
30
+ const childPath = basePath ? `${basePath}.${key}` : key;
31
+ flattened.push(...flattenProperties(value[key], childPath));
32
+ }
33
+ return flattened;
34
+ }
35
+ if (Array.isArray(value)) {
36
+ return [
37
+ {
38
+ path: basePath,
39
+ type: 'array',
40
+ required: false,
41
+ defaultValue: value,
42
+ },
43
+ ];
44
+ }
45
+ return [
46
+ {
47
+ path: basePath,
48
+ type: inferType(value),
49
+ required: false,
50
+ defaultValue: value,
51
+ },
52
+ ];
53
+ };
54
+ const escapeHtml = (value) => value
55
+ .replaceAll('&', '&')
56
+ .replaceAll('<', '&lt;')
57
+ .replaceAll('>', '&gt;')
58
+ .replaceAll('"', '&quot;')
59
+ .replaceAll("'", '&#39;')
60
+ .replaceAll('{', '&#123;')
61
+ .replaceAll('}', '&#125;');
62
+ const formatInline = (value) => {
63
+ if (typeof value === 'string')
64
+ return value;
65
+ return JSON.stringify(value);
66
+ };
67
+ const formatValue = (value) => {
68
+ if (typeof value === 'string') {
69
+ return `<code>${escapeHtml(value)}</code>`;
70
+ }
71
+ if (typeof value === 'number' || typeof value === 'boolean') {
72
+ return `<code>${String(value)}</code>`;
73
+ }
74
+ if (value === null) {
75
+ return '<code>null</code>';
76
+ }
77
+ return `<code>${escapeHtml(JSON.stringify(value))}</code>`;
78
+ };
79
+ const readSummary = async (packageDir, fallback) => {
80
+ const readmePath = join(packageDir, 'README.md');
81
+ if (existsSync(readmePath)) {
82
+ const readme = await readFile(readmePath, 'utf-8');
83
+ const paragraph = readme
84
+ .split('\n')
85
+ .map((line) => line.trim())
86
+ .filter((line) => line.length > 0 && !line.startsWith('#'))
87
+ .find((line) => line.length > 20);
88
+ if (paragraph) {
89
+ return paragraph;
90
+ }
91
+ }
92
+ return fallback || 'No summary provided.';
93
+ };
94
+ // Replace ISO-8601 timestamps with a fixed valid value so a post-normalization
95
+ // JSON.parse still succeeds (the old `<normalized-timestamp>` placeholder was
96
+ // not valid JSON, which forced a purely textual comparison).
97
+ const normalizeTimestamps = (content) => content.replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z/g, '0000-01-01T00:00:00.000Z');
98
+ // Compare generated content to the checked-in artifact.
99
+ // - For JSON files, parse both sides and compare by structural equality so
100
+ // whitespace/formatting differences (e.g. after a biome format pass) do not
101
+ // register as drift. HTML files fall back to text comparison with timestamps
102
+ // normalized away.
103
+ const normalizeForCheck = (path, content) => {
104
+ const withoutTimestamps = normalizeTimestamps(content);
105
+ if (path.endsWith('.json')) {
106
+ try {
107
+ return JSON.stringify(JSON.parse(withoutTimestamps));
108
+ }
109
+ catch {
110
+ return withoutTimestamps;
111
+ }
112
+ }
113
+ return withoutTimestamps;
114
+ };
115
+ const loadValueWithFallback = async (packageDir, pointer, kind) => {
116
+ const fallbackPointers = kind === 'pie'
117
+ ? [
118
+ pointer,
119
+ { file: 'src/controller/defaults.ts', path: 'model' },
120
+ { file: 'src/controller/defaults.ts' },
121
+ ]
122
+ : [
123
+ pointer,
124
+ { file: 'src/author/defaultConfiguration.ts', path: 'configuration' },
125
+ { file: 'src/author/defaults.ts', path: 'configuration' },
126
+ { file: 'src/controller/defaults.ts', path: 'configuration' },
127
+ { file: 'src/controller/defaults.ts' },
128
+ ];
129
+ let lastError;
130
+ for (const candidate of fallbackPointers) {
131
+ if (!existsSync(join(packageDir, candidate.file))) {
132
+ continue;
133
+ }
134
+ try {
135
+ const value = await loadPointerValue(packageDir, candidate);
136
+ return {
137
+ value,
138
+ sourceLabel: candidate.file + (candidate.path ? `#${candidate.path}` : ''),
139
+ };
140
+ }
141
+ catch (error) {
142
+ lastError = error;
143
+ }
144
+ }
145
+ if (kind === 'config') {
146
+ return { value: {}, sourceLabel: pointer.file + (pointer.path ? `#${pointer.path}` : '') };
147
+ }
148
+ throw lastError || new Error(`Unable to load ${kind} defaults from ${pointer.file}`);
149
+ };
150
+ const applyMetadata = (properties, metadata) => {
151
+ if (!metadata || Object.keys(metadata).length === 0) {
152
+ return properties;
153
+ }
154
+ const byPath = new Map(properties.map((p) => [p.path, { ...p }]));
155
+ for (const [path, meta] of Object.entries(metadata)) {
156
+ const current = byPath.get(path) || {
157
+ path,
158
+ type: meta.type || 'unknown',
159
+ required: meta.required ?? false,
160
+ };
161
+ const merged = {
162
+ ...current,
163
+ ...(meta.type ? { type: meta.type } : {}),
164
+ ...(meta.required !== undefined ? { required: meta.required } : {}),
165
+ ...(meta.title ? { title: meta.title } : {}),
166
+ ...(meta.description ? { description: meta.description } : {}),
167
+ ...(meta.notes ? { notes: meta.notes } : {}),
168
+ ...(meta.enum ? { enum: [...meta.enum] } : {}),
169
+ ...(meta.minimum !== undefined ? { minimum: meta.minimum } : {}),
170
+ ...(meta.maximum !== undefined ? { maximum: meta.maximum } : {}),
171
+ ...(meta.minLength !== undefined ? { minLength: meta.minLength } : {}),
172
+ ...(meta.maxLength !== undefined ? { maxLength: meta.maxLength } : {}),
173
+ ...(meta.pattern ? { pattern: meta.pattern } : {}),
174
+ ...(meta.itemType ? { itemType: meta.itemType } : {}),
175
+ ...(meta.examples ? { examples: [...meta.examples] } : {}),
176
+ };
177
+ byPath.set(path, merged);
178
+ }
179
+ return Array.from(byPath.values()).sort((a, b) => a.path.localeCompare(b.path));
180
+ };
181
+ const propertyFingerprint = (properties) => JSON.stringify(properties.map((p) => ({
182
+ path: p.path,
183
+ type: p.type,
184
+ required: p.required,
185
+ defaultValue: p.defaultValue,
186
+ })));
187
+ const renderPropertyHtml = (prop) => {
188
+ const rows = [];
189
+ rows.push(`<li><strong>Type:</strong> <code>${escapeHtml(prop.type)}</code></li>`);
190
+ rows.push(`<li><strong>Required:</strong> <code>${String(prop.required)}</code></li>`);
191
+ if (prop.itemType) {
192
+ rows.push(`<li><strong>Item Type:</strong> <code>${escapeHtml(prop.itemType)}</code></li>`);
193
+ }
194
+ if (prop.description) {
195
+ rows.push(`<li><strong>Description:</strong> ${escapeHtml(prop.description)}</li>`);
196
+ }
197
+ if (prop.enum && prop.enum.length > 0) {
198
+ rows.push(`<li><strong>Allowed values:</strong> ${prop.enum
199
+ .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)
200
+ .join(', ')}</li>`);
201
+ }
202
+ const constraints = [];
203
+ if (prop.minimum !== undefined)
204
+ constraints.push(`<code>minimum: ${prop.minimum}</code>`);
205
+ if (prop.maximum !== undefined)
206
+ constraints.push(`<code>maximum: ${prop.maximum}</code>`);
207
+ if (prop.minLength !== undefined)
208
+ constraints.push(`<code>minLength: ${prop.minLength}</code>`);
209
+ if (prop.maxLength !== undefined)
210
+ constraints.push(`<code>maxLength: ${prop.maxLength}</code>`);
211
+ if (prop.pattern)
212
+ constraints.push(`<code>pattern: ${escapeHtml(prop.pattern)}</code>`);
213
+ if (constraints.length) {
214
+ rows.push(`<li><strong>Constraints:</strong> ${constraints.join(', ')}</li>`);
215
+ }
216
+ rows.push(`<li><strong>Default:</strong> ${prop.defaultValue !== undefined ? formatValue(prop.defaultValue) : '<em>none</em>'}</li>`);
217
+ if (prop.examples && prop.examples.length > 0) {
218
+ rows.push(`<li><strong>Examples:</strong> ${prop.examples
219
+ .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)
220
+ .join(', ')}</li>`);
221
+ }
222
+ if (prop.notes) {
223
+ rows.push(`<li><strong>Notes:</strong> ${escapeHtml(prop.notes)}</li>`);
224
+ }
225
+ return `
226
+ <section class="doc-property">
227
+ <h3><code>${escapeHtml(prop.path)}</code></h3>
228
+ <ul>
229
+ ${rows.join('\n ')}
230
+ </ul>
231
+ </section>`;
232
+ };
233
+ const renderPropertiesSectionHtml = (title, source, properties) => {
234
+ if (properties.length === 0) {
235
+ return `
236
+ <section class="doc-section">
237
+ <h2>${escapeHtml(title)}</h2>
238
+ <p><strong>Source:</strong> <code>${escapeHtml(source)}</code></p>
239
+ <p>No properties found.</p>
240
+ </section>`;
241
+ }
242
+ return `
243
+ <section class="doc-section">
244
+ <h2>${escapeHtml(title)}</h2>
245
+ <p><strong>Source:</strong> <code>${escapeHtml(source)}</code></p>
246
+ ${properties.map((prop) => renderPropertyHtml(prop)).join('\n')}
247
+ </section>`;
248
+ };
249
+ const wrapHtmlPage = (title, body) => `
250
+ <!doctype html>
251
+ <html lang="en">
252
+ <head>
253
+ <meta charset="utf-8" />
254
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
255
+ <title>${escapeHtml(title)}</title>
256
+ <style>
257
+ :root { color-scheme: light dark; font-family: Inter, system-ui, sans-serif; }
258
+ body { margin: 0; padding: 1.5rem; line-height: 1.55; }
259
+ h1,h2,h3 { line-height: 1.25; }
260
+ h1 { margin-top: 0; }
261
+ code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
262
+ .doc-section { margin-bottom: 2rem; }
263
+ .doc-property { margin: 0 0 1.25rem 0; padding-bottom: 0.5rem; border-bottom: 1px solid rgba(128,128,128,.25); }
264
+ ul { padding-left: 1.25rem; }
265
+ .meta-list li { margin-bottom: .25rem; }
266
+ </style>
267
+ </head>
268
+ <body>
269
+ ${body}
270
+ </body>
271
+ </html>
272
+ `;
273
+ const renderElementIndexHtml = (opts) => wrapHtmlPage(`${opts.contract.elementName} docs`, `
274
+ <h1>${escapeHtml(opts.contract.elementName)} docs</h1>
275
+ <section class="doc-section">
276
+ <h2>Overview</h2>
277
+ <p>${escapeHtml(opts.summary)}</p>
278
+ </section>
279
+ <section class="doc-section">
280
+ <h2>Element Metadata</h2>
281
+ <ul class="meta-list">
282
+ <li><strong>Element:</strong> <code>${escapeHtml(opts.contract.elementName)}</code></li>
283
+ <li><strong>Package:</strong> <code>${escapeHtml(opts.contract.packageName)}</code></li>
284
+ <li><strong>Framework:</strong> <code>${escapeHtml(opts.contract.framework)}</code></li>
285
+ <li><strong>Generated:</strong> <code>${escapeHtml(opts.generatedAt)}</code></li>
286
+ </ul>
287
+ </section>
288
+ <section class="doc-section">
289
+ <h2>Supported Modes</h2>
290
+ <ul class="meta-list">
291
+ ${(opts.contract.supportedModes || []).map((mode) => `<li>${escapeHtml(mode)}</li>`).join('')}
292
+ </ul>
293
+ </section>
294
+ <section class="doc-section">
295
+ <h2>Views</h2>
296
+ <ul class="meta-list">
297
+ ${opts.emittedViews
298
+ .map((view) => `<li><a href="./${encodeURIComponent(view)}.html">${escapeHtml(view)}</a></li>`)
299
+ .join('')}
300
+ </ul>
301
+ </section>
302
+ `);
303
+ const renderViewHtml = (opts) => wrapHtmlPage(`${opts.contract.elementName} ${opts.view} docs`, `
304
+ <h1>${escapeHtml(opts.contract.elementName)} / ${escapeHtml(opts.view)}</h1>
305
+ ${renderPropertiesSectionHtml('Model Defaults', opts.pieSource, opts.pieProperties)}
306
+ ${renderPropertiesSectionHtml('Authoring/Configuration Defaults', opts.configSource, opts.configProperties)}
307
+ `);
308
+ const chooseViewDocs = (resolvedViews) => {
309
+ const map = new Map(resolvedViews.map((v) => [v.view, v]));
310
+ const chosen = [];
311
+ const delivery = map.get('delivery');
312
+ const author = map.get('author');
313
+ const print = map.get('print');
314
+ if (delivery) {
315
+ chosen.push(delivery);
316
+ }
317
+ if (author) {
318
+ chosen.push(author);
319
+ }
320
+ if (print) {
321
+ const deliveryFingerprint = delivery
322
+ ? `${propertyFingerprint(delivery.pieProperties)}|${propertyFingerprint(delivery.configProperties)}`
323
+ : '';
324
+ const printFingerprint = `${propertyFingerprint(print.pieProperties)}|${propertyFingerprint(print.configProperties)}`;
325
+ const sourceDiffFromDelivery = delivery
326
+ ? print.pieSource !== delivery.pieSource || print.configSource !== delivery.configSource
327
+ : true;
328
+ const sourceDiffFromAuthor = author
329
+ ? print.pieSource !== author.pieSource || print.configSource !== author.configSource
330
+ : true;
331
+ const materiallyDifferent = !delivery || printFingerprint !== deliveryFingerprint;
332
+ if (materiallyDifferent || sourceDiffFromDelivery || sourceDiffFromAuthor) {
333
+ chosen.push(print);
334
+ }
335
+ }
336
+ const extras = resolvedViews
337
+ .filter((v) => !['delivery', 'author', 'print'].includes(v.view))
338
+ .sort((a, b) => a.view.localeCompare(b.view));
339
+ for (const extra of extras) {
340
+ chosen.push(extra);
341
+ }
342
+ return chosen;
343
+ };
344
+ export const generateDocsForContract = async (packageDir, contract, options) => {
345
+ const generatedAt = new Date().toISOString();
346
+ const summary = await readSummary(packageDir, contract.summary);
347
+ const filesWritten = [];
348
+ const filesChecked = [];
349
+ const driftFiles = [];
350
+ const sourcesUsed = new Set();
351
+ const outputs = {
352
+ contract,
353
+ packageDir,
354
+ generatedAt,
355
+ views: [],
356
+ sourcesUsed: [],
357
+ };
358
+ const resolvedViews = [];
359
+ for (const view of contract.views) {
360
+ const pieResolved = await loadValueWithFallback(packageDir, view.pie, 'pie');
361
+ const configResolved = await loadValueWithFallback(packageDir, view.config, 'config');
362
+ const pieProperties = applyMetadata(flattenProperties(pieResolved.value).sort((a, b) => a.path.localeCompare(b.path)), view.metadata?.pie);
363
+ const configProperties = applyMetadata(flattenProperties(configResolved.value).sort((a, b) => a.path.localeCompare(b.path)), view.metadata?.config);
364
+ resolvedViews.push({
365
+ view: view.view,
366
+ pieProperties,
367
+ configProperties,
368
+ pieSource: pieResolved.sourceLabel,
369
+ configSource: configResolved.sourceLabel,
370
+ });
371
+ }
372
+ const emittedViews = chooseViewDocs(resolvedViews);
373
+ const elementOutputDir = join(options.outputDir, contract.elementName);
374
+ const elementIndexPath = join(elementOutputDir, 'index.html');
375
+ const elementIndexContent = renderElementIndexHtml({
376
+ contract,
377
+ summary,
378
+ generatedAt,
379
+ emittedViews: emittedViews.map((v) => v.view),
380
+ });
381
+ const manifest = {
382
+ elementName: contract.elementName,
383
+ packageName: contract.packageName,
384
+ framework: contract.framework,
385
+ generatedAt,
386
+ summary,
387
+ supportedModes: contract.supportedModes || [],
388
+ views: emittedViews.map((view) => ({
389
+ id: view.view,
390
+ file: `${view.view}.html`,
391
+ pieSource: view.pieSource,
392
+ configSource: view.configSource,
393
+ hasModelDefaults: view.pieProperties.length > 0,
394
+ hasConfigDefaults: view.configProperties.length > 0,
395
+ })),
396
+ };
397
+ const candidates = [
398
+ { path: elementIndexPath, content: elementIndexContent },
399
+ {
400
+ path: join(elementOutputDir, 'manifest.json'),
401
+ content: `${JSON.stringify(manifest, null, 2)}\n`,
402
+ },
403
+ ...emittedViews.map((view) => ({
404
+ path: join(elementOutputDir, `${view.view}.html`),
405
+ content: renderViewHtml({
406
+ contract,
407
+ view: view.view,
408
+ pieSource: view.pieSource,
409
+ configSource: view.configSource,
410
+ pieProperties: view.pieProperties,
411
+ configProperties: view.configProperties,
412
+ }),
413
+ })),
414
+ ];
415
+ for (const candidate of candidates) {
416
+ filesChecked.push(candidate.path);
417
+ if (options.check) {
418
+ const existing = existsSync(candidate.path) ? await readFile(candidate.path, 'utf-8') : null;
419
+ if (existing === null ||
420
+ normalizeForCheck(candidate.path, existing) !==
421
+ normalizeForCheck(candidate.path, candidate.content)) {
422
+ driftFiles.push(candidate.path);
423
+ }
424
+ continue;
425
+ }
426
+ if (!options.dryRun) {
427
+ await mkdir(elementOutputDir, { recursive: true });
428
+ await writeFile(candidate.path, candidate.content, 'utf-8');
429
+ }
430
+ filesWritten.push(candidate.path);
431
+ }
432
+ for (const view of emittedViews) {
433
+ sourcesUsed.add(view.pieSource);
434
+ sourcesUsed.add(view.configSource);
435
+ outputs.views.push({
436
+ view: view.view,
437
+ pieProperties: view.pieProperties,
438
+ configProperties: view.configProperties,
439
+ });
440
+ }
441
+ outputs.sourcesUsed = Array.from(sourcesUsed).sort();
442
+ return {
443
+ filesWritten,
444
+ filesChecked,
445
+ driftFiles,
446
+ outputs: [outputs],
447
+ };
448
+ };
449
+ export const toRelativePaths = (rootDir, paths) => paths.map((p) => relative(rootDir, p)).sort();
450
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/lib/docs/generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport { loadPointerValue } from './source-extractor.js';\nimport type {\n PieDocsContract,\n PieDocsElementOutput,\n PieDocsPropertyMetadata,\n PieDocsProperty,\n PieDocsProperty as PieDocsPropertyContract,\n} from './types.js';\nimport type { PieDocsSourcePointer } from './types.js';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\nconst inferType = (value: unknown): string => {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return typeof value;\n case 'object':\n return 'object';\n default:\n return 'unknown';\n }\n};\n\nconst flattenProperties = (value: unknown, basePath = ''): PieDocsProperty[] => {\n if (isRecord(value)) {\n const keys = Object.keys(value).sort();\n if (keys.length === 0 && basePath) {\n return [{ path: basePath, type: 'object', required: false, defaultValue: {} }];\n }\n const flattened: PieDocsProperty[] = [];\n for (const key of keys) {\n const childPath = basePath ? `${basePath}.${key}` : key;\n flattened.push(...flattenProperties(value[key], childPath));\n }\n return flattened;\n }\n\n if (Array.isArray(value)) {\n return [\n {\n path: basePath,\n type: 'array',\n required: false,\n defaultValue: value,\n },\n ];\n }\n\n return [\n {\n path: basePath,\n type: inferType(value),\n required: false,\n defaultValue: value,\n },\n ];\n};\n\nconst escapeHtml = (value: string): string =>\n value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;')\n .replaceAll('{', '&#123;')\n .replaceAll('}', '&#125;');\n\nconst formatInline = (value: unknown): string => {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n};\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === 'string') {\n return `<code>${escapeHtml(value)}</code>`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `<code>${String(value)}</code>`;\n }\n if (value === null) {\n return '<code>null</code>';\n }\n return `<code>${escapeHtml(JSON.stringify(value))}</code>`;\n};\n\nconst readSummary = async (packageDir: string, fallback?: string): Promise<string> => {\n const readmePath = join(packageDir, 'README.md');\n if (existsSync(readmePath)) {\n const readme = await readFile(readmePath, 'utf-8');\n const paragraph = readme\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith('#'))\n .find((line) => line.length > 20);\n if (paragraph) {\n return paragraph;\n }\n }\n return fallback || 'No summary provided.';\n};\n\nexport interface GenerateDocsOptions {\n outputDir: string;\n dryRun: boolean;\n check: boolean;\n}\n\nexport interface GenerateDocsResult {\n filesWritten: string[];\n filesChecked: string[];\n driftFiles: string[];\n outputs: PieDocsElementOutput[];\n}\n\n// Replace ISO-8601 timestamps with a fixed valid value so a post-normalization\n// JSON.parse still succeeds (the old `<normalized-timestamp>` placeholder was\n// not valid JSON, which forced a purely textual comparison).\nconst normalizeTimestamps = (content: string): string =>\n content.replace(/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/g, '0000-01-01T00:00:00.000Z');\n\n// Compare generated content to the checked-in artifact.\n// - For JSON files, parse both sides and compare by structural equality so\n// whitespace/formatting differences (e.g. after a biome format pass) do not\n// register as drift. HTML files fall back to text comparison with timestamps\n// normalized away.\nconst normalizeForCheck = (path: string, content: string): string => {\n const withoutTimestamps = normalizeTimestamps(content);\n if (path.endsWith('.json')) {\n try {\n return JSON.stringify(JSON.parse(withoutTimestamps));\n } catch {\n return withoutTimestamps;\n }\n }\n return withoutTimestamps;\n};\n\nconst loadValueWithFallback = async (\n packageDir: string,\n pointer: PieDocsSourcePointer,\n kind: 'pie' | 'config'\n): Promise<{ value: unknown; sourceLabel: string }> => {\n const fallbackPointers: PieDocsSourcePointer[] =\n kind === 'pie'\n ? [\n pointer,\n { file: 'src/controller/defaults.ts', path: 'model' },\n { file: 'src/controller/defaults.ts' },\n ]\n : [\n pointer,\n { file: 'src/author/defaultConfiguration.ts', path: 'configuration' },\n { file: 'src/author/defaults.ts', path: 'configuration' },\n { file: 'src/controller/defaults.ts', path: 'configuration' },\n { file: 'src/controller/defaults.ts' },\n ];\n\n let lastError: Error | undefined;\n for (const candidate of fallbackPointers) {\n if (!existsSync(join(packageDir, candidate.file))) {\n continue;\n }\n try {\n const value = await loadPointerValue(packageDir, candidate);\n return {\n value,\n sourceLabel: candidate.file + (candidate.path ? `#${candidate.path}` : ''),\n };\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (kind === 'config') {\n return { value: {}, sourceLabel: pointer.file + (pointer.path ? `#${pointer.path}` : '') };\n }\n\n throw lastError || new Error(`Unable to load ${kind} defaults from ${pointer.file}`);\n};\n\ninterface ResolvedViewDocs {\n view: string;\n pieProperties: PieDocsPropertyContract[];\n configProperties: PieDocsPropertyContract[];\n pieSource: string;\n configSource: string;\n}\n\nconst applyMetadata = (\n properties: PieDocsPropertyContract[],\n metadata?: Record<string, PieDocsPropertyMetadata>\n): PieDocsPropertyContract[] => {\n if (!metadata || Object.keys(metadata).length === 0) {\n return properties;\n }\n\n const byPath = new Map<string, PieDocsPropertyContract>(\n properties.map((p) => [p.path, { ...p }])\n );\n\n for (const [path, meta] of Object.entries(metadata)) {\n const current = byPath.get(path) || {\n path,\n type: meta.type || 'unknown',\n required: meta.required ?? false,\n };\n const merged: PieDocsPropertyContract = {\n ...current,\n ...(meta.type ? { type: meta.type } : {}),\n ...(meta.required !== undefined ? { required: meta.required } : {}),\n ...(meta.title ? { title: meta.title } : {}),\n ...(meta.description ? { description: meta.description } : {}),\n ...(meta.notes ? { notes: meta.notes } : {}),\n ...(meta.enum ? { enum: [...meta.enum] } : {}),\n ...(meta.minimum !== undefined ? { minimum: meta.minimum } : {}),\n ...(meta.maximum !== undefined ? { maximum: meta.maximum } : {}),\n ...(meta.minLength !== undefined ? { minLength: meta.minLength } : {}),\n ...(meta.maxLength !== undefined ? { maxLength: meta.maxLength } : {}),\n ...(meta.pattern ? { pattern: meta.pattern } : {}),\n ...(meta.itemType ? { itemType: meta.itemType } : {}),\n ...(meta.examples ? { examples: [...meta.examples] } : {}),\n };\n byPath.set(path, merged);\n }\n\n return Array.from(byPath.values()).sort((a, b) => a.path.localeCompare(b.path));\n};\n\nconst propertyFingerprint = (properties: PieDocsPropertyContract[]): string =>\n JSON.stringify(\n properties.map((p) => ({\n path: p.path,\n type: p.type,\n required: p.required,\n defaultValue: p.defaultValue,\n }))\n );\n\nconst renderPropertyHtml = (prop: PieDocsPropertyContract): string => {\n const rows: string[] = [];\n rows.push(`<li><strong>Type:</strong> <code>${escapeHtml(prop.type)}</code></li>`);\n rows.push(`<li><strong>Required:</strong> <code>${String(prop.required)}</code></li>`);\n if (prop.itemType) {\n rows.push(`<li><strong>Item Type:</strong> <code>${escapeHtml(prop.itemType)}</code></li>`);\n }\n if (prop.description) {\n rows.push(`<li><strong>Description:</strong> ${escapeHtml(prop.description)}</li>`);\n }\n if (prop.enum && prop.enum.length > 0) {\n rows.push(\n `<li><strong>Allowed values:</strong> ${prop.enum\n .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)\n .join(', ')}</li>`\n );\n }\n const constraints: string[] = [];\n if (prop.minimum !== undefined) constraints.push(`<code>minimum: ${prop.minimum}</code>`);\n if (prop.maximum !== undefined) constraints.push(`<code>maximum: ${prop.maximum}</code>`);\n if (prop.minLength !== undefined) constraints.push(`<code>minLength: ${prop.minLength}</code>`);\n if (prop.maxLength !== undefined) constraints.push(`<code>maxLength: ${prop.maxLength}</code>`);\n if (prop.pattern) constraints.push(`<code>pattern: ${escapeHtml(prop.pattern)}</code>`);\n if (constraints.length) {\n rows.push(`<li><strong>Constraints:</strong> ${constraints.join(', ')}</li>`);\n }\n rows.push(\n `<li><strong>Default:</strong> ${\n prop.defaultValue !== undefined ? formatValue(prop.defaultValue) : '<em>none</em>'\n }</li>`\n );\n if (prop.examples && prop.examples.length > 0) {\n rows.push(\n `<li><strong>Examples:</strong> ${prop.examples\n .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)\n .join(', ')}</li>`\n );\n }\n if (prop.notes) {\n rows.push(`<li><strong>Notes:</strong> ${escapeHtml(prop.notes)}</li>`);\n }\n\n return `\n <section class=\"doc-property\">\n <h3><code>${escapeHtml(prop.path)}</code></h3>\n <ul>\n ${rows.join('\\n ')}\n </ul>\n </section>`;\n};\n\nconst renderPropertiesSectionHtml = (\n title: string,\n source: string,\n properties: PieDocsPropertyContract[]\n): string => {\n if (properties.length === 0) {\n return `\n <section class=\"doc-section\">\n <h2>${escapeHtml(title)}</h2>\n <p><strong>Source:</strong> <code>${escapeHtml(source)}</code></p>\n <p>No properties found.</p>\n </section>`;\n }\n\n return `\n <section class=\"doc-section\">\n <h2>${escapeHtml(title)}</h2>\n <p><strong>Source:</strong> <code>${escapeHtml(source)}</code></p>\n ${properties.map((prop) => renderPropertyHtml(prop)).join('\\n')}\n </section>`;\n};\n\nconst wrapHtmlPage = (title: string, body: string): string => `\n<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)}</title>\n <style>\n :root { color-scheme: light dark; font-family: Inter, system-ui, sans-serif; }\n body { margin: 0; padding: 1.5rem; line-height: 1.55; }\n h1,h2,h3 { line-height: 1.25; }\n h1 { margin-top: 0; }\n code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\n .doc-section { margin-bottom: 2rem; }\n .doc-property { margin: 0 0 1.25rem 0; padding-bottom: 0.5rem; border-bottom: 1px solid rgba(128,128,128,.25); }\n ul { padding-left: 1.25rem; }\n .meta-list li { margin-bottom: .25rem; }\n </style>\n </head>\n <body>\n ${body}\n </body>\n</html>\n`;\n\nconst renderElementIndexHtml = (opts: {\n contract: PieDocsContract;\n summary: string;\n generatedAt: string;\n emittedViews: string[];\n}): string =>\n wrapHtmlPage(\n `${opts.contract.elementName} docs`,\n `\n <h1>${escapeHtml(opts.contract.elementName)} docs</h1>\n <section class=\"doc-section\">\n <h2>Overview</h2>\n <p>${escapeHtml(opts.summary)}</p>\n </section>\n <section class=\"doc-section\">\n <h2>Element Metadata</h2>\n <ul class=\"meta-list\">\n <li><strong>Element:</strong> <code>${escapeHtml(opts.contract.elementName)}</code></li>\n <li><strong>Package:</strong> <code>${escapeHtml(opts.contract.packageName)}</code></li>\n <li><strong>Framework:</strong> <code>${escapeHtml(opts.contract.framework)}</code></li>\n <li><strong>Generated:</strong> <code>${escapeHtml(opts.generatedAt)}</code></li>\n </ul>\n </section>\n <section class=\"doc-section\">\n <h2>Supported Modes</h2>\n <ul class=\"meta-list\">\n ${(opts.contract.supportedModes || []).map((mode) => `<li>${escapeHtml(mode)}</li>`).join('')}\n </ul>\n </section>\n <section class=\"doc-section\">\n <h2>Views</h2>\n <ul class=\"meta-list\">\n ${opts.emittedViews\n .map(\n (view) =>\n `<li><a href=\"./${encodeURIComponent(view)}.html\">${escapeHtml(view)}</a></li>`\n )\n .join('')}\n </ul>\n </section>\n `\n );\n\nconst renderViewHtml = (opts: {\n contract: PieDocsContract;\n view: string;\n pieSource: string;\n configSource: string;\n pieProperties: PieDocsPropertyContract[];\n configProperties: PieDocsPropertyContract[];\n}): string =>\n wrapHtmlPage(\n `${opts.contract.elementName} ${opts.view} docs`,\n `\n <h1>${escapeHtml(opts.contract.elementName)} / ${escapeHtml(opts.view)}</h1>\n ${renderPropertiesSectionHtml('Model Defaults', opts.pieSource, opts.pieProperties)}\n ${renderPropertiesSectionHtml(\n 'Authoring/Configuration Defaults',\n opts.configSource,\n opts.configProperties\n )}\n `\n );\n\nconst chooseViewDocs = (resolvedViews: ResolvedViewDocs[]): ResolvedViewDocs[] => {\n const map = new Map(resolvedViews.map((v) => [v.view, v]));\n const chosen: ResolvedViewDocs[] = [];\n\n const delivery = map.get('delivery');\n const author = map.get('author');\n const print = map.get('print');\n\n if (delivery) {\n chosen.push(delivery);\n }\n if (author) {\n chosen.push(author);\n }\n\n if (print) {\n const deliveryFingerprint = delivery\n ? `${propertyFingerprint(delivery.pieProperties)}|${propertyFingerprint(delivery.configProperties)}`\n : '';\n const printFingerprint = `${propertyFingerprint(print.pieProperties)}|${propertyFingerprint(print.configProperties)}`;\n const sourceDiffFromDelivery = delivery\n ? print.pieSource !== delivery.pieSource || print.configSource !== delivery.configSource\n : true;\n const sourceDiffFromAuthor = author\n ? print.pieSource !== author.pieSource || print.configSource !== author.configSource\n : true;\n const materiallyDifferent = !delivery || printFingerprint !== deliveryFingerprint;\n if (materiallyDifferent || sourceDiffFromDelivery || sourceDiffFromAuthor) {\n chosen.push(print);\n }\n }\n\n const extras = resolvedViews\n .filter((v) => !['delivery', 'author', 'print'].includes(v.view))\n .sort((a, b) => a.view.localeCompare(b.view));\n for (const extra of extras) {\n chosen.push(extra);\n }\n\n return chosen;\n};\n\nexport const generateDocsForContract = async (\n packageDir: string,\n contract: PieDocsContract,\n options: GenerateDocsOptions\n): Promise<GenerateDocsResult> => {\n const generatedAt = new Date().toISOString();\n const summary = await readSummary(packageDir, contract.summary);\n const filesWritten: string[] = [];\n const filesChecked: string[] = [];\n const driftFiles: string[] = [];\n const sourcesUsed = new Set<string>();\n\n const outputs: PieDocsElementOutput = {\n contract,\n packageDir,\n generatedAt,\n views: [],\n sourcesUsed: [],\n };\n\n const resolvedViews: ResolvedViewDocs[] = [];\n for (const view of contract.views) {\n const pieResolved = await loadValueWithFallback(packageDir, view.pie, 'pie');\n const configResolved = await loadValueWithFallback(packageDir, view.config, 'config');\n const pieProperties = applyMetadata(\n flattenProperties(pieResolved.value).sort((a, b) => a.path.localeCompare(b.path)),\n view.metadata?.pie\n );\n const configProperties = applyMetadata(\n flattenProperties(configResolved.value).sort((a, b) => a.path.localeCompare(b.path)),\n view.metadata?.config\n );\n\n resolvedViews.push({\n view: view.view,\n pieProperties,\n configProperties,\n pieSource: pieResolved.sourceLabel,\n configSource: configResolved.sourceLabel,\n });\n }\n\n const emittedViews = chooseViewDocs(resolvedViews);\n const elementOutputDir = join(options.outputDir, contract.elementName);\n const elementIndexPath = join(elementOutputDir, 'index.html');\n const elementIndexContent = renderElementIndexHtml({\n contract,\n summary,\n generatedAt,\n emittedViews: emittedViews.map((v) => v.view),\n });\n\n const manifest = {\n elementName: contract.elementName,\n packageName: contract.packageName,\n framework: contract.framework,\n generatedAt,\n summary,\n supportedModes: contract.supportedModes || [],\n views: emittedViews.map((view) => ({\n id: view.view,\n file: `${view.view}.html`,\n pieSource: view.pieSource,\n configSource: view.configSource,\n hasModelDefaults: view.pieProperties.length > 0,\n hasConfigDefaults: view.configProperties.length > 0,\n })),\n };\n\n const candidates: Array<{ path: string; content: string }> = [\n { path: elementIndexPath, content: elementIndexContent },\n {\n path: join(elementOutputDir, 'manifest.json'),\n content: `${JSON.stringify(manifest, null, 2)}\\n`,\n },\n ...emittedViews.map((view) => ({\n path: join(elementOutputDir, `${view.view}.html`),\n content: renderViewHtml({\n contract,\n view: view.view,\n pieSource: view.pieSource,\n configSource: view.configSource,\n pieProperties: view.pieProperties,\n configProperties: view.configProperties,\n }),\n })),\n ];\n\n for (const candidate of candidates) {\n filesChecked.push(candidate.path);\n if (options.check) {\n const existing = existsSync(candidate.path) ? await readFile(candidate.path, 'utf-8') : null;\n if (\n existing === null ||\n normalizeForCheck(candidate.path, existing) !==\n normalizeForCheck(candidate.path, candidate.content)\n ) {\n driftFiles.push(candidate.path);\n }\n continue;\n }\n\n if (!options.dryRun) {\n await mkdir(elementOutputDir, { recursive: true });\n await writeFile(candidate.path, candidate.content, 'utf-8');\n }\n filesWritten.push(candidate.path);\n }\n\n for (const view of emittedViews) {\n sourcesUsed.add(view.pieSource);\n sourcesUsed.add(view.configSource);\n outputs.views.push({\n view: view.view,\n pieProperties: view.pieProperties,\n configProperties: view.configProperties,\n });\n }\n\n outputs.sourcesUsed = Array.from(sourcesUsed).sort();\n\n return {\n filesWritten,\n filesChecked,\n driftFiles,\n outputs: [outputs],\n };\n};\n\nexport const toRelativePaths = (rootDir: string, paths: string[]): string[] =>\n paths.map((p) => relative(rootDir, p)).sort();\n"]}
@@ -0,0 +1,2 @@
1
+ import type { PieDocsSourcePointer } from './types.js';
2
+ export declare const loadPointerValue: (packageDir: string, pointer: PieDocsSourcePointer) => Promise<unknown>;