frameyard 0.7.0 → 0.9.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 (334) hide show
  1. package/CHANGELOG.md +164 -7
  2. package/GLOSSARY.md +152 -18
  3. package/README.md +328 -285
  4. package/dist/assets/integrations.d.ts +8 -4
  5. package/dist/assets/integrations.d.ts.map +1 -1
  6. package/dist/assets/integrations.js +8 -4
  7. package/dist/assets/integrations.js.map +1 -1
  8. package/dist/assets/provenance.d.ts +2 -2
  9. package/dist/assets/provenance.d.ts.map +1 -1
  10. package/dist/assets/provenance.js +5 -3
  11. package/dist/assets/provenance.js.map +1 -1
  12. package/dist/assets/tts-supertonic.d.ts +28 -0
  13. package/dist/assets/tts-supertonic.d.ts.map +1 -0
  14. package/dist/assets/tts-supertonic.js +156 -0
  15. package/dist/assets/tts-supertonic.js.map +1 -0
  16. package/dist/assets/tts.d.ts +18 -6
  17. package/dist/assets/tts.d.ts.map +1 -1
  18. package/dist/assets/tts.js +219 -97
  19. package/dist/assets/tts.js.map +1 -1
  20. package/dist/cli.js +1705 -106
  21. package/dist/cli.js.map +1 -1
  22. package/dist/composition/descriptor.d.ts +17 -3
  23. package/dist/composition/descriptor.d.ts.map +1 -1
  24. package/dist/composition/descriptor.js +51 -28
  25. package/dist/composition/descriptor.js.map +1 -1
  26. package/dist/composition/format.d.ts +12 -0
  27. package/dist/composition/format.d.ts.map +1 -0
  28. package/dist/composition/format.js +28 -0
  29. package/dist/composition/format.js.map +1 -0
  30. package/dist/composition/index.d.ts +2 -1
  31. package/dist/composition/index.d.ts.map +1 -1
  32. package/dist/composition/index.js +1 -0
  33. package/dist/composition/index.js.map +1 -1
  34. package/dist/context.d.ts +82 -0
  35. package/dist/context.d.ts.map +1 -0
  36. package/dist/context.js +277 -0
  37. package/dist/context.js.map +1 -0
  38. package/dist/contracts.d.ts +80 -6
  39. package/dist/contracts.d.ts.map +1 -1
  40. package/dist/contracts.js +3 -0
  41. package/dist/contracts.js.map +1 -1
  42. package/dist/doctor.d.ts +14 -1
  43. package/dist/doctor.d.ts.map +1 -1
  44. package/dist/doctor.js +166 -7
  45. package/dist/doctor.js.map +1 -1
  46. package/dist/errors.d.ts +1 -1
  47. package/dist/errors.d.ts.map +1 -1
  48. package/dist/errors.js.map +1 -1
  49. package/dist/fonts/add.d.ts +41 -0
  50. package/dist/fonts/add.d.ts.map +1 -0
  51. package/dist/fonts/add.js +259 -0
  52. package/dist/fonts/add.js.map +1 -0
  53. package/dist/fonts/binary.d.ts +4 -0
  54. package/dist/fonts/binary.d.ts.map +1 -0
  55. package/dist/fonts/binary.js +21 -0
  56. package/dist/fonts/binary.js.map +1 -0
  57. package/dist/fonts/css.d.ts +4 -0
  58. package/dist/fonts/css.d.ts.map +1 -0
  59. package/dist/fonts/css.js +50 -0
  60. package/dist/fonts/css.js.map +1 -0
  61. package/dist/fonts/fontsource.d.ts +107 -0
  62. package/dist/fonts/fontsource.d.ts.map +1 -0
  63. package/dist/fonts/fontsource.js +565 -0
  64. package/dist/fonts/fontsource.js.map +1 -0
  65. package/dist/fonts/index.d.ts +11 -0
  66. package/dist/fonts/index.d.ts.map +1 -0
  67. package/dist/fonts/index.js +11 -0
  68. package/dist/fonts/index.js.map +1 -0
  69. package/dist/fonts/install.d.ts +24 -0
  70. package/dist/fonts/install.d.ts.map +1 -0
  71. package/dist/fonts/install.js +145 -0
  72. package/dist/fonts/install.js.map +1 -0
  73. package/dist/fonts/manifest.d.ts +21 -0
  74. package/dist/fonts/manifest.d.ts.map +1 -0
  75. package/dist/fonts/manifest.js +96 -0
  76. package/dist/fonts/manifest.js.map +1 -0
  77. package/dist/fonts/options.d.ts +9 -0
  78. package/dist/fonts/options.d.ts.map +1 -0
  79. package/dist/fonts/options.js +66 -0
  80. package/dist/fonts/options.js.map +1 -0
  81. package/dist/fonts/schema.d.ts +4 -0
  82. package/dist/fonts/schema.d.ts.map +1 -0
  83. package/dist/fonts/schema.js +316 -0
  84. package/dist/fonts/schema.js.map +1 -0
  85. package/dist/fonts/summary.d.ts +16 -0
  86. package/dist/fonts/summary.d.ts.map +1 -0
  87. package/dist/fonts/summary.js +22 -0
  88. package/dist/fonts/summary.js.map +1 -0
  89. package/dist/fonts/types.d.ts +56 -0
  90. package/dist/fonts/types.d.ts.map +1 -0
  91. package/dist/fonts/types.js +8 -0
  92. package/dist/fonts/types.js.map +1 -0
  93. package/dist/fonts/verify.d.ts +33 -0
  94. package/dist/fonts/verify.d.ts.map +1 -0
  95. package/dist/fonts/verify.js +200 -0
  96. package/dist/fonts/verify.js.map +1 -0
  97. package/dist/html/document-adapter.d.ts +3 -3
  98. package/dist/html/document-adapter.d.ts.map +1 -1
  99. package/dist/html/document-adapter.js +1 -1
  100. package/dist/html/document-adapter.js.map +1 -1
  101. package/dist/html/index.d.ts +1 -1
  102. package/dist/html/index.d.ts.map +1 -1
  103. package/dist/html/parse.d.ts +10 -2
  104. package/dist/html/parse.d.ts.map +1 -1
  105. package/dist/html/parse.js +14 -5
  106. package/dist/html/parse.js.map +1 -1
  107. package/dist/html/validate.d.ts +12 -1
  108. package/dist/html/validate.d.ts.map +1 -1
  109. package/dist/html/validate.js +292 -61
  110. package/dist/html/validate.js.map +1 -1
  111. package/dist/index.d.ts +4 -4
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +2 -2
  114. package/dist/index.js.map +1 -1
  115. package/dist/inspect.d.ts +61 -0
  116. package/dist/inspect.d.ts.map +1 -0
  117. package/dist/inspect.js +325 -0
  118. package/dist/inspect.js.map +1 -0
  119. package/dist/lint.d.ts +63 -0
  120. package/dist/lint.d.ts.map +1 -0
  121. package/dist/lint.js +265 -0
  122. package/dist/lint.js.map +1 -0
  123. package/dist/policy.d.ts +69 -0
  124. package/dist/policy.d.ts.map +1 -0
  125. package/dist/policy.js +361 -0
  126. package/dist/policy.js.map +1 -0
  127. package/dist/preview/main.d.ts +2 -2
  128. package/dist/preview/main.d.ts.map +1 -1
  129. package/dist/preview/main.js +35 -14
  130. package/dist/preview/main.js.map +1 -1
  131. package/dist/preview/timeline-data.d.ts +17 -65
  132. package/dist/preview/timeline-data.d.ts.map +1 -1
  133. package/dist/preview/timeline-host.d.ts.map +1 -1
  134. package/dist/preview/timeline-host.js +73 -38
  135. package/dist/preview/timeline-host.js.map +1 -1
  136. package/dist/preview/timeline-main.d.ts.map +1 -1
  137. package/dist/preview/timeline-main.js +47 -3
  138. package/dist/preview/timeline-main.js.map +1 -1
  139. package/dist/project.d.ts +13 -8
  140. package/dist/project.d.ts.map +1 -1
  141. package/dist/project.js +20 -17
  142. package/dist/project.js.map +1 -1
  143. package/dist/renderer/browser.d.ts +2 -2
  144. package/dist/renderer/browser.d.ts.map +1 -1
  145. package/dist/renderer/browser.js +10 -4
  146. package/dist/renderer/browser.js.map +1 -1
  147. package/dist/renderer/ffmpeg.d.ts +44 -1
  148. package/dist/renderer/ffmpeg.d.ts.map +1 -1
  149. package/dist/renderer/ffmpeg.js +371 -73
  150. package/dist/renderer/ffmpeg.js.map +1 -1
  151. package/dist/renderer/index.d.ts +40 -4
  152. package/dist/renderer/index.d.ts.map +1 -1
  153. package/dist/renderer/index.js +100 -25
  154. package/dist/renderer/index.js.map +1 -1
  155. package/dist/renderer/keyframe-expressions.d.ts +39 -0
  156. package/dist/renderer/keyframe-expressions.d.ts.map +1 -0
  157. package/dist/renderer/keyframe-expressions.js +180 -0
  158. package/dist/renderer/keyframe-expressions.js.map +1 -0
  159. package/dist/renderer/timeline.d.ts +2 -0
  160. package/dist/renderer/timeline.d.ts.map +1 -1
  161. package/dist/renderer/timeline.js +168 -106
  162. package/dist/renderer/timeline.js.map +1 -1
  163. package/dist/runtime/host.d.ts.map +1 -1
  164. package/dist/runtime/host.js +159 -31
  165. package/dist/runtime/host.js.map +1 -1
  166. package/dist/scaffold.d.ts +3 -0
  167. package/dist/scaffold.d.ts.map +1 -1
  168. package/dist/scaffold.js +48 -317
  169. package/dist/scaffold.js.map +1 -1
  170. package/dist/server/composition-html.d.ts +15 -7
  171. package/dist/server/composition-html.d.ts.map +1 -1
  172. package/dist/server/composition-html.js +72 -16
  173. package/dist/server/composition-html.js.map +1 -1
  174. package/dist/server/server.d.ts.map +1 -1
  175. package/dist/server/server.js +56 -6
  176. package/dist/server/server.js.map +1 -1
  177. package/dist/server/timeline-preview-data.d.ts.map +1 -1
  178. package/dist/server/timeline-preview-data.js +12 -23
  179. package/dist/server/timeline-preview-data.js.map +1 -1
  180. package/dist/server/timeline-preview-html.d.ts.map +1 -1
  181. package/dist/server/timeline-preview-html.js +20 -3
  182. package/dist/server/timeline-preview-html.js.map +1 -1
  183. package/dist/templates.d.ts +16 -0
  184. package/dist/templates.d.ts.map +1 -0
  185. package/dist/templates.js +186 -0
  186. package/dist/templates.js.map +1 -0
  187. package/dist/timeline/easing.d.ts +36 -0
  188. package/dist/timeline/easing.d.ts.map +1 -0
  189. package/dist/timeline/easing.js +225 -0
  190. package/dist/timeline/easing.js.map +1 -0
  191. package/dist/timeline/keyframes.d.ts +23 -0
  192. package/dist/timeline/keyframes.d.ts.map +1 -0
  193. package/dist/timeline/keyframes.js +95 -0
  194. package/dist/timeline/keyframes.js.map +1 -0
  195. package/dist/timeline/plan.d.ts +6 -12
  196. package/dist/timeline/plan.d.ts.map +1 -1
  197. package/dist/timeline/plan.js +17 -30
  198. package/dist/timeline/plan.js.map +1 -1
  199. package/dist/timeline/resolve.d.ts +16 -3
  200. package/dist/timeline/resolve.d.ts.map +1 -1
  201. package/dist/timeline/resolve.js +119 -13
  202. package/dist/timeline/resolve.js.map +1 -1
  203. package/dist/timeline/scene.d.ts +126 -0
  204. package/dist/timeline/scene.d.ts.map +1 -0
  205. package/dist/timeline/scene.js +109 -0
  206. package/dist/timeline/scene.js.map +1 -0
  207. package/dist/timeline/schema.d.ts +38 -0
  208. package/dist/timeline/schema.d.ts.map +1 -1
  209. package/dist/timeline/schema.js +290 -9
  210. package/dist/timeline/schema.js.map +1 -1
  211. package/dist/timeline/transitions.d.ts +21 -0
  212. package/dist/timeline/transitions.d.ts.map +1 -0
  213. package/dist/timeline/transitions.js +23 -0
  214. package/dist/timeline/transitions.js.map +1 -0
  215. package/dist/version.d.ts +1 -1
  216. package/dist/version.js +1 -1
  217. package/docs/adr/0007-make-html-documents-the-composition-unit.md +2 -2
  218. package/docs/adr/0008-share-the-composition-document-grammar.md +1 -1
  219. package/docs/adr/0010-make-timelines-the-render-unit.md +3 -2
  220. package/docs/adr/0011-compose-timeline-frames-in-a-live-browser-host.md +1 -1
  221. package/docs/adr/0012-render-timelines-with-segmented-lossless-clip-intermediates.md +1 -1
  222. package/docs/adr/0014-compose-timeline-clips-with-css-blend-modes.md +38 -0
  223. package/docs/adr/0015-inherit-composition-format-from-the-project.md +28 -0
  224. package/docs/adr/0016-author-compositions-as-html-fragments.md +32 -0
  225. package/docs/adr/0017-render-timeless-compositions-as-stills.md +99 -0
  226. package/docs/adr/0018-animate-timeline-clips-with-keyframes.md +35 -0
  227. package/docs/adr/0019-make-same-track-overlap-the-transition-window.md +36 -0
  228. package/docs/adr/0020-crossfade-audio-clips-on-audio-tracks.md +27 -0
  229. package/docs/adr/0021-project-timeline-scenes-once.md +32 -0
  230. package/docs/adr/0022-gate-heavy-operations-with-a-workspace-resource-policy.md +35 -0
  231. package/docs/adr/0023-pin-fonts-as-project-assets.md +98 -0
  232. package/docs/migration-0.4.md +5 -3
  233. package/docs/migration-0.8.md +163 -0
  234. package/docs/preview-testing.md +23 -3
  235. package/docs/{v0.1-design.md → v0.x-design.md} +86 -53
  236. package/examples/blend/README.md +106 -0
  237. package/examples/blend/assets/ink.mp4 +0 -0
  238. package/examples/blend/compositions/aurora.html +55 -0
  239. package/examples/blend/compositions/backdrop.html +74 -0
  240. package/examples/blend/compositions/labels.html +149 -0
  241. package/examples/blend/fy.config.js +11 -0
  242. package/examples/blend/scripts/make-ink.sh +26 -0
  243. package/examples/blend/timelines/blend.timeline.json +155 -0
  244. package/examples/demo/README.md +2 -2
  245. package/examples/demo/compositions/demo.html +243 -251
  246. package/examples/intro/README.md +71 -0
  247. package/examples/intro/assets/fonts/figtree/LICENSE.txt +93 -0
  248. package/examples/intro/assets/fonts/figtree/figtree-latin-wght-normal.woff2 +0 -0
  249. package/examples/intro/assets/fonts/instrument-serif/LICENSE.txt +93 -0
  250. package/examples/intro/assets/fonts/instrument-serif/instrument-serif-latin-400-italic.woff2 +0 -0
  251. package/examples/intro/assets/fonts/space-mono/LICENSE.txt +93 -0
  252. package/examples/intro/assets/fonts/space-mono/space-mono-latin-400-normal.woff2 +0 -0
  253. package/examples/intro/assets/fonts/space-mono/space-mono-latin-700-normal.woff2 +0 -0
  254. package/examples/intro/assets/grain.png +0 -0
  255. package/examples/intro/assets/score.ogg +0 -0
  256. package/examples/intro/compositions/brand.html +412 -0
  257. package/examples/intro/compositions/chrome.controller.js +63 -0
  258. package/examples/intro/compositions/chrome.html +256 -0
  259. package/examples/intro/compositions/lattice.controller.js +148 -0
  260. package/examples/intro/compositions/lattice.html +308 -0
  261. package/examples/intro/compositions/opening.html +504 -0
  262. package/examples/intro/compositions/studio.html +930 -0
  263. package/examples/intro/compositions/theme.css +218 -0
  264. package/examples/intro/fy.config.js +13 -0
  265. package/examples/intro/fy.fonts.json +100 -0
  266. package/examples/intro/scripts/make-grain.mjs +79 -0
  267. package/examples/intro/scripts/make-score.mjs +702 -0
  268. package/examples/intro/timelines/intro.timeline.json +60 -0
  269. package/examples/keyframes/README.md +76 -0
  270. package/examples/keyframes/compositions/backdrop.html +60 -0
  271. package/examples/keyframes/compositions/card.html +99 -0
  272. package/examples/keyframes/fy.config.js +10 -0
  273. package/examples/keyframes/timelines/keyframes.timeline.json +60 -0
  274. package/examples/nested/README.md +112 -0
  275. package/examples/nested/assets/pulse.wav +0 -0
  276. package/examples/nested/compositions/backdrop.html +84 -0
  277. package/examples/nested/compositions/card.html +275 -0
  278. package/examples/nested/compositions/overlay.html +307 -0
  279. package/examples/nested/fy.config.js +13 -0
  280. package/examples/nested/scripts/make-pulse.sh +20 -0
  281. package/examples/nested/timelines/chapter-a.timeline.json +39 -0
  282. package/examples/nested/timelines/chapter-b.timeline.json +39 -0
  283. package/examples/nested/timelines/nested-reel.timeline.json +52 -0
  284. package/examples/static/README.md +17 -0
  285. package/examples/static/compositions/still.html +37 -0
  286. package/examples/static/fy.config.js +9 -0
  287. package/examples/static/timelines/still.timeline.json +13 -0
  288. package/examples/transitions/README.md +128 -0
  289. package/examples/transitions/assets/alpha.wav +0 -0
  290. package/examples/transitions/assets/beta.wav +0 -0
  291. package/examples/transitions/assets/gamma.wav +0 -0
  292. package/examples/transitions/compositions/alpha.html +56 -0
  293. package/examples/transitions/compositions/beta.html +56 -0
  294. package/examples/transitions/compositions/gamma.html +56 -0
  295. package/examples/transitions/fy.config.js +12 -0
  296. package/examples/transitions/timelines/audio-crossfade.timeline.json +44 -0
  297. package/examples/transitions/timelines/transitions.timeline.json +31 -0
  298. package/examples/video/README.md +4 -4
  299. package/examples/video/compositions/video-mp4.html +349 -357
  300. package/examples/video/compositions/video-overlay.html +337 -345
  301. package/examples/video/compositions/video.html +349 -357
  302. package/examples/webgl/README.md +1 -1
  303. package/examples/webgl/compositions/webgl.html +205 -213
  304. package/package.json +13 -5
  305. package/scaffolds/init/AGENTS.md +131 -0
  306. package/scaffolds/init/README.md +56 -0
  307. package/scaffolds/init/compositions/hello.html +79 -0
  308. package/scaffolds/init/fy.config.js +9 -0
  309. package/scaffolds/init/gitignore.template +1 -0
  310. package/scaffolds/init/package.json +11 -0
  311. package/scaffolds/init/props/hello.json +4 -0
  312. package/scaffolds/init/props/main.json +6 -0
  313. package/scaffolds/init/timelines/main.timeline.json +20 -0
  314. package/scaffolds/local-models/LOCAL-MODELS.md +77 -0
  315. package/scaffolds/local-models/fy.policy.json +5 -0
  316. package/scaffolds/local-models/opencode/opencode.jsonc +17 -0
  317. package/scaffolds/local-models/pi/APPEND_SYSTEM.md +21 -0
  318. package/scaffolds/local-models/pi/sandbox.json +15 -0
  319. package/scaffolds/local-models/pi/settings.json +15 -0
  320. package/skills/frameyard/README.md +1 -0
  321. package/skills/frameyard/SKILL.md +59 -59
  322. package/skills/frameyard/references/audio-assets.md +32 -3
  323. package/skills/frameyard/references/common-mistakes.md +81 -7
  324. package/skills/frameyard/references/controllers.md +5 -4
  325. package/skills/frameyard/references/deterministic-authoring.md +49 -37
  326. package/skills/frameyard/references/diagnostics.md +42 -4
  327. package/skills/frameyard/references/failure-recovery.md +56 -10
  328. package/skills/frameyard/references/fonts.md +132 -0
  329. package/skills/frameyard/references/json-results.md +165 -10
  330. package/skills/frameyard/references/quick-reference.md +222 -0
  331. package/skills/frameyard/references/timelines.md +109 -15
  332. /package/examples/demo/{video.config.js → fy.config.js} +0 -0
  333. /package/examples/video/{video.config.js → fy.config.js} +0 -0
  334. /package/examples/webgl/{video.config.js → fy.config.js} +0 -0
@@ -0,0 +1,316 @@
1
+ import { isPlainObject } from "../contracts.js";
2
+ import { FrameyardError } from "../errors.js";
3
+ import { FONT_ASSET_PREFIX, FONT_MANIFEST_VERSION, } from "./types.js";
4
+ const FONT_ID = /^[a-z0-9][a-z0-9-]*$/;
5
+ const SHA256 = /^[a-f0-9]{64}$/i;
6
+ const SUBSET = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
7
+ const UNICODE_RANGE = /^[Uu]\+[0-9A-Fa-f?*-]+(?:\s*,\s*[Uu]\+[0-9A-Fa-f?*-]+)*$/;
8
+ const FAMILY_FORBIDDEN = /[\p{Cc}"'\\;{}<>]/u;
9
+ const MANIFEST_KEYS = new Set(["version", "fonts"]);
10
+ const FAMILY_KEYS = new Set([
11
+ "id",
12
+ "family",
13
+ "provider",
14
+ "providerId",
15
+ "providerVersion",
16
+ "license",
17
+ "variable",
18
+ "axes",
19
+ "files",
20
+ ]);
21
+ const LICENSE_KEYS = new Set(["type", "file", "attribution"]);
22
+ const FILE_KEYS = new Set(["path", "subset", "style", "weight", "format", "unicodeRange", "sha256", "bytes", "source"]);
23
+ const PROVIDERS = new Set(["local", "fontsource", "url"]);
24
+ const STYLES = new Set(["normal", "italic"]);
25
+ const FORMATS = new Set(["woff2", "woff", "ttf", "otf"]);
26
+ function manifestError(message, details) {
27
+ throw new FrameyardError("FONT_MANIFEST_INVALID", message, details === undefined ? undefined : { details });
28
+ }
29
+ function requireObject(value, label) {
30
+ if (!isPlainObject(value)) {
31
+ manifestError(`${label} must be a plain object.`, { path: label });
32
+ }
33
+ return value;
34
+ }
35
+ function requireKeys(value, allowed, label) {
36
+ for (const key of Object.keys(value)) {
37
+ if (!allowed.has(key)) {
38
+ manifestError(`${label} contains an unknown field "${key}".`, {
39
+ jsonPath: `${label}.${key}`,
40
+ allowed: [...allowed],
41
+ });
42
+ }
43
+ }
44
+ }
45
+ function requireString(value, label) {
46
+ if (typeof value !== "string" || value.length === 0) {
47
+ manifestError(`${label} must be a non-empty string.`, { jsonPath: label });
48
+ }
49
+ return value;
50
+ }
51
+ function requireOptionalString(value, label) {
52
+ if (value === undefined) {
53
+ return undefined;
54
+ }
55
+ return requireString(value, label);
56
+ }
57
+ function requireProjectRelativePath(value, label) {
58
+ const path = requireString(value, label);
59
+ if (path.startsWith("/") ||
60
+ /^[A-Za-z]:/.test(path) ||
61
+ path.includes("\\") ||
62
+ path.includes("\0") ||
63
+ path.split("/").some((segment) => segment === "" || segment === "." || segment === "..")) {
64
+ manifestError(`${label} must be a project-relative POSIX path without "." or ".." segments.`, {
65
+ jsonPath: label,
66
+ value: path,
67
+ });
68
+ }
69
+ return path;
70
+ }
71
+ function requireFontAssetPath(value, label, fontId) {
72
+ const path = requireProjectRelativePath(value, label);
73
+ const expectedPrefix = `${FONT_ASSET_PREFIX}${fontId}/`;
74
+ if (!path.startsWith(expectedPrefix) || path.length === expectedPrefix.length) {
75
+ manifestError(`${label} must be a file below ${expectedPrefix}.`, {
76
+ jsonPath: label,
77
+ value: path,
78
+ expectedPrefix,
79
+ });
80
+ }
81
+ return path;
82
+ }
83
+ function requireFiniteNumber(value, label) {
84
+ if (typeof value !== "number" || !Number.isFinite(value)) {
85
+ manifestError(`${label} must be a finite number.`, { jsonPath: label });
86
+ }
87
+ return value;
88
+ }
89
+ function requireInteger(value, label) {
90
+ if (typeof value !== "number" || !Number.isInteger(value)) {
91
+ manifestError(`${label} must be an integer.`, { jsonPath: label });
92
+ }
93
+ return value;
94
+ }
95
+ function parseWeight(value, label) {
96
+ if (typeof value === "number") {
97
+ const weight = requireInteger(value, label);
98
+ if (weight < 1 || weight > 1000) {
99
+ manifestError(`${label} must be between 1 and 1000.`, { jsonPath: label, value: weight });
100
+ }
101
+ return weight;
102
+ }
103
+ const range = requireObject(value, label);
104
+ requireKeys(range, new Set(["min", "max"]), label);
105
+ const min = requireInteger(range.min, `${label}.min`);
106
+ const max = requireInteger(range.max, `${label}.max`);
107
+ if (min < 1 || max > 1000 || min > max) {
108
+ manifestError(`${label} must be a weight range between 1 and 1000 with min <= max.`, {
109
+ jsonPath: label,
110
+ value: { min, max },
111
+ });
112
+ }
113
+ return { min, max };
114
+ }
115
+ function parseAxis(value, label) {
116
+ const axis = requireObject(value, label);
117
+ requireKeys(axis, new Set(["min", "max", "default"]), label);
118
+ const min = requireFiniteNumber(axis.min, `${label}.min`);
119
+ const max = requireFiniteNumber(axis.max, `${label}.max`);
120
+ const defaultValue = requireFiniteNumber(axis.default, `${label}.default`);
121
+ if (min > max || defaultValue < min || defaultValue > max) {
122
+ manifestError(`${label} must satisfy min <= default <= max.`, {
123
+ jsonPath: label,
124
+ value: { min, max, default: defaultValue },
125
+ });
126
+ }
127
+ return { min, max, default: defaultValue };
128
+ }
129
+ function parseLicense(value, label, fontId) {
130
+ const license = requireObject(value, label);
131
+ requireKeys(license, LICENSE_KEYS, label);
132
+ const type = requireString(license.type, `${label}.type`);
133
+ const file = license.file === undefined ? undefined : requireFontAssetPath(license.file, `${label}.file`, fontId);
134
+ const attribution = requireOptionalString(license.attribution, `${label}.attribution`);
135
+ return {
136
+ type,
137
+ ...(file !== undefined ? { file } : {}),
138
+ ...(attribution !== undefined ? { attribution } : {}),
139
+ };
140
+ }
141
+ function parseFontFile(value, label, fontId) {
142
+ const file = requireObject(value, label);
143
+ requireKeys(file, FILE_KEYS, label);
144
+ const path = requireFontAssetPath(file.path, `${label}.path`, fontId);
145
+ const subset = file.subset === undefined ? undefined : requireString(file.subset, `${label}.subset`);
146
+ if (subset !== undefined && !SUBSET.test(subset)) {
147
+ manifestError(`${label}.subset must contain only letters, digits, dots, underscores, and hyphens.`, {
148
+ jsonPath: `${label}.subset`,
149
+ value: subset,
150
+ });
151
+ }
152
+ if (typeof file.style !== "string" || !STYLES.has(file.style)) {
153
+ manifestError(`${label}.style must be "normal" or "italic".`, {
154
+ jsonPath: `${label}.style`,
155
+ value: file.style,
156
+ });
157
+ }
158
+ if (typeof file.format !== "string" || !FORMATS.has(file.format)) {
159
+ manifestError(`${label}.format must be "woff2", "woff", "ttf", or "otf".`, {
160
+ jsonPath: `${label}.format`,
161
+ value: file.format,
162
+ });
163
+ }
164
+ const unicodeRange = file.unicodeRange === undefined ? undefined : requireString(file.unicodeRange, `${label}.unicodeRange`);
165
+ if (unicodeRange !== undefined && !UNICODE_RANGE.test(unicodeRange)) {
166
+ manifestError(`${label}.unicodeRange is not a valid CSS unicode-range list.`, {
167
+ jsonPath: `${label}.unicodeRange`,
168
+ value: unicodeRange,
169
+ });
170
+ }
171
+ const sha256 = requireString(file.sha256, `${label}.sha256`);
172
+ if (!SHA256.test(sha256)) {
173
+ manifestError(`${label}.sha256 must be a 64-character SHA-256 hex digest.`, {
174
+ jsonPath: `${label}.sha256`,
175
+ });
176
+ }
177
+ const bytes = requireInteger(file.bytes, `${label}.bytes`);
178
+ if (bytes <= 0) {
179
+ manifestError(`${label}.bytes must be a positive integer.`, { jsonPath: `${label}.bytes`, value: bytes });
180
+ }
181
+ const source = requireOptionalString(file.source, `${label}.source`);
182
+ return {
183
+ path,
184
+ ...(subset !== undefined ? { subset } : {}),
185
+ style: file.style,
186
+ weight: parseWeight(file.weight, `${label}.weight`),
187
+ format: file.format,
188
+ ...(unicodeRange !== undefined ? { unicodeRange } : {}),
189
+ sha256,
190
+ bytes,
191
+ ...(source !== undefined ? { source } : {}),
192
+ };
193
+ }
194
+ function weightKey(weight) {
195
+ return typeof weight === "number" ? String(weight) : `${weight.min}-${weight.max}`;
196
+ }
197
+ function faceKey(file) {
198
+ return `${file.subset ?? ""}\0${file.style}\0${weightKey(file.weight)}`;
199
+ }
200
+ function parseFontFamily(value, label) {
201
+ const family = requireObject(value, label);
202
+ requireKeys(family, FAMILY_KEYS, label);
203
+ const id = requireString(family.id, `${label}.id`);
204
+ if (!FONT_ID.test(id)) {
205
+ manifestError(`${label}.id must use lowercase letters, digits, and hyphens, starting with a letter or digit.`, {
206
+ jsonPath: `${label}.id`,
207
+ value: id,
208
+ });
209
+ }
210
+ const name = requireString(family.family, `${label}.family`);
211
+ if (name.trim() !== name || FAMILY_FORBIDDEN.test(name)) {
212
+ manifestError(`${label}.family must be a CSS font-family name without quotes, backslashes, semicolons, braces, or control characters.`, {
213
+ jsonPath: `${label}.family`,
214
+ value: name,
215
+ });
216
+ }
217
+ if (typeof family.provider !== "string" || !PROVIDERS.has(family.provider)) {
218
+ manifestError(`${label}.provider must be "local", "fontsource", or "url".`, {
219
+ jsonPath: `${label}.provider`,
220
+ value: family.provider,
221
+ });
222
+ }
223
+ const providerId = requireOptionalString(family.providerId, `${label}.providerId`);
224
+ const providerVersion = requireOptionalString(family.providerVersion, `${label}.providerVersion`);
225
+ const license = parseLicense(family.license, `${label}.license`, id);
226
+ if (family.variable !== undefined && typeof family.variable !== "boolean") {
227
+ manifestError(`${label}.variable must be a boolean.`, { jsonPath: `${label}.variable` });
228
+ }
229
+ let axes;
230
+ if (family.axes !== undefined) {
231
+ const rawAxes = requireObject(family.axes, `${label}.axes`);
232
+ axes = {};
233
+ for (const [axisName, axisValue] of Object.entries(rawAxes)) {
234
+ if (!/^[A-Za-z0-9]{1,8}$/.test(axisName)) {
235
+ manifestError(`${label}.axes contains an invalid axis name "${axisName}".`, {
236
+ jsonPath: `${label}.axes.${axisName}`,
237
+ });
238
+ }
239
+ axes[axisName] = parseAxis(axisValue, `${label}.axes.${axisName}`);
240
+ }
241
+ }
242
+ if (!Array.isArray(family.files) || family.files.length === 0) {
243
+ manifestError(`${label}.files must be a non-empty array.`, { jsonPath: `${label}.files` });
244
+ }
245
+ const files = [];
246
+ const paths = new Set();
247
+ const faces = new Set();
248
+ for (const [index, rawFile] of family.files.entries()) {
249
+ const file = parseFontFile(rawFile, `${label}.files[${index}]`, id);
250
+ if (paths.has(file.path)) {
251
+ manifestError(`${label}.files contains the duplicate path "${file.path}".`, {
252
+ jsonPath: `${label}.files[${index}].path`,
253
+ value: file.path,
254
+ });
255
+ }
256
+ const key = faceKey(file);
257
+ if (faces.has(key)) {
258
+ manifestError(`${label}.files contains a duplicate face for subset/style/weight.`, {
259
+ jsonPath: `${label}.files[${index}]`,
260
+ value: { subset: file.subset ?? null, style: file.style, weight: file.weight },
261
+ });
262
+ }
263
+ paths.add(file.path);
264
+ faces.add(key);
265
+ files.push(file);
266
+ }
267
+ return {
268
+ id,
269
+ family: name,
270
+ provider: family.provider,
271
+ ...(providerId !== undefined ? { providerId } : {}),
272
+ ...(providerVersion !== undefined ? { providerVersion } : {}),
273
+ license,
274
+ ...(family.variable !== undefined ? { variable: family.variable } : {}),
275
+ ...(axes !== undefined ? { axes } : {}),
276
+ files,
277
+ };
278
+ }
279
+ /** Parses and validates a `fy.fonts.json` document. */
280
+ export function parseFontManifest(value) {
281
+ const manifest = requireObject(value, "font manifest");
282
+ requireKeys(manifest, MANIFEST_KEYS, "font manifest");
283
+ if (manifest.version !== FONT_MANIFEST_VERSION) {
284
+ manifestError(`font manifest.version must be ${FONT_MANIFEST_VERSION}.`, {
285
+ jsonPath: "font manifest.version",
286
+ value: manifest.version,
287
+ });
288
+ }
289
+ if (!Array.isArray(manifest.fonts)) {
290
+ manifestError("font manifest.fonts must be an array.", { jsonPath: "font manifest.fonts" });
291
+ }
292
+ const fonts = [];
293
+ const ids = new Set();
294
+ const families = new Set();
295
+ for (const [index, rawFamily] of manifest.fonts.entries()) {
296
+ const font = parseFontFamily(rawFamily, `font manifest.fonts[${index}]`);
297
+ if (ids.has(font.id)) {
298
+ manifestError(`font manifest contains the duplicate font id "${font.id}".`, {
299
+ jsonPath: `font manifest.fonts[${index}].id`,
300
+ value: font.id,
301
+ });
302
+ }
303
+ const familyKey = font.family.toLocaleLowerCase("en-US");
304
+ if (families.has(familyKey)) {
305
+ manifestError(`font manifest contains the duplicate CSS font-family "${font.family}".`, {
306
+ jsonPath: `font manifest.fonts[${index}].family`,
307
+ value: font.family,
308
+ });
309
+ }
310
+ ids.add(font.id);
311
+ families.add(familyKey);
312
+ fonts.push(font);
313
+ }
314
+ return { version: FONT_MANIFEST_VERSION, fonts };
315
+ }
316
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/fonts/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GAUtB,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,GAAG,sBAAsB,CAAC;AACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC;AACjC,MAAM,MAAM,GAAG,8BAA8B,CAAC;AAC9C,MAAM,aAAa,GAAG,0DAA0D,CAAC;AACjF,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,IAAI;IACJ,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,SAAS;IACT,UAAU;IACV,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAe,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;AACxE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAErE,SAAS,aAAa,CAAC,OAAe,EAAE,OAAiC;IACvE,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,GAAG,KAAK,0BAA0B,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAA8B,EAAE,OAAoB,EAAE,KAAa;IACtF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,aAAa,CAAC,GAAG,KAAK,+BAA+B,GAAG,IAAI,EAAE;gBAC5D,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE;gBAC3B,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,aAAa,CAAC,GAAG,KAAK,8BAA8B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,KAAa;IAC1D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc,EAAE,KAAa;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,IACE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,EACxF,CAAC;QACD,aAAa,CAAC,GAAG,KAAK,sEAAsE,EAAE;YAC5F,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,KAAa,EAAE,MAAc;IACzE,MAAM,IAAI,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,GAAG,iBAAiB,GAAG,MAAM,GAAG,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QAC9E,aAAa,CAAC,GAAG,KAAK,yBAAyB,cAAc,GAAG,EAAE;YAChE,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,IAAI;YACX,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,aAAa,CAAC,GAAG,KAAK,2BAA2B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,aAAa,CAAC,GAAG,KAAK,sBAAsB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC;YAChC,aAAa,CAAC,GAAG,KAAK,8BAA8B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACtD,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACvC,aAAa,CAAC,GAAG,KAAK,6DAA6D,EAAE;YACnF,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;SACpB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa;IAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;IAC3E,IAAI,GAAG,GAAG,GAAG,IAAI,YAAY,GAAG,GAAG,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;QAC1D,aAAa,CAAC,GAAG,KAAK,sCAAsC,EAAE;YAC5D,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa,EAAE,MAAc;IACjE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE,MAAM,CAAC,CAAC;IAClH,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,KAAK,cAAc,CAAC,CAAC;IACvF,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa,EAAE,MAAc;IAClE,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IACrG,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,aAAa,CAAC,GAAG,KAAK,4EAA4E,EAAE;YAClG,QAAQ,EAAE,GAAG,KAAK,SAAS;YAC3B,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAkB,CAAC,EAAE,CAAC;QAC3E,aAAa,CAAC,GAAG,KAAK,sCAAsC,EAAE;YAC5D,QAAQ,EAAE,GAAG,KAAK,QAAQ;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAoB,CAAC,EAAE,CAAC;QAC/E,aAAa,CAAC,GAAG,KAAK,mDAAmD,EAAE;YACzE,QAAQ,EAAE,GAAG,KAAK,SAAS;YAC3B,KAAK,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,eAAe,CAAC,CAAC;IAC1G,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,aAAa,CAAC,GAAG,KAAK,sDAAsD,EAAE;YAC5E,QAAQ,EAAE,GAAG,KAAK,eAAe;YACjC,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,aAAa,CAAC,GAAG,KAAK,oDAAoD,EAAE;YAC1E,QAAQ,EAAE,GAAG,KAAK,SAAS;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;IAC3D,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,aAAa,CAAC,GAAG,KAAK,oCAAoC,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IAErE,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAkB;QAC9B,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC;QACnD,MAAM,EAAE,IAAI,CAAC,MAAoB;QACjC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM;QACN,KAAK;QACL,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAkB;IACnC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;AACrF,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAExC,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACtB,aAAa,CAAC,GAAG,KAAK,uFAAuF,EAAE;YAC7G,QAAQ,EAAE,GAAG,KAAK,KAAK;YACvB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,aAAa,CACX,GAAG,KAAK,gHAAgH,EACxH;YACE,QAAQ,EAAE,GAAG,KAAK,SAAS;YAC3B,KAAK,EAAE,IAAI;SACZ,CACF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAwB,CAAC,EAAE,CAAC;QAC3F,aAAa,CAAC,GAAG,KAAK,oDAAoD,EAAE;YAC1E,QAAQ,EAAE,GAAG,KAAK,WAAW;YAC7B,KAAK,EAAE,MAAM,CAAC,QAAQ;SACvB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IACnF,MAAM,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,KAAK,kBAAkB,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,UAAU,EAAE,EAAE,CAAC,CAAC;IAErE,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC1E,aAAa,CAAC,GAAG,KAAK,8BAA8B,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,WAAW,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,IAA0C,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAC5D,IAAI,GAAG,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,aAAa,CAAC,GAAG,KAAK,wCAAwC,QAAQ,IAAI,EAAE;oBAC1E,QAAQ,EAAE,GAAG,KAAK,SAAS,QAAQ,EAAE;iBACtC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,SAAS,EAAE,GAAG,KAAK,SAAS,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,aAAa,CAAC,GAAG,KAAK,mCAAmC,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,KAAK,UAAU,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,aAAa,CAAC,GAAG,KAAK,uCAAuC,IAAI,CAAC,IAAI,IAAI,EAAE;gBAC1E,QAAQ,EAAE,GAAG,KAAK,UAAU,KAAK,QAAQ;gBACzC,KAAK,EAAE,IAAI,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,aAAa,CAAC,GAAG,KAAK,2DAA2D,EAAE;gBACjF,QAAQ,EAAE,GAAG,KAAK,UAAU,KAAK,GAAG;gBACpC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;aAC/E,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO;QACL,EAAE;QACF,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,MAAM,CAAC,QAAwB;QACzC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO;QACP,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,KAAK;KACN,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACvD,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAC/C,aAAa,CAAC,iCAAiC,qBAAqB,GAAG,EAAE;YACvE,QAAQ,EAAE,uBAAuB;YACjC,KAAK,EAAE,QAAQ,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,aAAa,CAAC,uCAAuC,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,EAAE,uBAAuB,KAAK,GAAG,CAAC,CAAC;QACzE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,aAAa,CAAC,iDAAiD,IAAI,CAAC,EAAE,IAAI,EAAE;gBAC1E,QAAQ,EAAE,uBAAuB,KAAK,MAAM;gBAC5C,KAAK,EAAE,IAAI,CAAC,EAAE;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,aAAa,CAAC,yDAAyD,IAAI,CAAC,MAAM,IAAI,EAAE;gBACtF,QAAQ,EAAE,uBAAuB,KAAK,UAAU;gBAChD,KAAK,EAAE,IAAI,CAAC,MAAM;aACnB,CAAC,CAAC;QACL,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { FontFamily } from "./types.js";
2
+ export interface FontSummary {
3
+ id: string;
4
+ family: string;
5
+ provider: string;
6
+ version?: string;
7
+ variable: boolean;
8
+ subsets: string[];
9
+ styles: string[];
10
+ license: string;
11
+ files: number;
12
+ bytes: number;
13
+ status: "ok" | "missing" | "invalid";
14
+ }
15
+ export declare function summarizeFont(font: FontFamily, status?: FontSummary["status"]): FontSummary;
16
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/fonts/summary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,GAAE,WAAW,CAAC,QAAQ,CAAQ,GAAG,WAAW,CAmBjG"}
@@ -0,0 +1,22 @@
1
+ import { uniqueFontValues } from "./manifest.js";
2
+ export function summarizeFont(font, status = "ok") {
3
+ const values = uniqueFontValues(font);
4
+ let bytes = 0;
5
+ for (const file of font.files) {
6
+ bytes += file.bytes;
7
+ }
8
+ return {
9
+ id: font.id,
10
+ family: font.family,
11
+ provider: font.provider,
12
+ ...(font.providerVersion !== undefined ? { version: font.providerVersion } : {}),
13
+ variable: font.variable === true,
14
+ subsets: values.subsets,
15
+ styles: values.styles,
16
+ license: font.license.type,
17
+ files: font.files.length,
18
+ bytes,
19
+ status,
20
+ };
21
+ }
22
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/fonts/summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAiBjD,MAAM,UAAU,aAAa,CAAC,IAAgB,EAAE,MAAM,GAA0B,IAAI;IAClF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;QAChC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;QACxB,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /** Project-local font manifest shared by the CLI, server, and context digest. */
2
+ export declare const FONT_MANIFEST_FILENAME = "fy.fonts.json";
3
+ export declare const FONT_MANIFEST_VERSION: 1;
4
+ export declare const FONT_ASSET_PREFIX = "assets/fonts/";
5
+ export type FontProvider = "local" | "fontsource" | "url";
6
+ export type FontStyle = "normal" | "italic";
7
+ export type FontFormat = "woff2" | "woff" | "ttf" | "otf";
8
+ export interface FontWeightRange {
9
+ min: number;
10
+ max: number;
11
+ }
12
+ export type FontWeight = number | FontWeightRange;
13
+ export interface FontLicense {
14
+ /** SPDX identifier, a license name, or "unknown". */
15
+ type: string;
16
+ /** Project-relative license file when the source provides one. */
17
+ file?: string;
18
+ attribution?: string;
19
+ }
20
+ export interface FontAxis {
21
+ min: number;
22
+ max: number;
23
+ default: number;
24
+ }
25
+ export interface FontFile {
26
+ /** Project-relative path below assets/fonts/<font-id>/. */
27
+ path: string;
28
+ subset?: string;
29
+ style: FontStyle;
30
+ weight: FontWeight;
31
+ format: FontFormat;
32
+ /** CSS unicode-range for this face, when the provider exposes one. */
33
+ unicodeRange?: string;
34
+ sha256: string;
35
+ bytes: number;
36
+ /** Upstream URL or identifier recorded for provenance. */
37
+ source?: string;
38
+ }
39
+ export interface FontFamily {
40
+ id: string;
41
+ /** CSS font-family name. */
42
+ family: string;
43
+ provider: FontProvider;
44
+ providerId?: string;
45
+ providerVersion?: string;
46
+ license: FontLicense;
47
+ variable?: boolean;
48
+ axes?: Record<string, FontAxis>;
49
+ files: FontFile[];
50
+ }
51
+ export interface FontManifest {
52
+ version: typeof FONT_MANIFEST_VERSION;
53
+ fonts: FontFamily[];
54
+ }
55
+ export declare function emptyFontManifest(): FontManifest;
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fonts/types.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AACtD,eAAO,MAAM,qBAAqB,EAAG,CAAU,CAAC;AAChD,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,YAAY,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,eAAe,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,qBAAqB,CAAC;IACtC,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,wBAAgB,iBAAiB,IAAI,YAAY,CAEhD"}
@@ -0,0 +1,8 @@
1
+ /** Project-local font manifest shared by the CLI, server, and context digest. */
2
+ export const FONT_MANIFEST_FILENAME = "fy.fonts.json";
3
+ export const FONT_MANIFEST_VERSION = 1;
4
+ export const FONT_ASSET_PREFIX = "assets/fonts/";
5
+ export function emptyFontManifest() {
6
+ return { version: FONT_MANIFEST_VERSION, fonts: [] };
7
+ }
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/fonts/types.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AACtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAU,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AA4DjD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type FrameyardErrorCode } from "../errors.js";
2
+ import { type FontManifest } from "./types.js";
3
+ export interface FontVerificationDiagnostic {
4
+ severity: "error" | "warning";
5
+ code: FrameyardErrorCode;
6
+ message: string;
7
+ font?: string;
8
+ file?: string;
9
+ details?: Record<string, unknown>;
10
+ }
11
+ export interface FontVerification {
12
+ manifest: string;
13
+ fonts: number;
14
+ files: number;
15
+ bytes: number;
16
+ diagnostics: FontVerificationDiagnostic[];
17
+ valid: boolean;
18
+ }
19
+ export interface FontVerificationOptions {
20
+ projectRoot: string;
21
+ manifest: FontManifest;
22
+ hashes: boolean;
23
+ licenses: boolean;
24
+ orphans?: boolean;
25
+ }
26
+ /** Verifies manifest files, hashes, licenses, and orphaned font directories. */
27
+ export declare function verifyFontManifest(options: FontVerificationOptions): Promise<FontVerification>;
28
+ export declare function fontStatuses(verification: FontVerification): Map<string, "ok" | "missing" | "invalid">;
29
+ /** Fails before capture when a declared font file is missing or modified. */
30
+ export declare function assertFontIntegrity(projectRoot: string, manifest: FontManifest | undefined, options: {
31
+ hashes: boolean;
32
+ }): Promise<void>;
33
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/fonts/verify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC1C,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqDD,gFAAgF;AAChF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6KpG;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC,CActG;AAED,6EAA6E;AAC7E,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmCf"}