@usefragments/core 1.0.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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-243QYRUF.js +2145 -0
  3. package/dist/chunk-243QYRUF.js.map +1 -0
  4. package/dist/chunk-3LLRNCPX.js +111 -0
  5. package/dist/chunk-3LLRNCPX.js.map +1 -0
  6. package/dist/chunk-EIYNNS77.js +48 -0
  7. package/dist/chunk-EIYNNS77.js.map +1 -0
  8. package/dist/chunk-JNBFJ34I.js +326 -0
  9. package/dist/chunk-JNBFJ34I.js.map +1 -0
  10. package/dist/chunk-R3X7UBHU.js +228 -0
  11. package/dist/chunk-R3X7UBHU.js.map +1 -0
  12. package/dist/chunk-SH4KPIYH.js +393 -0
  13. package/dist/chunk-SH4KPIYH.js.map +1 -0
  14. package/dist/chunk-V4VQB57N.js +56 -0
  15. package/dist/chunk-V4VQB57N.js.map +1 -0
  16. package/dist/chunk-X34IA4LR.js +319 -0
  17. package/dist/chunk-X34IA4LR.js.map +1 -0
  18. package/dist/chunk-YF65VYRY.js +493 -0
  19. package/dist/chunk-YF65VYRY.js.map +1 -0
  20. package/dist/codes/index.d.ts +40 -0
  21. package/dist/codes/index.js +23 -0
  22. package/dist/codes/index.js.map +1 -0
  23. package/dist/compiled-types/index.d.ts +5 -0
  24. package/dist/compiled-types/index.js +1 -0
  25. package/dist/compiled-types/index.js.map +1 -0
  26. package/dist/generate/index.d.ts +47 -0
  27. package/dist/generate/index.js +11 -0
  28. package/dist/generate/index.js.map +1 -0
  29. package/dist/governance-BOa3KyiJ.d.ts +3279 -0
  30. package/dist/graph/index.d.ts +66 -0
  31. package/dist/graph/index.js +17 -0
  32. package/dist/graph/index.js.map +1 -0
  33. package/dist/index.d.ts +11388 -0
  34. package/dist/index.js +8711 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/package-identity.d.ts +42 -0
  37. package/dist/package-identity.js +23 -0
  38. package/dist/package-identity.js.map +1 -0
  39. package/dist/preview/index.d.ts +484 -0
  40. package/dist/preview/index.js +1129 -0
  41. package/dist/preview/index.js.map +1 -0
  42. package/dist/react-types.d.ts +22 -0
  43. package/dist/react-types.js +1 -0
  44. package/dist/react-types.js.map +1 -0
  45. package/dist/registry.d.ts +2367 -0
  46. package/dist/registry.js +62 -0
  47. package/dist/registry.js.map +1 -0
  48. package/dist/schemas/index.d.ts +2584 -0
  49. package/dist/schemas/index.js +55 -0
  50. package/dist/schemas/index.js.map +1 -0
  51. package/dist/severity.d.ts +18 -0
  52. package/dist/severity.js +27 -0
  53. package/dist/severity.js.map +1 -0
  54. package/dist/test-utils.d.ts +14 -0
  55. package/dist/test-utils.js +63 -0
  56. package/dist/test-utils.js.map +1 -0
  57. package/dist/topology/index.d.ts +48 -0
  58. package/dist/topology/index.js +7 -0
  59. package/dist/topology/index.js.map +1 -0
  60. package/dist/types-xJ2xyp_G.d.ts +119 -0
  61. package/package.json +120 -0
  62. package/src/__tests__/contract-parser.test.ts +614 -0
  63. package/src/__tests__/dtcg-generators.test.ts +439 -0
  64. package/src/__tests__/dtcg-parser.test.ts +884 -0
  65. package/src/__tests__/preview-runtime.test.tsx +111 -0
  66. package/src/__tests__/schema.test.ts +31 -0
  67. package/src/__tests__/severity.test.ts +34 -0
  68. package/src/__tests__/style-comparison.test.ts +662 -0
  69. package/src/__tests__/tokens-compat.test.ts +51 -0
  70. package/src/agent-format.test.ts +105 -0
  71. package/src/agent-format.ts +141 -0
  72. package/src/bundle.ts +149 -0
  73. package/src/codes/__tests__/codes.test.ts +73 -0
  74. package/src/codes/codes.ts +463 -0
  75. package/src/codes/index.ts +7 -0
  76. package/src/codes/source-finding-bridge.ts +113 -0
  77. package/src/compiled-types/index.ts +293 -0
  78. package/src/component-contract.ts +231 -0
  79. package/src/component-discovery.ts +80 -0
  80. package/src/composition.test.ts +262 -0
  81. package/src/composition.ts +318 -0
  82. package/src/config-paths.test.ts +78 -0
  83. package/src/config-paths.ts +47 -0
  84. package/src/config.ts +18 -0
  85. package/src/conform-prove.test.ts +274 -0
  86. package/src/conform-prove.ts +326 -0
  87. package/src/conform.ts +160 -0
  88. package/src/constants.ts +114 -0
  89. package/src/context.ts +2 -0
  90. package/src/contract/fixture.ts +110 -0
  91. package/src/contract/hash.test.ts +86 -0
  92. package/src/contract/hash.ts +195 -0
  93. package/src/contract/index.ts +43 -0
  94. package/src/contract/preimage.test.ts +254 -0
  95. package/src/contract/preimage.ts +365 -0
  96. package/src/contract/stamp.test.ts +100 -0
  97. package/src/contract/stamp.ts +105 -0
  98. package/src/contract-parser.ts +141 -0
  99. package/src/defineFragment.test.ts +257 -0
  100. package/src/defineFragment.ts +293 -0
  101. package/src/dtcg-generators.ts +324 -0
  102. package/src/dtcg-parser.ts +1 -0
  103. package/src/dtcg.ts +237 -0
  104. package/src/facts/__snapshots__/facts.test.ts.snap +124 -0
  105. package/src/facts/builders.ts +835 -0
  106. package/src/facts/compile.ts +422 -0
  107. package/src/facts/fact-index.ts +394 -0
  108. package/src/facts/facts.test.ts +494 -0
  109. package/src/facts/ids.ts +125 -0
  110. package/src/facts/index.ts +119 -0
  111. package/src/facts/types.ts +614 -0
  112. package/src/figma.ts +263 -0
  113. package/src/fragment-types.ts +214 -0
  114. package/src/generate/generate.test.ts +594 -0
  115. package/src/generate/index.ts +438 -0
  116. package/src/governance-integrity.test.ts +186 -0
  117. package/src/governance-integrity.ts +282 -0
  118. package/src/governance.test.ts +300 -0
  119. package/src/governance.ts +605 -0
  120. package/src/governance.type-test.ts +75 -0
  121. package/src/graph/engine.ts +446 -0
  122. package/src/graph/graph.test.ts +746 -0
  123. package/src/graph/index.ts +32 -0
  124. package/src/graph/serialization.ts +55 -0
  125. package/src/graph/types.ts +178 -0
  126. package/src/index.ts +891 -0
  127. package/src/local-canonical.ts +102 -0
  128. package/src/mcp-snapshot.ts +222 -0
  129. package/src/package-identity-match.ts +33 -0
  130. package/src/package-identity.generated.ts +233 -0
  131. package/src/package-identity.test.ts +99 -0
  132. package/src/package-identity.ts +157 -0
  133. package/src/performance-presets.ts +142 -0
  134. package/src/preview/comparison-artifact.test.ts +228 -0
  135. package/src/preview/comparison-artifact.ts +181 -0
  136. package/src/preview/comparison-context.ts +93 -0
  137. package/src/preview/comparison-evidence.ts +112 -0
  138. package/src/preview/comparison-format.ts +21 -0
  139. package/src/preview/comparison-presentation.ts +187 -0
  140. package/src/preview/comparison-references.test.ts +430 -0
  141. package/src/preview/comparison-references.ts +72 -0
  142. package/src/preview/comparison-score.ts +59 -0
  143. package/src/preview/comparison-styles.ts +197 -0
  144. package/src/preview/comparison.test.ts +559 -0
  145. package/src/preview/comparison.ts +488 -0
  146. package/src/preview/index.ts +10 -0
  147. package/src/preview/types.ts +309 -0
  148. package/src/preview/validation.test.ts +290 -0
  149. package/src/preview/validation.ts +356 -0
  150. package/src/preview-runtime.tsx +144 -0
  151. package/src/raw-html-canonical.test.ts +41 -0
  152. package/src/raw-html-canonical.ts +179 -0
  153. package/src/react-types.ts +21 -0
  154. package/src/registry-install-plan.ts +344 -0
  155. package/src/registry.test.ts +245 -0
  156. package/src/registry.ts +369 -0
  157. package/src/rules/a11y-required-accessible-name.ts +93 -0
  158. package/src/rules/color-math.test.ts +72 -0
  159. package/src/rules/color-math.ts +192 -0
  160. package/src/rules/components-forbidden-prop-value.ts +108 -0
  161. package/src/rules/components-prefer-library.ts +943 -0
  162. package/src/rules/components-unknown-prop.ts +94 -0
  163. package/src/rules/composition-pattern-schema.ts +125 -0
  164. package/src/rules/composition-pattern.test.ts +320 -0
  165. package/src/rules/composition-pattern.ts +271 -0
  166. package/src/rules/emit-gate.test.ts +42 -0
  167. package/src/rules/emit-gate.ts +60 -0
  168. package/src/rules/finding.ts +54 -0
  169. package/src/rules/index.ts +235 -0
  170. package/src/rules/jsx-preferred-component.ts +68 -0
  171. package/src/rules/jsx-preferred-import-path.ts +67 -0
  172. package/src/rules/presets.ts +57 -0
  173. package/src/rules/props-invalid-value.ts +115 -0
  174. package/src/rules/rules.test.ts +3636 -0
  175. package/src/rules/spacing-resolution.ts +184 -0
  176. package/src/rules/styles-no-raw-color.ts +329 -0
  177. package/src/rules/styles-no-raw-dimensions.ts +357 -0
  178. package/src/rules/styles-no-raw-spacing.ts +236 -0
  179. package/src/rules/styles-no-raw-typography.ts +237 -0
  180. package/src/rules/tailwind-arbitrary-color.test.ts +128 -0
  181. package/src/rules/tailwind-arbitrary-color.ts +93 -0
  182. package/src/rules/tailwind-arbitrary-spacing.test.ts +157 -0
  183. package/src/rules/tailwind-arbitrary-spacing.ts +120 -0
  184. package/src/rules/tailwind-forbidden-palette.test.ts +116 -0
  185. package/src/rules/tailwind-forbidden-palette.ts +107 -0
  186. package/src/rules/tailwind-off-scale-spacing-token.test.ts +100 -0
  187. package/src/rules/tailwind-off-scale-spacing-token.ts +108 -0
  188. package/src/rules/tailwind-raw-color-via-token.test.ts +108 -0
  189. package/src/rules/tailwind-raw-color-via-token.ts +82 -0
  190. package/src/rules/tailwind-rule-utils.ts +106 -0
  191. package/src/rules/tailwind-unknown-class.test.ts +157 -0
  192. package/src/rules/tailwind-unknown-class.ts +121 -0
  193. package/src/rules/taxonomy.test.ts +238 -0
  194. package/src/rules/theme-no-theme-coupled-literal.ts +132 -0
  195. package/src/rules/tiers.ts +111 -0
  196. package/src/rules/tokens-css-vars-must-be-defined.test.ts +244 -0
  197. package/src/rules/tokens-css-vars-must-be-defined.ts +156 -0
  198. package/src/rules/tokens-require-dual-fallback.ts +78 -0
  199. package/src/rules/types.ts +27 -0
  200. package/src/rules/utils.test.ts +110 -0
  201. package/src/rules/utils.ts +599 -0
  202. package/src/schema.ts +427 -0
  203. package/src/schemas/index.ts +275 -0
  204. package/src/schemas/schemas.test.ts +124 -0
  205. package/src/severity.ts +54 -0
  206. package/src/storyAdapter.test.ts +571 -0
  207. package/src/storyAdapter.ts +761 -0
  208. package/src/storyFilters.test.ts +350 -0
  209. package/src/storyFilters.ts +253 -0
  210. package/src/storybook-csf.ts +11 -0
  211. package/src/style-comparison.ts +423 -0
  212. package/src/test-utils.ts +68 -0
  213. package/src/token-parser.ts +2 -0
  214. package/src/token-types.ts +287 -0
  215. package/src/tokens/categories.ts +131 -0
  216. package/src/tokens/color.ts +193 -0
  217. package/src/tokens/design-token-parser.test.ts +159 -0
  218. package/src/tokens/design-token-parser.ts +402 -0
  219. package/src/tokens/dtcg.ts +428 -0
  220. package/src/tokens/index.ts +130 -0
  221. package/src/tokens/lookup.ts +19 -0
  222. package/src/tokens/scss.ts +171 -0
  223. package/src/tokens/tailwind-v4.ts +187 -0
  224. package/src/tokens/types.ts +43 -0
  225. package/src/topology/index.ts +9 -0
  226. package/src/topology/resolve-area.test.ts +174 -0
  227. package/src/topology/resolve-area.ts +215 -0
  228. package/src/types.ts +1057 -0
@@ -0,0 +1,493 @@
1
+ import {
2
+ portableRepoPathError
3
+ } from "./chunk-EIYNNS77.js";
4
+
5
+ // src/registry.ts
6
+ import { z } from "zod";
7
+
8
+ // src/contract/hash.ts
9
+ function normalizeNumber(value) {
10
+ if (Number.isNaN(value)) return '"@num:nan"';
11
+ if (value === Infinity) return '"@num:+inf"';
12
+ if (value === -Infinity) return '"@num:-inf"';
13
+ if (Object.is(value, -0)) return "0";
14
+ return JSON.stringify(value);
15
+ }
16
+ function canonicalPreimage(value) {
17
+ if (value === void 0 || value === null) return "null";
18
+ const type = typeof value;
19
+ if (type === "number") return normalizeNumber(value);
20
+ if (type === "string" || type === "boolean") return JSON.stringify(value);
21
+ if (type === "bigint") return JSON.stringify(value.toString());
22
+ if (Array.isArray(value)) {
23
+ return `[${value.map(canonicalPreimage).join(",")}]`;
24
+ }
25
+ if (type !== "object") {
26
+ return "null";
27
+ }
28
+ const entries = Object.entries(value).filter(([, v]) => v !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
29
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalPreimage(v)}`).join(",")}}`;
30
+ }
31
+ var K = new Uint32Array([
32
+ 1116352408,
33
+ 1899447441,
34
+ 3049323471,
35
+ 3921009573,
36
+ 961987163,
37
+ 1508970993,
38
+ 2453635748,
39
+ 2870763221,
40
+ 3624381080,
41
+ 310598401,
42
+ 607225278,
43
+ 1426881987,
44
+ 1925078388,
45
+ 2162078206,
46
+ 2614888103,
47
+ 3248222580,
48
+ 3835390401,
49
+ 4022224774,
50
+ 264347078,
51
+ 604807628,
52
+ 770255983,
53
+ 1249150122,
54
+ 1555081692,
55
+ 1996064986,
56
+ 2554220882,
57
+ 2821834349,
58
+ 2952996808,
59
+ 3210313671,
60
+ 3336571891,
61
+ 3584528711,
62
+ 113926993,
63
+ 338241895,
64
+ 666307205,
65
+ 773529912,
66
+ 1294757372,
67
+ 1396182291,
68
+ 1695183700,
69
+ 1986661051,
70
+ 2177026350,
71
+ 2456956037,
72
+ 2730485921,
73
+ 2820302411,
74
+ 3259730800,
75
+ 3345764771,
76
+ 3516065817,
77
+ 3600352804,
78
+ 4094571909,
79
+ 275423344,
80
+ 430227734,
81
+ 506948616,
82
+ 659060556,
83
+ 883997877,
84
+ 958139571,
85
+ 1322822218,
86
+ 1537002063,
87
+ 1747873779,
88
+ 1955562222,
89
+ 2024104815,
90
+ 2227730452,
91
+ 2361852424,
92
+ 2428436474,
93
+ 2756734187,
94
+ 3204031479,
95
+ 3329325298
96
+ ]);
97
+ function rotr(value, bits) {
98
+ return (value >>> bits | value << 32 - bits) >>> 0;
99
+ }
100
+ function sha256Hex(message) {
101
+ const bytes = new TextEncoder().encode(message);
102
+ const length = bytes.length;
103
+ const bitLength = length * 8;
104
+ const withMarker = length + 1;
105
+ const zeroPad = (56 - withMarker % 64 + 64) % 64;
106
+ const total = withMarker + zeroPad + 8;
107
+ const buffer = new Uint8Array(total);
108
+ buffer.set(bytes, 0);
109
+ buffer[length] = 128;
110
+ const view = new DataView(buffer.buffer);
111
+ view.setUint32(total - 8, Math.floor(bitLength / 4294967296));
112
+ view.setUint32(total - 4, bitLength >>> 0);
113
+ let h0 = 1779033703;
114
+ let h1 = 3144134277;
115
+ let h2 = 1013904242;
116
+ let h3 = 2773480762;
117
+ let h4 = 1359893119;
118
+ let h5 = 2600822924;
119
+ let h6 = 528734635;
120
+ let h7 = 1541459225;
121
+ const w = new Uint32Array(64);
122
+ for (let chunk = 0; chunk < total; chunk += 64) {
123
+ for (let t = 0; t < 16; t++) w[t] = view.getUint32(chunk + t * 4);
124
+ for (let t = 16; t < 64; t++) {
125
+ const w15 = w[t - 15];
126
+ const w2 = w[t - 2];
127
+ const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ w15 >>> 3;
128
+ const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ w2 >>> 10;
129
+ w[t] = w[t - 16] + s0 + w[t - 7] + s1 >>> 0;
130
+ }
131
+ let a = h0;
132
+ let b = h1;
133
+ let c = h2;
134
+ let d = h3;
135
+ let e = h4;
136
+ let f = h5;
137
+ let g = h6;
138
+ let h = h7;
139
+ for (let t = 0; t < 64; t++) {
140
+ const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
141
+ const ch = e & f ^ ~e & g;
142
+ const temp1 = h + s1 + ch + K[t] + w[t] >>> 0;
143
+ const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
144
+ const maj = a & b ^ a & c ^ b & c;
145
+ const temp2 = s0 + maj >>> 0;
146
+ h = g;
147
+ g = f;
148
+ f = e;
149
+ e = d + temp1 >>> 0;
150
+ d = c;
151
+ c = b;
152
+ b = a;
153
+ a = temp1 + temp2 >>> 0;
154
+ }
155
+ h0 = h0 + a >>> 0;
156
+ h1 = h1 + b >>> 0;
157
+ h2 = h2 + c >>> 0;
158
+ h3 = h3 + d >>> 0;
159
+ h4 = h4 + e >>> 0;
160
+ h5 = h5 + f >>> 0;
161
+ h6 = h6 + g >>> 0;
162
+ h7 = h7 + h >>> 0;
163
+ }
164
+ return [h0, h1, h2, h3, h4, h5, h6, h7].map((value) => value.toString(16).padStart(8, "0")).join("");
165
+ }
166
+ function contractHash(body) {
167
+ return sha256Hex(canonicalPreimage(body));
168
+ }
169
+
170
+ // src/registry.ts
171
+ var REGISTRY_MANIFEST_SCHEMA_VERSION = "fragments.registry.v1";
172
+ var REGISTRY_ARTIFACT_SCHEMA_VERSION = "fragments.registry-artifact.v1";
173
+ var REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION = "fragments.registry-lock.v1";
174
+ var sha256Schema = z.string().regex(/^[0-9a-f]{64}$/);
175
+ var registryPathSchema = z.string().min(1).superRefine((value, ctx) => {
176
+ const error = portableRepoPathError(value);
177
+ if (error) {
178
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: error });
179
+ }
180
+ });
181
+ var registryFilePathSchema = registryPathSchema.superRefine((value, ctx) => {
182
+ if (value === ".") {
183
+ ctx.addIssue({
184
+ code: z.ZodIssueCode.custom,
185
+ message: "File path must point to a file, not the package root"
186
+ });
187
+ }
188
+ });
189
+ var registryDependencyTypeSchema = z.enum(["runtime", "peer", "dev", "optional"]);
190
+ var registryDependencySchema = z.object({
191
+ name: z.string().min(1),
192
+ versionRange: z.string().min(1),
193
+ type: registryDependencyTypeSchema,
194
+ optional: z.boolean().optional()
195
+ });
196
+ var registryFileRoleSchema = z.enum([
197
+ "source",
198
+ "style",
199
+ "token",
200
+ "contract",
201
+ "test",
202
+ "story",
203
+ "example",
204
+ "asset",
205
+ "barrel",
206
+ "metadata"
207
+ ]);
208
+ var registryFileSchema = z.object({
209
+ path: registryFilePathSchema,
210
+ role: registryFileRoleSchema,
211
+ sha256: sha256Schema,
212
+ size: z.number().int().nonnegative(),
213
+ contentType: z.string().min(1),
214
+ contentRef: z.string().min(1)
215
+ });
216
+ var registryFileContentSchema = z.object({
217
+ path: registryFilePathSchema,
218
+ content: z.string(),
219
+ sha256: sha256Schema,
220
+ size: z.number().int().nonnegative(),
221
+ contentType: z.string().min(1)
222
+ });
223
+ var registrySourceSchema = z.discriminatedUnion("kind", [
224
+ z.object({
225
+ kind: z.literal("package"),
226
+ packageName: z.string().min(1),
227
+ version: z.string().optional(),
228
+ rootPath: registryPathSchema.optional(),
229
+ commitSha: z.string().optional()
230
+ }),
231
+ z.object({
232
+ kind: z.literal("github"),
233
+ repoFullName: z.string().min(1),
234
+ commitSha: z.string().min(1),
235
+ path: registryPathSchema.optional()
236
+ }),
237
+ z.object({
238
+ kind: z.literal("local"),
239
+ rootPath: registryPathSchema.optional(),
240
+ commitSha: z.string().optional()
241
+ }),
242
+ z.object({
243
+ kind: z.literal("manual"),
244
+ label: z.string().min(1)
245
+ })
246
+ ]);
247
+ var registryComponentExportSchema = z.object({
248
+ name: z.string().min(1),
249
+ kind: z.enum(["component", "hook", "utility", "type", "style"]).default("component"),
250
+ path: registryFilePathSchema.optional()
251
+ });
252
+ var registryComponentSchema = z.object({
253
+ componentId: z.string().min(1),
254
+ publicRef: z.string().min(1),
255
+ name: z.string().min(1),
256
+ status: z.string().min(1).default("stable"),
257
+ tier: z.enum(["core", "composition", "utility", "custom"]).default("core"),
258
+ category: z.string().optional(),
259
+ files: z.array(registryFileSchema).min(1),
260
+ styleFiles: z.array(registryFilePathSchema).default([]),
261
+ tokenDependencies: z.array(z.string().min(1)).default([]),
262
+ runtimeDependencies: z.array(registryDependencySchema).default([]),
263
+ peerDependencies: z.array(registryDependencySchema).default([]),
264
+ internalDependencies: z.array(z.string().min(1)).default([]),
265
+ exports: z.array(registryComponentExportSchema).default([]),
266
+ contract: z.unknown().optional(),
267
+ examples: z.array(z.unknown()).default([]),
268
+ provenance: z.record(z.unknown()).default({})
269
+ });
270
+ var registryEntrypointSchema = z.object({
271
+ specifier: z.string().min(1),
272
+ sourcePath: registryFilePathSchema
273
+ });
274
+ var registryInstallProfileSchema = z.object({
275
+ name: z.string().min(1),
276
+ targetPath: registryPathSchema,
277
+ importPath: z.string().min(1),
278
+ stylePath: registryPathSchema.optional(),
279
+ includeTests: z.boolean().default(false)
280
+ });
281
+ var registryManifestBaseSchema = z.object({
282
+ schemaVersion: z.literal(REGISTRY_MANIFEST_SCHEMA_VERSION),
283
+ registryId: z.string().min(1),
284
+ name: z.string().min(1),
285
+ channel: z.string().min(1),
286
+ version: z.string().min(1),
287
+ contractVersionId: z.string().optional(),
288
+ fcid: sha256Schema.optional(),
289
+ generatedAt: z.string().datetime(),
290
+ source: registrySourceSchema,
291
+ packageFiles: z.array(registryFileSchema).default([]),
292
+ entrypoints: z.array(registryEntrypointSchema).default([]),
293
+ components: z.record(z.string(), registryComponentSchema),
294
+ dependencies: z.array(registryDependencySchema).default([]),
295
+ installProfiles: z.array(registryInstallProfileSchema).default([])
296
+ });
297
+ var registryManifestDraftSchema = registryManifestBaseSchema;
298
+ var registryManifestSchema = registryManifestBaseSchema.extend({
299
+ registryHash: sha256Schema
300
+ });
301
+ var registryArtifactSchema = z.object({
302
+ schemaVersion: z.literal(REGISTRY_ARTIFACT_SCHEMA_VERSION),
303
+ manifest: registryManifestSchema,
304
+ files: z.record(registryFilePathSchema, registryFileContentSchema)
305
+ }).superRefine((artifact, ctx) => {
306
+ const filesByPath = artifact.files;
307
+ for (const [path, content] of Object.entries(filesByPath)) {
308
+ if (content.path !== path) {
309
+ ctx.addIssue({
310
+ code: z.ZodIssueCode.custom,
311
+ path: ["files", path, "path"],
312
+ message: `Registry file map key ${path} does not match content path ${content.path}`
313
+ });
314
+ }
315
+ }
316
+ const manifestFiles = [
317
+ ...artifact.manifest.packageFiles,
318
+ ...artifact.manifest.entrypoints.map((entrypoint) => ({
319
+ path: entrypoint.sourcePath,
320
+ role: "barrel",
321
+ sha256: filesByPath[entrypoint.sourcePath]?.sha256 ?? "",
322
+ size: filesByPath[entrypoint.sourcePath]?.size ?? 0,
323
+ contentType: filesByPath[entrypoint.sourcePath]?.contentType ?? "text/plain",
324
+ contentRef: `sha256:${filesByPath[entrypoint.sourcePath]?.sha256 ?? ""}`
325
+ })),
326
+ ...Object.values(artifact.manifest.components).flatMap((component) => component.files)
327
+ ];
328
+ for (const file of manifestFiles) {
329
+ const content = filesByPath[file.path];
330
+ if (!content) {
331
+ ctx.addIssue({
332
+ code: z.ZodIssueCode.custom,
333
+ path: ["files", file.path],
334
+ message: `Missing content for registry file ${file.path}`
335
+ });
336
+ continue;
337
+ }
338
+ if (content.sha256 !== file.sha256) {
339
+ ctx.addIssue({
340
+ code: z.ZodIssueCode.custom,
341
+ path: ["files", file.path, "sha256"],
342
+ message: `Content hash for ${file.path} does not match manifest`
343
+ });
344
+ }
345
+ if (content.size !== file.size) {
346
+ ctx.addIssue({
347
+ code: z.ZodIssueCode.custom,
348
+ path: ["files", file.path, "size"],
349
+ message: `Content size for ${file.path} does not match manifest`
350
+ });
351
+ }
352
+ }
353
+ });
354
+ var registryInstallReceiptFileSchema = z.object({
355
+ path: registryFilePathSchema,
356
+ sha256: sha256Schema,
357
+ sourcePath: registryFilePathSchema,
358
+ componentId: z.string().min(1).optional()
359
+ });
360
+ var registryInstallReceiptComponentSchema = z.object({
361
+ componentId: z.string().min(1),
362
+ publicRef: z.string().min(1),
363
+ name: z.string().min(1),
364
+ files: z.array(registryFilePathSchema)
365
+ });
366
+ var registryInstallReceiptSchema = z.object({
367
+ schemaVersion: z.literal(REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION),
368
+ registryId: z.string().min(1),
369
+ registryVersion: z.string().min(1),
370
+ registryHash: sha256Schema,
371
+ fcid: sha256Schema.optional(),
372
+ channel: z.string().min(1).optional(),
373
+ targetPath: registryPathSchema,
374
+ importPath: z.string().min(1),
375
+ installedComponents: z.array(registryInstallReceiptComponentSchema),
376
+ files: z.array(registryInstallReceiptFileSchema),
377
+ dependencies: z.array(registryDependencySchema).default([]),
378
+ installedAt: z.string().datetime()
379
+ });
380
+ function registryHashPayload(manifest) {
381
+ const { generatedAt: _generatedAt, ...withoutGeneratedAt } = manifest;
382
+ if ("registryHash" in withoutGeneratedAt) {
383
+ const { registryHash: _registryHash, ...withoutHash } = withoutGeneratedAt;
384
+ return withoutHash;
385
+ }
386
+ return withoutGeneratedAt;
387
+ }
388
+ function computeRegistryHash(manifest) {
389
+ return contractHash(registryHashPayload(manifest));
390
+ }
391
+ function finalizeRegistryManifest(input) {
392
+ const draft = registryManifestDraftSchema.parse(input);
393
+ return registryManifestSchema.parse({
394
+ ...draft,
395
+ registryHash: computeRegistryHash(draft)
396
+ });
397
+ }
398
+ function hashRegistryFileContent(content) {
399
+ return sha256Hex(content);
400
+ }
401
+ function registryFileSize(content) {
402
+ return new TextEncoder().encode(content).length;
403
+ }
404
+ function buildRegistryFile(input) {
405
+ const sha256 = hashRegistryFileContent(input.content);
406
+ const size = registryFileSize(input.content);
407
+ const path = registryFilePathSchema.parse(input.path);
408
+ const contentType = z.string().min(1).parse(input.contentType);
409
+ return {
410
+ metadata: registryFileSchema.parse({
411
+ path,
412
+ role: input.role,
413
+ sha256,
414
+ size,
415
+ contentType,
416
+ contentRef: input.contentRef ?? `sha256:${sha256}`
417
+ }),
418
+ content: registryFileContentSchema.parse({
419
+ path,
420
+ content: input.content,
421
+ sha256,
422
+ size,
423
+ contentType
424
+ })
425
+ };
426
+ }
427
+ function buildRegistryArtifact(input) {
428
+ const manifest = finalizeRegistryManifest(input.manifest);
429
+ const files = /* @__PURE__ */ new Map();
430
+ for (const file of input.files) {
431
+ const content = registryFileContentSchema.parse(file);
432
+ if (files.has(content.path)) {
433
+ throw new Error(`Duplicate registry file content for ${content.path}`);
434
+ }
435
+ files.set(content.path, content);
436
+ }
437
+ return registryArtifactSchema.parse({
438
+ schemaVersion: REGISTRY_ARTIFACT_SCHEMA_VERSION,
439
+ manifest,
440
+ files: Object.fromEntries(files)
441
+ });
442
+ }
443
+ function assertValidRegistryArtifact(artifact) {
444
+ return registryArtifactSchema.parse(artifact);
445
+ }
446
+ function registryArtifactDigest(artifact) {
447
+ const files = Object.fromEntries(
448
+ Object.entries(artifact.files).map(([path, file]) => [path, { sha256: file.sha256, size: file.size }]).sort(([leftPath], [rightPath]) => leftPath.localeCompare(rightPath))
449
+ );
450
+ return contractHash({
451
+ schemaVersion: artifact.schemaVersion,
452
+ manifest: registryHashPayload(artifact.manifest),
453
+ files
454
+ });
455
+ }
456
+ function registryManifestCanonicalPreimage(manifest) {
457
+ return canonicalPreimage(registryHashPayload(manifest));
458
+ }
459
+
460
+ export {
461
+ canonicalPreimage,
462
+ sha256Hex,
463
+ contractHash,
464
+ REGISTRY_MANIFEST_SCHEMA_VERSION,
465
+ REGISTRY_ARTIFACT_SCHEMA_VERSION,
466
+ REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION,
467
+ registryDependencyTypeSchema,
468
+ registryDependencySchema,
469
+ registryFileRoleSchema,
470
+ registryFileSchema,
471
+ registryFileContentSchema,
472
+ registrySourceSchema,
473
+ registryComponentExportSchema,
474
+ registryComponentSchema,
475
+ registryEntrypointSchema,
476
+ registryInstallProfileSchema,
477
+ registryManifestDraftSchema,
478
+ registryManifestSchema,
479
+ registryArtifactSchema,
480
+ registryInstallReceiptFileSchema,
481
+ registryInstallReceiptComponentSchema,
482
+ registryInstallReceiptSchema,
483
+ computeRegistryHash,
484
+ finalizeRegistryManifest,
485
+ hashRegistryFileContent,
486
+ registryFileSize,
487
+ buildRegistryFile,
488
+ buildRegistryArtifact,
489
+ assertValidRegistryArtifact,
490
+ registryArtifactDigest,
491
+ registryManifestCanonicalPreimage
492
+ };
493
+ //# sourceMappingURL=chunk-YF65VYRY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry.ts","../src/contract/hash.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { portableRepoPathError } from \"./config-paths.js\";\nimport { canonicalPreimage, contractHash, sha256Hex } from \"./contract/hash.js\";\n\nexport const REGISTRY_MANIFEST_SCHEMA_VERSION = \"fragments.registry.v1\";\nexport const REGISTRY_ARTIFACT_SCHEMA_VERSION = \"fragments.registry-artifact.v1\";\nexport const REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION = \"fragments.registry-lock.v1\";\n\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/);\n\nconst registryPathSchema = z\n .string()\n .min(1)\n .superRefine((value, ctx) => {\n const error = portableRepoPathError(value);\n if (error) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: error });\n }\n });\n\nconst registryFilePathSchema = registryPathSchema.superRefine((value, ctx) => {\n if (value === \".\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"File path must point to a file, not the package root\",\n });\n }\n});\n\nexport const registryDependencyTypeSchema = z.enum([\"runtime\", \"peer\", \"dev\", \"optional\"]);\n\nexport const registryDependencySchema = z.object({\n name: z.string().min(1),\n versionRange: z.string().min(1),\n type: registryDependencyTypeSchema,\n optional: z.boolean().optional(),\n});\n\nexport const registryFileRoleSchema = z.enum([\n \"source\",\n \"style\",\n \"token\",\n \"contract\",\n \"test\",\n \"story\",\n \"example\",\n \"asset\",\n \"barrel\",\n \"metadata\",\n]);\n\nexport const registryFileSchema = z.object({\n path: registryFilePathSchema,\n role: registryFileRoleSchema,\n sha256: sha256Schema,\n size: z.number().int().nonnegative(),\n contentType: z.string().min(1),\n contentRef: z.string().min(1),\n});\n\nexport const registryFileContentSchema = z.object({\n path: registryFilePathSchema,\n content: z.string(),\n sha256: sha256Schema,\n size: z.number().int().nonnegative(),\n contentType: z.string().min(1),\n});\n\nexport const registrySourceSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"package\"),\n packageName: z.string().min(1),\n version: z.string().optional(),\n rootPath: registryPathSchema.optional(),\n commitSha: z.string().optional(),\n }),\n z.object({\n kind: z.literal(\"github\"),\n repoFullName: z.string().min(1),\n commitSha: z.string().min(1),\n path: registryPathSchema.optional(),\n }),\n z.object({\n kind: z.literal(\"local\"),\n rootPath: registryPathSchema.optional(),\n commitSha: z.string().optional(),\n }),\n z.object({\n kind: z.literal(\"manual\"),\n label: z.string().min(1),\n }),\n]);\n\nexport const registryComponentExportSchema = z.object({\n name: z.string().min(1),\n kind: z.enum([\"component\", \"hook\", \"utility\", \"type\", \"style\"]).default(\"component\"),\n path: registryFilePathSchema.optional(),\n});\n\nexport const registryComponentSchema = z.object({\n componentId: z.string().min(1),\n publicRef: z.string().min(1),\n name: z.string().min(1),\n status: z.string().min(1).default(\"stable\"),\n tier: z.enum([\"core\", \"composition\", \"utility\", \"custom\"]).default(\"core\"),\n category: z.string().optional(),\n files: z.array(registryFileSchema).min(1),\n styleFiles: z.array(registryFilePathSchema).default([]),\n tokenDependencies: z.array(z.string().min(1)).default([]),\n runtimeDependencies: z.array(registryDependencySchema).default([]),\n peerDependencies: z.array(registryDependencySchema).default([]),\n internalDependencies: z.array(z.string().min(1)).default([]),\n exports: z.array(registryComponentExportSchema).default([]),\n contract: z.unknown().optional(),\n examples: z.array(z.unknown()).default([]),\n provenance: z.record(z.unknown()).default({}),\n});\n\nexport const registryEntrypointSchema = z.object({\n specifier: z.string().min(1),\n sourcePath: registryFilePathSchema,\n});\n\nexport const registryInstallProfileSchema = z.object({\n name: z.string().min(1),\n targetPath: registryPathSchema,\n importPath: z.string().min(1),\n stylePath: registryPathSchema.optional(),\n includeTests: z.boolean().default(false),\n});\n\nconst registryManifestBaseSchema = z.object({\n schemaVersion: z.literal(REGISTRY_MANIFEST_SCHEMA_VERSION),\n registryId: z.string().min(1),\n name: z.string().min(1),\n channel: z.string().min(1),\n version: z.string().min(1),\n contractVersionId: z.string().optional(),\n fcid: sha256Schema.optional(),\n generatedAt: z.string().datetime(),\n source: registrySourceSchema,\n packageFiles: z.array(registryFileSchema).default([]),\n entrypoints: z.array(registryEntrypointSchema).default([]),\n components: z.record(z.string(), registryComponentSchema),\n dependencies: z.array(registryDependencySchema).default([]),\n installProfiles: z.array(registryInstallProfileSchema).default([]),\n});\n\nexport const registryManifestDraftSchema = registryManifestBaseSchema;\n\nexport const registryManifestSchema = registryManifestBaseSchema.extend({\n registryHash: sha256Schema,\n});\n\nexport const registryArtifactSchema = z\n .object({\n schemaVersion: z.literal(REGISTRY_ARTIFACT_SCHEMA_VERSION),\n manifest: registryManifestSchema,\n files: z.record(registryFilePathSchema, registryFileContentSchema),\n })\n .superRefine((artifact, ctx) => {\n const filesByPath = artifact.files;\n for (const [path, content] of Object.entries(filesByPath)) {\n if (content.path !== path) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"files\", path, \"path\"],\n message: `Registry file map key ${path} does not match content path ${content.path}`,\n });\n }\n }\n\n const manifestFiles = [\n ...artifact.manifest.packageFiles,\n ...artifact.manifest.entrypoints.map((entrypoint) => ({\n path: entrypoint.sourcePath,\n role: \"barrel\" as const,\n sha256: filesByPath[entrypoint.sourcePath]?.sha256 ?? \"\",\n size: filesByPath[entrypoint.sourcePath]?.size ?? 0,\n contentType: filesByPath[entrypoint.sourcePath]?.contentType ?? \"text/plain\",\n contentRef: `sha256:${filesByPath[entrypoint.sourcePath]?.sha256 ?? \"\"}`,\n })),\n ...Object.values(artifact.manifest.components).flatMap((component) => component.files),\n ];\n\n for (const file of manifestFiles) {\n const content = filesByPath[file.path];\n if (!content) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"files\", file.path],\n message: `Missing content for registry file ${file.path}`,\n });\n continue;\n }\n if (content.sha256 !== file.sha256) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"files\", file.path, \"sha256\"],\n message: `Content hash for ${file.path} does not match manifest`,\n });\n }\n if (content.size !== file.size) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"files\", file.path, \"size\"],\n message: `Content size for ${file.path} does not match manifest`,\n });\n }\n }\n });\n\nexport const registryInstallReceiptFileSchema = z.object({\n path: registryFilePathSchema,\n sha256: sha256Schema,\n sourcePath: registryFilePathSchema,\n componentId: z.string().min(1).optional(),\n});\n\nexport const registryInstallReceiptComponentSchema = z.object({\n componentId: z.string().min(1),\n publicRef: z.string().min(1),\n name: z.string().min(1),\n files: z.array(registryFilePathSchema),\n});\n\nexport const registryInstallReceiptSchema = z.object({\n schemaVersion: z.literal(REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION),\n registryId: z.string().min(1),\n registryVersion: z.string().min(1),\n registryHash: sha256Schema,\n fcid: sha256Schema.optional(),\n channel: z.string().min(1).optional(),\n targetPath: registryPathSchema,\n importPath: z.string().min(1),\n installedComponents: z.array(registryInstallReceiptComponentSchema),\n files: z.array(registryInstallReceiptFileSchema),\n dependencies: z.array(registryDependencySchema).default([]),\n installedAt: z.string().datetime(),\n});\n\nexport type RegistryDependencyType = z.infer<typeof registryDependencyTypeSchema>;\nexport type RegistryDependency = z.infer<typeof registryDependencySchema>;\nexport type RegistryFileRole = z.infer<typeof registryFileRoleSchema>;\nexport type RegistryFile = z.infer<typeof registryFileSchema>;\nexport type RegistryFileContent = z.infer<typeof registryFileContentSchema>;\nexport type RegistrySource = z.infer<typeof registrySourceSchema>;\nexport type RegistryComponentExport = z.infer<typeof registryComponentExportSchema>;\nexport type RegistryComponent = z.infer<typeof registryComponentSchema>;\nexport type RegistryEntrypoint = z.infer<typeof registryEntrypointSchema>;\nexport type RegistryInstallProfile = z.infer<typeof registryInstallProfileSchema>;\nexport type RegistryManifestDraft = z.input<typeof registryManifestDraftSchema>;\nexport type RegistryManifest = z.infer<typeof registryManifestSchema>;\nexport type RegistryArtifact = z.infer<typeof registryArtifactSchema>;\nexport type RegistryInstallReceiptFile = z.infer<typeof registryInstallReceiptFileSchema>;\nexport type RegistryInstallReceiptComponent = z.infer<typeof registryInstallReceiptComponentSchema>;\nexport type RegistryInstallReceipt = z.infer<typeof registryInstallReceiptSchema>;\n\nexport interface RegistryFileInput {\n path: string;\n role: RegistryFileRole;\n content: string;\n contentType: string;\n contentRef?: string;\n}\n\nexport interface RegistryArtifactInput {\n manifest: RegistryManifestDraft;\n files: readonly RegistryFileContent[];\n}\n\nfunction registryHashPayload(manifest: RegistryManifestDraft | RegistryManifest): unknown {\n const { generatedAt: _generatedAt, ...withoutGeneratedAt } = manifest;\n if (\"registryHash\" in withoutGeneratedAt) {\n const { registryHash: _registryHash, ...withoutHash } = withoutGeneratedAt;\n return withoutHash;\n }\n return withoutGeneratedAt;\n}\n\nexport function computeRegistryHash(manifest: RegistryManifestDraft | RegistryManifest): string {\n return contractHash(registryHashPayload(manifest));\n}\n\nexport function finalizeRegistryManifest(input: RegistryManifestDraft): RegistryManifest {\n const draft = registryManifestDraftSchema.parse(input);\n return registryManifestSchema.parse({\n ...draft,\n registryHash: computeRegistryHash(draft),\n });\n}\n\nexport function hashRegistryFileContent(content: string): string {\n return sha256Hex(content);\n}\n\nexport function registryFileSize(content: string): number {\n return new TextEncoder().encode(content).length;\n}\n\nexport function buildRegistryFile(input: RegistryFileInput): {\n metadata: RegistryFile;\n content: RegistryFileContent;\n} {\n const sha256 = hashRegistryFileContent(input.content);\n const size = registryFileSize(input.content);\n const path = registryFilePathSchema.parse(input.path);\n const contentType = z.string().min(1).parse(input.contentType);\n return {\n metadata: registryFileSchema.parse({\n path,\n role: input.role,\n sha256,\n size,\n contentType,\n contentRef: input.contentRef ?? `sha256:${sha256}`,\n }),\n content: registryFileContentSchema.parse({\n path,\n content: input.content,\n sha256,\n size,\n contentType,\n }),\n };\n}\n\nexport function buildRegistryArtifact(input: RegistryArtifactInput): RegistryArtifact {\n const manifest = finalizeRegistryManifest(input.manifest);\n const files = new Map<string, RegistryFileContent>();\n for (const file of input.files) {\n const content = registryFileContentSchema.parse(file);\n if (files.has(content.path)) {\n throw new Error(`Duplicate registry file content for ${content.path}`);\n }\n files.set(content.path, content);\n }\n\n return registryArtifactSchema.parse({\n schemaVersion: REGISTRY_ARTIFACT_SCHEMA_VERSION,\n manifest,\n files: Object.fromEntries(files),\n });\n}\n\nexport function assertValidRegistryArtifact(artifact: unknown): RegistryArtifact {\n return registryArtifactSchema.parse(artifact);\n}\n\nexport function registryArtifactDigest(artifact: RegistryArtifact): string {\n const files = Object.fromEntries(\n Object.entries(artifact.files)\n .map(([path, file]) => [path, { sha256: file.sha256, size: file.size }] as const)\n .sort(([leftPath], [rightPath]) => leftPath.localeCompare(rightPath))\n );\n\n return contractHash({\n schemaVersion: artifact.schemaVersion,\n manifest: registryHashPayload(artifact.manifest),\n files,\n });\n}\n\nexport function registryManifestCanonicalPreimage(\n manifest: RegistryManifestDraft | RegistryManifest\n): string {\n return canonicalPreimage(registryHashPayload(manifest));\n}\n","/**\n * Frontend Contract hashing — the cross-runtime content-address (FCID).\n *\n * The keystone trust property of the Frontend Contract is that \"what the agent\n * was served\" and \"what CI enforced\" are provably the same bytes. That only\n * holds if the contract hash is computed by an *identical* function in every\n * runtime that touches it: the CLI (Node), the Convex isolate, and the browser.\n *\n * The fact-IR `hash64Hex` (FNV-1a, in `../facts/ids.ts`) is deliberately NOT\n * used here: it is a 64-bit non-cryptographic integrity reference for in-process\n * fact dedup, and Convex independently reaches for `crypto.subtle` (async, and a\n * *different* algorithm). Two different hashes over the same preimage cannot back\n * a \"same 64 hex chars or the build is rejected\" guarantee.\n *\n * So this module ships ONE function: a synchronous, dependency-free SHA-256 over\n * a number-normalizing canonical preimage. Synchronous so it composes with the\n * sync fact-compilation path; dependency-free so it is byte-identical across\n * Node, the Convex isolate, and the browser without a native/optional dep\n * (`crypto.subtle` is async; `@noble/hashes` is not a dependency of this MIT,\n * browser-safe package). `TextEncoder` is the only ambient global used, and it is\n * present in all three runtimes.\n */\n\n// ---------------------------------------------------------------------------\n// Canonical preimage\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize a number to a stable string. `JSON.stringify` is stable for finite\n * numbers, but renders `NaN`/`Infinity` as `null` (ambiguous) and does not\n * collapse `-0`. Token values flow into the contract body, so a serializer that\n * silently maps `NaN` to `null` would hash two different inputs to the same\n * preimage. Non-finite numbers get unambiguous sentinels instead; `-0` collapses\n * to `0`. This is total (never throws) because it runs on the ingest hot path.\n */\nfunction normalizeNumber(value: number): string {\n if (Number.isNaN(value)) return '\"@num:nan\"';\n if (value === Infinity) return '\"@num:+inf\"';\n if (value === -Infinity) return '\"@num:-inf\"';\n if (Object.is(value, -0)) return \"0\";\n return JSON.stringify(value);\n}\n\n/**\n * Deterministic, canonical serialization of a contract body for hashing.\n *\n * - object keys sorted lexicographically; attribute order is irrelevant\n * - `undefined` properties dropped (so optional fields don't perturb the hash)\n * - numbers normalized via {@link normalizeNumber}\n * - `bigint` encoded as its decimal string (JSON cannot represent it natively)\n *\n * This is intentionally a separate serializer from `facts/ids.ts#canonicalJson`:\n * that one targets in-process fact IDs and does not normalize numbers, and we\n * must not change its output (it would silently re-key existing fact IDs).\n */\nexport function canonicalPreimage(value: unknown): string {\n if (value === undefined || value === null) return \"null\";\n const type = typeof value;\n if (type === \"number\") return normalizeNumber(value as number);\n if (type === \"string\" || type === \"boolean\") return JSON.stringify(value);\n if (type === \"bigint\") return JSON.stringify((value as bigint).toString());\n if (Array.isArray(value)) {\n return `[${value.map(canonicalPreimage).join(\",\")}]`;\n }\n if (type !== \"object\") {\n // functions, symbols — not valid contract content; encode as null so the\n // serializer stays total rather than throwing on the ingest path.\n return \"null\";\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalPreimage(v)}`).join(\",\")}}`;\n}\n\n// ---------------------------------------------------------------------------\n// SHA-256 (FIPS 180-4), synchronous, pure JS\n// ---------------------------------------------------------------------------\n\n// First 32 bits of the fractional parts of the cube roots of the first 64 primes.\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\n/**\n * SHA-256 of a UTF-8 string, returned as 64 lowercase hex chars.\n *\n * Deterministic and synchronous in every runtime. Verified against the FIPS\n * 180-4 vectors in `hash.test.ts`.\n */\nexport function sha256Hex(message: string): string {\n const bytes = new TextEncoder().encode(message);\n const length = bytes.length;\n const bitLength = length * 8;\n\n // Padding: append 0x80, then zeros, then the 64-bit big-endian bit length,\n // so the total is a multiple of 64 bytes.\n const withMarker = length + 1;\n const zeroPad = (56 - (withMarker % 64) + 64) % 64;\n const total = withMarker + zeroPad + 8;\n const buffer = new Uint8Array(total);\n buffer.set(bytes, 0);\n buffer[length] = 0x80;\n\n const view = new DataView(buffer.buffer);\n // 64-bit length: high word then low word, big-endian. bitLength can exceed\n // 2^32 for very large inputs, so split rather than truncate.\n view.setUint32(total - 8, Math.floor(bitLength / 0x100000000));\n view.setUint32(total - 4, bitLength >>> 0);\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n\n const w = new Uint32Array(64);\n for (let chunk = 0; chunk < total; chunk += 64) {\n for (let t = 0; t < 16; t++) w[t] = view.getUint32(chunk + t * 4);\n for (let t = 16; t < 64; t++) {\n const w15 = w[t - 15];\n const w2 = w[t - 2];\n const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ (w15 >>> 3);\n const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ (w2 >>> 10);\n w[t] = (w[t - 16] + s0 + w[t - 7] + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let t = 0; t < 64; t++) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[t] + w[t]) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n return [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((value) => value.toString(16).padStart(8, \"0\"))\n .join(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// Contract hash (FCID)\n// ---------------------------------------------------------------------------\n\n/**\n * The Frontend Contract ID: `sha256(canonicalPreimage(body))`, 64 lowercase hex\n * chars. Identical inputs produce an identical FCID in the CLI, the Convex\n * isolate, and the browser — which is what lets the gen-time agent view and the\n * CI enforcement reference the same contract by hash.\n */\nexport function contractHash(body: unknown): string {\n return sha256Hex(canonicalPreimage(body));\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,40 @@
1
+ import { Severity } from '../severity.js';
2
+ import { Violation, Finding } from '../schemas/index.js';
3
+ import 'zod';
4
+
5
+ declare const EXPLAIN_URL_BASE = "https://usefragments.com/errors/";
6
+ type CodeCategory = "canonical-usage" | "tokens" | "a11y" | "states" | "composition" | "props" | "performance" | "safety" | "system";
7
+ type CodeLifecycle = "experimental" | "stable" | "deprecated";
8
+ interface FuiCode {
9
+ code: string;
10
+ ruleId: string;
11
+ category: CodeCategory;
12
+ defaultSeverity: Severity;
13
+ title: string;
14
+ explainUrl: string;
15
+ lifecycle: CodeLifecycle;
16
+ replacedBy?: string;
17
+ fixAvailable: boolean;
18
+ evidenceRequired: boolean;
19
+ }
20
+ declare const CODES: readonly [FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode, FuiCode];
21
+ declare const byCode: ReadonlyMap<string, FuiCode>;
22
+ declare const byRuleId: ReadonlyMap<string, FuiCode>;
23
+ declare function explainUrlForCode(code: string): string;
24
+
25
+ interface BridgeViolationInput {
26
+ violation: Violation;
27
+ canonicalRuleId?: string;
28
+ validator?: string;
29
+ attributes?: Record<string, unknown>;
30
+ }
31
+ declare function bridgeSourceViolation(input: BridgeViolationInput): {
32
+ violation: Violation;
33
+ finding: Finding;
34
+ };
35
+ declare function bridgeSourceViolations(violations: Violation[], options?: Omit<BridgeViolationInput, "violation">): {
36
+ violations: Violation[];
37
+ findings: Finding[];
38
+ };
39
+
40
+ export { type BridgeViolationInput, CODES, type CodeCategory, type CodeLifecycle, EXPLAIN_URL_BASE, type FuiCode, Severity, bridgeSourceViolation, bridgeSourceViolations, byCode, byRuleId, explainUrlForCode };
@@ -0,0 +1,23 @@
1
+ import {
2
+ CODES,
3
+ EXPLAIN_URL_BASE,
4
+ bridgeSourceViolation,
5
+ bridgeSourceViolations,
6
+ byCode,
7
+ byRuleId,
8
+ explainUrlForCode
9
+ } from "../chunk-243QYRUF.js";
10
+ import "../chunk-R3X7UBHU.js";
11
+ import "../chunk-JNBFJ34I.js";
12
+ import "../chunk-EIYNNS77.js";
13
+ import "../chunk-V4VQB57N.js";
14
+ export {
15
+ CODES,
16
+ EXPLAIN_URL_BASE,
17
+ bridgeSourceViolation,
18
+ bridgeSourceViolations,
19
+ byCode,
20
+ byRuleId,
21
+ explainUrlForCode
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ import '../types-xJ2xyp_G.js';
2
+ export { aV as AIMetadata, C as CompiledBlock, b as CompiledFragment, y as CompiledFragmentsFile, D as CompiledTokenData, E as CompiledTokenEntry, aW as ComponentRelation, aX as FragmentContract, aY as FragmentGenerated, aZ as FragmentMeta, a_ as FragmentUsage, a$ as ImportEntry, af as ObservedComponentUsage, ag as ObservedUsageProp, b0 as PerformanceData, b1 as PerformanceSummary, b2 as PropDefinition, b3 as Theme, b4 as VerifyResult } from '../governance-BOa3KyiJ.js';
3
+ import 'zod';
4
+ import 'react';
5
+ import '../topology/index.js';
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}