handoff-app 1.2.2-7 → 2.0.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 (349) hide show
  1. package/Changelog.md +37 -15
  2. package/README.md +372 -118
  3. package/dist/app-builder/build.d.ts +41 -2
  4. package/dist/app-builder/build.js +455 -18
  5. package/dist/app-builder/client-config.d.ts +15 -2
  6. package/dist/app-builder/client-config.js +43 -4
  7. package/dist/app-builder/config-diff/snapshot.d.ts +1 -6
  8. package/dist/app-builder/config-diff/snapshot.js +2 -9
  9. package/dist/app-builder/index.d.ts +1 -1
  10. package/dist/app-builder/index.js +3 -1
  11. package/dist/app-builder/nav-shell.d.ts +23 -0
  12. package/dist/app-builder/nav-shell.js +80 -0
  13. package/dist/app-builder/static-export.d.ts +17 -0
  14. package/dist/app-builder/static-export.js +181 -0
  15. package/dist/app-builder/vercel-output.d.ts +39 -0
  16. package/dist/app-builder/vercel-output.js +259 -0
  17. package/dist/app-builder/watchers/utils.d.ts +2 -0
  18. package/dist/app-builder/watchers.d.ts +14 -4
  19. package/dist/app-builder/watchers.js +123 -28
  20. package/dist/app-builder/websocket.js +1 -1
  21. package/dist/artifacts/index.d.ts +2 -0
  22. package/dist/artifacts/index.js +13 -0
  23. package/dist/artifacts/types.d.ts +136 -0
  24. package/dist/artifacts/types.js +24 -0
  25. package/dist/artifacts/url.d.ts +49 -0
  26. package/dist/artifacts/url.js +86 -0
  27. package/dist/cache/build-cache.js +48 -4
  28. package/dist/cli.js +0 -0
  29. package/dist/commands/build/app.js +1 -2
  30. package/dist/commands/build/index.d.ts +17 -0
  31. package/dist/commands/build/index.js +66 -0
  32. package/dist/commands/checkout/index.d.ts +24 -0
  33. package/dist/commands/checkout/index.js +71 -0
  34. package/dist/commands/db/migrate.d.ts +11 -0
  35. package/dist/commands/db/migrate.js +33 -0
  36. package/dist/commands/index.js +8 -0
  37. package/dist/commands/publish/index.d.ts +21 -0
  38. package/dist/commands/publish/index.js +68 -0
  39. package/dist/config/defaults.js +15 -1
  40. package/dist/config/loader.js +6 -1
  41. package/dist/config/normalizers/declaration.js +4 -1
  42. package/dist/config/normalizers/page.d.ts +18 -0
  43. package/dist/config/normalizers/page.js +34 -0
  44. package/dist/config/normalizers/pattern.js +7 -1
  45. package/dist/config/runtime.d.ts +4 -0
  46. package/dist/config/runtime.js +53 -5
  47. package/dist/index.d.ts +65 -1
  48. package/dist/index.js +123 -3
  49. package/dist/nav/index.d.ts +83 -0
  50. package/dist/nav/index.js +9 -0
  51. package/dist/nav/registry.d.ts +15 -0
  52. package/dist/nav/registry.js +42 -0
  53. package/dist/nav/resolver.d.ts +8 -0
  54. package/dist/nav/resolver.js +192 -0
  55. package/dist/nav/workspace.d.ts +18 -0
  56. package/dist/nav/workspace.js +103 -0
  57. package/dist/pipeline/styles.js +7 -35
  58. package/dist/pipeline/token-transformers.d.ts +45 -0
  59. package/dist/pipeline/token-transformers.js +71 -0
  60. package/dist/registry/asset-storage/adapters/vercel-blob.d.ts +17 -0
  61. package/dist/registry/asset-storage/adapters/vercel-blob.js +87 -0
  62. package/dist/registry/asset-storage/define.d.ts +10 -0
  63. package/dist/registry/asset-storage/define.js +13 -0
  64. package/dist/registry/asset-storage/resolve.d.ts +45 -0
  65. package/dist/registry/asset-storage/resolve.js +36 -0
  66. package/dist/registry/asset-storage/types.d.ts +51 -0
  67. package/dist/registry/asset-storage/types.js +9 -0
  68. package/dist/registry/assets/layout.d.ts +22 -0
  69. package/dist/registry/assets/layout.js +30 -0
  70. package/dist/registry/assets/sets.d.ts +18 -0
  71. package/dist/registry/assets/sets.js +44 -0
  72. package/dist/registry/assets/transfer.d.ts +45 -0
  73. package/dist/registry/assets/transfer.js +11 -0
  74. package/dist/registry/checkout/assets.d.ts +16 -0
  75. package/dist/registry/checkout/assets.js +150 -0
  76. package/dist/registry/checkout/index.d.ts +33 -0
  77. package/dist/registry/checkout/index.js +610 -0
  78. package/dist/registry/checkout/tokens.d.ts +15 -0
  79. package/dist/registry/checkout/tokens.js +171 -0
  80. package/dist/registry/client.d.ts +61 -0
  81. package/dist/registry/client.js +211 -0
  82. package/dist/registry/connection.d.ts +30 -0
  83. package/dist/registry/connection.js +36 -0
  84. package/dist/registry/db/adapter.d.ts +43 -0
  85. package/dist/registry/db/adapter.js +59 -0
  86. package/dist/registry/db/client.d.ts +35 -0
  87. package/dist/registry/db/client.js +94 -0
  88. package/dist/registry/db/index.d.ts +5 -0
  89. package/dist/registry/db/index.js +24 -0
  90. package/dist/registry/db/migrate.d.ts +23 -0
  91. package/dist/registry/db/migrate.js +64 -0
  92. package/dist/registry/db/schema.d.ts +4869 -0
  93. package/dist/registry/db/schema.js +347 -0
  94. package/dist/registry/path.d.ts +4 -0
  95. package/dist/registry/path.js +31 -0
  96. package/dist/registry/publish/artifacts.d.ts +16 -0
  97. package/dist/registry/publish/artifacts.js +132 -0
  98. package/dist/registry/publish/assets.d.ts +16 -0
  99. package/dist/registry/publish/assets.js +129 -0
  100. package/dist/registry/publish/errors.d.ts +5 -0
  101. package/dist/registry/publish/errors.js +26 -0
  102. package/dist/registry/publish/index.d.ts +27 -0
  103. package/dist/registry/publish/index.js +126 -0
  104. package/dist/registry/publish/package.d.ts +27 -0
  105. package/dist/registry/publish/package.js +257 -0
  106. package/dist/registry/publish/publish-build.d.ts +12 -0
  107. package/dist/registry/publish/publish-build.js +43 -0
  108. package/dist/registry/publish/tokens.d.ts +18 -0
  109. package/dist/registry/publish/tokens.js +112 -0
  110. package/dist/registry/tokens/sets.d.ts +59 -0
  111. package/dist/registry/tokens/sets.js +109 -0
  112. package/dist/registry/tokens/transfer.d.ts +48 -0
  113. package/dist/registry/tokens/transfer.js +10 -0
  114. package/dist/registry/transfer.d.ts +75 -0
  115. package/dist/registry/transfer.js +11 -0
  116. package/dist/store/filesystem-assets.d.ts +17 -0
  117. package/dist/store/filesystem-assets.js +147 -0
  118. package/dist/store/filesystem.d.ts +76 -0
  119. package/dist/store/filesystem.js +208 -0
  120. package/dist/store/index.d.ts +20 -0
  121. package/dist/store/index.js +38 -0
  122. package/dist/store/registry.d.ts +77 -0
  123. package/dist/store/registry.js +350 -0
  124. package/dist/store/source-files.d.ts +24 -0
  125. package/dist/store/source-files.js +147 -0
  126. package/dist/store/types.d.ts +185 -0
  127. package/dist/store/types.js +12 -0
  128. package/dist/transformers/plugins/csf-render.js +17 -8
  129. package/dist/transformers/plugins/handlebars-previews.js +10 -3
  130. package/dist/transformers/plugins/ssr-render.js +116 -49
  131. package/dist/transformers/preview/component/api.js +3 -1
  132. package/dist/transformers/preview/component/artifacts.js +8 -1
  133. package/dist/transformers/preview/component/builder.js +13 -5
  134. package/dist/transformers/preview/component/css.js +9 -1
  135. package/dist/transformers/preview/component/javascript.d.ts +9 -3
  136. package/dist/transformers/preview/component/javascript.js +45 -17
  137. package/dist/transformers/preview/component/shared-artifacts.d.ts +83 -0
  138. package/dist/transformers/preview/component/shared-artifacts.js +92 -0
  139. package/dist/transformers/preview/component.js +5 -2
  140. package/dist/transformers/preview/pattern/builder.js +28 -9
  141. package/dist/transformers/preview/pattern/html.d.ts +13 -10
  142. package/dist/transformers/preview/pattern/html.js +62 -27
  143. package/dist/transformers/preview/types.d.ts +38 -0
  144. package/dist/transformers/utils/handlebars.d.ts +3 -0
  145. package/dist/transformers/utils/handlebars.js +19 -5
  146. package/dist/types/config.d.ts +118 -25
  147. package/dist/utils/menu-shell.d.ts +60 -0
  148. package/dist/utils/menu-shell.js +221 -0
  149. package/dist/utils/stable-stringify.d.ts +2 -0
  150. package/dist/utils/stable-stringify.js +8 -0
  151. package/docs/cli.md +4 -2
  152. package/drizzle/0000_init_registry_storage.sql +95 -0
  153. package/drizzle/0001_add_review_metadata.sql +2 -0
  154. package/drizzle/0002_add_pages.sql +28 -0
  155. package/drizzle/0003_add_tokens.sql +29 -0
  156. package/drizzle/0004_add_assets.sql +37 -0
  157. package/drizzle/meta/0000_snapshot.json +642 -0
  158. package/drizzle/meta/0001_snapshot.json +654 -0
  159. package/drizzle/meta/0002_snapshot.json +835 -0
  160. package/drizzle/meta/0003_snapshot.json +1023 -0
  161. package/drizzle/meta/0004_snapshot.json +1252 -0
  162. package/drizzle/meta/_journal.json +41 -0
  163. package/drizzle.config.ts +16 -0
  164. package/package.json +10 -1
  165. package/src/app/components/Component/Preview.tsx +3 -2
  166. package/src/app/components/Component/RegistryActions.tsx +150 -0
  167. package/src/app/components/Foundations/DisplayLogo.tsx +5 -3
  168. package/src/app/components/Layout/Header.tsx +21 -3
  169. package/src/app/components/Layout/Main.tsx +11 -3
  170. package/src/app/components/Navigation/MainNav.tsx +4 -2
  171. package/src/app/components/Navigation/MobileNav.tsx +4 -2
  172. package/src/app/components/Navigation/SideNav.tsx +46 -11
  173. package/src/app/components/NotFound.tsx +24 -0
  174. package/src/app/components/context/NavProvider.tsx +71 -0
  175. package/src/app/components/old/Header.tsx +3 -3
  176. package/src/app/components/util/index.ts +203 -380
  177. package/src/app/components/util/useCollectionAssets.ts +125 -0
  178. package/src/app/components/util/useFoundationTokens.ts +67 -0
  179. package/src/app/generated/default-pages.json +1 -0
  180. package/src/app/generated/nav-shell.json +1 -0
  181. package/src/app/lib/api/query.ts +6 -0
  182. package/src/app/lib/api/redact.ts +46 -0
  183. package/src/app/lib/asset-storage.ts +81 -0
  184. package/src/app/lib/docs-api/artifacts.ts +116 -0
  185. package/src/app/lib/docs-api/backend.ts +151 -0
  186. package/src/app/lib/docs-api/errors.ts +52 -0
  187. package/src/app/lib/docs-api/handler.ts +34 -0
  188. package/src/app/lib/docs-api/index.ts +7 -0
  189. package/src/app/lib/docs-api/records.ts +189 -0
  190. package/src/app/lib/docs-api/registry.ts +130 -0
  191. package/src/app/lib/docs-api/runtime-config.ts +173 -0
  192. package/src/app/lib/docs-api/serve.ts +37 -0
  193. package/src/app/lib/docs-api/token-detail.ts +19 -0
  194. package/src/app/lib/registry-api/allowlist.ts +163 -0
  195. package/src/app/lib/registry-api/asset-transfer.ts +363 -0
  196. package/src/app/lib/registry-api/auth.ts +68 -0
  197. package/src/app/lib/registry-api/entity-routes.ts +197 -0
  198. package/src/app/lib/registry-api/errors.ts +51 -0
  199. package/src/app/lib/registry-api/files.ts +135 -0
  200. package/src/app/lib/registry-api/handler.ts +96 -0
  201. package/src/app/lib/registry-api/index.ts +4 -0
  202. package/src/app/lib/registry-api/meta.ts +87 -0
  203. package/src/app/lib/registry-api/revalidate.ts +36 -0
  204. package/src/app/lib/registry-api/store.ts +348 -0
  205. package/src/app/lib/registry-api/token-transfer.ts +231 -0
  206. package/src/app/lib/registry-api/transfer.ts +513 -0
  207. package/src/app/lib/registry-api/validation.ts +74 -0
  208. package/src/app/lib/registry-connection.ts +58 -0
  209. package/src/app/lib/utils.ts +14 -0
  210. package/src/app/next.config.mjs +72 -13
  211. package/src/app/pages/[...slug]/index.tsx +74 -20
  212. package/src/app/pages/_app.tsx +5 -2
  213. package/src/app/pages/api/docs/artifacts/[...artifactPath].ts +16 -0
  214. package/src/app/pages/api/docs/assets/[collection]/[...path].ts +50 -0
  215. package/src/app/pages/api/docs/assets/[collection]/index.ts +22 -0
  216. package/src/app/pages/api/docs/components/[id]/assets/[asset].ts +33 -0
  217. package/src/app/pages/api/docs/components/[id]/inspect/[previewId].ts +20 -0
  218. package/src/app/pages/api/docs/components/[id]/previews/[previewId].ts +21 -0
  219. package/src/app/pages/api/docs/components/[id].ts +24 -0
  220. package/src/app/pages/api/docs/components.json.ts +12 -0
  221. package/src/app/pages/api/docs/nav.json.ts +48 -0
  222. package/src/app/pages/api/docs/patterns/[id]/preview.ts +19 -0
  223. package/src/app/pages/api/docs/patterns/[id].ts +24 -0
  224. package/src/app/pages/api/docs/patterns.json.ts +12 -0
  225. package/src/app/pages/api/docs/tokens/components/[id].ts +30 -0
  226. package/src/app/pages/api/docs/tokens/foundations/[type].ts +32 -0
  227. package/src/app/pages/api/registry/components/[id]/files/[...filePath].ts +19 -0
  228. package/src/app/pages/api/registry/components/[id]/files/index.ts +19 -0
  229. package/src/app/pages/api/registry/components/[id].ts +20 -0
  230. package/src/app/pages/api/registry/components/index.ts +19 -0
  231. package/src/app/pages/api/registry/health.ts +20 -0
  232. package/src/app/pages/api/registry/patterns/[id]/files/[...filePath].ts +19 -0
  233. package/src/app/pages/api/registry/patterns/[id]/files/index.ts +19 -0
  234. package/src/app/pages/api/registry/patterns/[id].ts +20 -0
  235. package/src/app/pages/api/registry/patterns/index.ts +19 -0
  236. package/src/app/pages/api/registry/transfer/[kind]/[id].ts +39 -0
  237. package/src/app/pages/api/registry/transfer/assets/[collection].ts +24 -0
  238. package/src/app/pages/api/registry/transfer/assets/blobs/[hash].ts +23 -0
  239. package/src/app/pages/api/registry/transfer/assets/blobs/have.ts +11 -0
  240. package/src/app/pages/api/registry/transfer/assets/index.ts +10 -0
  241. package/src/app/pages/api/registry/transfer/tokens/[...setId].ts +26 -0
  242. package/src/app/pages/api/registry/transfer/tokens/index.ts +11 -0
  243. package/src/app/pages/assets/fonts.tsx +41 -17
  244. package/src/app/pages/assets/index.tsx +2 -2
  245. package/src/app/pages/assets/logos.tsx +2 -2
  246. package/src/app/pages/foundations/colors.tsx +18 -8
  247. package/src/app/pages/foundations/effects.tsx +18 -8
  248. package/src/app/pages/foundations/icons/[name]/index.tsx +26 -14
  249. package/src/app/pages/foundations/icons/index.tsx +13 -9
  250. package/src/app/pages/foundations/index.tsx +1 -1
  251. package/src/app/pages/foundations/logo.tsx +7 -4
  252. package/src/app/pages/foundations/typography.tsx +19 -9
  253. package/src/app/pages/index.tsx +1 -1
  254. package/src/app/pages/system/component/[component]/index.tsx +87 -17
  255. package/src/app/pages/system/index.tsx +13 -4
  256. package/src/app/pages/system/pattern/[pattern]/index.tsx +70 -14
  257. package/src/app/pages/system/tokens/components/[component]/index.tsx +42 -14
  258. package/src/app/pages/system/tokens/foundations/colors.tsx +7 -5
  259. package/src/app/pages/system/tokens/foundations/effects.tsx +7 -5
  260. package/src/app/pages/system/tokens/foundations/typography.tsx +8 -4
  261. package/src/app/tsconfig.json +2 -3
  262. package/src/app-builder/build.ts +555 -11
  263. package/src/app-builder/client-config.ts +61 -4
  264. package/src/app-builder/config-diff/snapshot.ts +1 -11
  265. package/src/app-builder/index.ts +1 -1
  266. package/src/app-builder/nav-shell.ts +74 -0
  267. package/src/app-builder/static-export.ts +215 -0
  268. package/src/app-builder/vercel-output.ts +297 -0
  269. package/src/app-builder/watchers/utils.ts +2 -0
  270. package/src/app-builder/watchers.ts +149 -25
  271. package/src/app-builder/websocket.ts +2 -2
  272. package/src/artifacts/README.md +14 -0
  273. package/src/artifacts/index.ts +17 -0
  274. package/src/artifacts/types.ts +146 -0
  275. package/src/artifacts/url.ts +90 -0
  276. package/src/cache/build-cache.ts +47 -2
  277. package/src/commands/build/app.ts +1 -2
  278. package/src/commands/build/index.ts +61 -0
  279. package/src/commands/checkout/index.ts +66 -0
  280. package/src/commands/db/migrate.ts +25 -0
  281. package/src/commands/index.ts +8 -0
  282. package/src/commands/publish/index.ts +63 -0
  283. package/src/config/defaults.ts +15 -0
  284. package/src/config/loader.ts +10 -1
  285. package/src/config/normalizers/declaration.ts +3 -0
  286. package/src/config/normalizers/page.ts +45 -0
  287. package/src/config/normalizers/pattern.ts +4 -1
  288. package/src/config/runtime.ts +48 -2
  289. package/src/index.ts +126 -3
  290. package/src/nav/index.ts +94 -0
  291. package/src/nav/registry.ts +54 -0
  292. package/src/nav/resolver.ts +217 -0
  293. package/src/nav/workspace.ts +87 -0
  294. package/src/pipeline/styles.ts +4 -35
  295. package/src/pipeline/token-transformers.ts +97 -0
  296. package/src/registry/asset-storage/adapters/vercel-blob.ts +51 -0
  297. package/src/registry/asset-storage/define.ts +15 -0
  298. package/src/registry/asset-storage/resolve.ts +72 -0
  299. package/src/registry/asset-storage/types.ts +46 -0
  300. package/src/registry/assets/layout.ts +38 -0
  301. package/src/registry/assets/sets.ts +48 -0
  302. package/src/registry/assets/transfer.ts +50 -0
  303. package/src/registry/checkout/assets.ts +126 -0
  304. package/src/registry/checkout/index.ts +596 -0
  305. package/src/registry/checkout/tokens.ts +152 -0
  306. package/src/registry/client.ts +234 -0
  307. package/src/registry/connection.ts +50 -0
  308. package/src/registry/db/adapter.ts +74 -0
  309. package/src/registry/db/client.ts +88 -0
  310. package/src/registry/db/index.ts +35 -0
  311. package/src/registry/db/migrate.ts +56 -0
  312. package/src/registry/db/schema.ts +444 -0
  313. package/src/registry/path.ts +26 -0
  314. package/src/registry/publish/artifacts.ts +147 -0
  315. package/src/registry/publish/assets.ts +129 -0
  316. package/src/registry/publish/errors.ts +34 -0
  317. package/src/registry/publish/index.ts +128 -0
  318. package/src/registry/publish/package.ts +272 -0
  319. package/src/registry/publish/publish-build.ts +51 -0
  320. package/src/registry/publish/tokens.ts +119 -0
  321. package/src/registry/tokens/sets.ts +132 -0
  322. package/src/registry/tokens/transfer.ts +53 -0
  323. package/src/registry/transfer.ts +82 -0
  324. package/src/store/filesystem-assets.ts +152 -0
  325. package/src/store/filesystem.ts +237 -0
  326. package/src/store/index.ts +62 -0
  327. package/src/store/registry.ts +334 -0
  328. package/src/store/source-files.ts +155 -0
  329. package/src/store/types.ts +210 -0
  330. package/src/transformers/plugins/csf-render.ts +31 -7
  331. package/src/transformers/plugins/handlebars-previews.ts +22 -3
  332. package/src/transformers/plugins/ssr-render.ts +145 -57
  333. package/src/transformers/preview/component/api.ts +2 -1
  334. package/src/transformers/preview/component/artifacts.ts +10 -1
  335. package/src/transformers/preview/component/builder.ts +9 -2
  336. package/src/transformers/preview/component/css.ts +10 -1
  337. package/src/transformers/preview/component/javascript.ts +55 -20
  338. package/src/transformers/preview/component/shared-artifacts.ts +146 -0
  339. package/src/transformers/preview/component.ts +5 -2
  340. package/src/transformers/preview/pattern/builder.ts +33 -7
  341. package/src/transformers/preview/pattern/html.ts +71 -27
  342. package/src/transformers/preview/types.ts +42 -0
  343. package/src/transformers/utils/handlebars.ts +31 -5
  344. package/src/types/config.ts +123 -25
  345. package/src/utils/menu-shell.ts +241 -0
  346. package/src/utils/stable-stringify.ts +7 -0
  347. package/templates/default/package.json.tpl +1 -1
  348. package/handoff.config.js +0 -90
  349. package/src/app/components/ComponentSearch.tsx +0 -93
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Filesystem-backed implementation of the normalized store abstraction.
3
+ *
4
+ * It is a thin read view over the already-resolved `runtimeConfig.entries`, so the records it
5
+ * returns are the same normalized component/pattern records the build consumes today — discovery
6
+ * and normalization (modern `*.handoff.*` + legacy `{dirname}.*`, react/handlebars/csf/plain-object
7
+ * declarations, CSF story discovery, `entries` resolution) all happen upstream in
8
+ * `initRuntimeConfig`. The store adds the source-location and related-source-files accessors
9
+ * without changing how anything is discovered or built.
10
+ */
11
+ import type { ComponentListObject, PageListObject, PatternListObject } from '../transformers/preview/types';
12
+ import type { Config, RuntimeConfig } from '../types/config';
13
+ import type { ComponentStore, PageStore, PatternStore, SourceReference, TextFileResource, TokenArtifactResource, TokenSetRecord, TokenStore } from './types';
14
+ /**
15
+ * Minimal context needed to back the filesystem store. A `Handoff` instance satisfies this (it
16
+ * carries `runtimeConfig`/`config` and the token path accessors), so the store stays a thin read
17
+ * view without importing the `Handoff` class.
18
+ */
19
+ export interface FilesystemStoreContext {
20
+ runtimeConfig?: RuntimeConfig | null;
21
+ config?: Config | null;
22
+ /** Workspace root (`Handoff.workingPath`), holding `public/` and `fonts/`. */
23
+ workingPath?: string;
24
+ /** Absolute path to the generated `tokens.json` (`Handoff.getTokensFilePath()`). */
25
+ getTokensFilePath?(): string;
26
+ /** Absolute path to the generated tokens output dir (`Handoff.getVariablesFilePath()`). */
27
+ getVariablesFilePath?(): string;
28
+ /** Absolute path to the docs API root `public/api` (`Handoff.getAssetsApiPath()`). */
29
+ getAssetsApiPath?(): string;
30
+ /** Absolute path of `icons.zip` (`Handoff.getIconsZipFilePath()`). */
31
+ getIconsZipFilePath?(): string;
32
+ /** Absolute path of `logos.zip` (`Handoff.getLogosZipFilePath()`). */
33
+ getLogosZipFilePath?(): string;
34
+ }
35
+ export declare class FilesystemComponentStore implements ComponentStore {
36
+ private readonly context;
37
+ constructor(context: FilesystemStoreContext);
38
+ private get records();
39
+ list(): ComponentListObject[];
40
+ get(id: string): ComponentListObject | null;
41
+ getSource(ref: SourceReference): TextFileResource | null;
42
+ getRelatedSourceFiles(id: string): TextFileResource[];
43
+ }
44
+ export declare class FilesystemPatternStore implements PatternStore {
45
+ private readonly context;
46
+ constructor(context: FilesystemStoreContext);
47
+ private get records();
48
+ list(): PatternListObject[];
49
+ get(id: string): PatternListObject | null;
50
+ getSource(ref: SourceReference): TextFileResource | null;
51
+ getRelatedSourceFiles(id: string): TextFileResource[];
52
+ }
53
+ export declare class FilesystemPageStore implements PageStore {
54
+ private readonly context;
55
+ constructor(context: FilesystemStoreContext);
56
+ private get records();
57
+ list(): PageListObject[];
58
+ get(id: string): PageListObject | null;
59
+ getSource(ref: SourceReference): TextFileResource | null;
60
+ getRelatedSourceFiles(id: string): TextFileResource[];
61
+ }
62
+ export declare const tokenArtifactContentType: (artifactPath: string) => string;
63
+ /**
64
+ * Filesystem-backed token store. Derives logical sets from the generated `tokens.json` and reads
65
+ * their generated artifacts from the tokens output dir using the shared transformer layout, so the
66
+ * paths it reads are exactly the ones `buildStyles` writes.
67
+ */
68
+ export declare class FilesystemTokenStore implements TokenStore {
69
+ private readonly context;
70
+ constructor(context: FilesystemStoreContext);
71
+ private readDocument;
72
+ listSets(): TokenSetRecord[];
73
+ getSet(id: string): TokenSetRecord | null;
74
+ getArtifacts(id: string): TokenArtifactResource[];
75
+ getArtifact(id: string, format: string): TokenArtifactResource | null;
76
+ }
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * Filesystem-backed implementation of the normalized store abstraction.
4
+ *
5
+ * It is a thin read view over the already-resolved `runtimeConfig.entries`, so the records it
6
+ * returns are the same normalized component/pattern records the build consumes today — discovery
7
+ * and normalization (modern `*.handoff.*` + legacy `{dirname}.*`, react/handlebars/csf/plain-object
8
+ * declarations, CSF story discovery, `entries` resolution) all happen upstream in
9
+ * `initRuntimeConfig`. The store adds the source-location and related-source-files accessors
10
+ * without changing how anything is discovered or built.
11
+ */
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.FilesystemTokenStore = exports.tokenArtifactContentType = exports.FilesystemPageStore = exports.FilesystemPatternStore = exports.FilesystemComponentStore = void 0;
17
+ const fs_extra_1 = __importDefault(require("fs-extra"));
18
+ const path_1 = __importDefault(require("path"));
19
+ const token_transformers_1 = require("../pipeline/token-transformers");
20
+ const sets_1 = require("../registry/tokens/sets");
21
+ const source_files_1 = require("./source-files");
22
+ const readSourceByReference = (ref) => {
23
+ const { absolutePath } = ref;
24
+ try {
25
+ if (!absolutePath || !fs_extra_1.default.existsSync(absolutePath) || !fs_extra_1.default.statSync(absolutePath).isFile()) {
26
+ return null;
27
+ }
28
+ return {
29
+ path: absolutePath,
30
+ absolutePath,
31
+ kind: 'other',
32
+ content: fs_extra_1.default.readFileSync(absolutePath, 'utf8'),
33
+ contentType: (0, source_files_1.sourceContentTypeForPath)(absolutePath),
34
+ };
35
+ }
36
+ catch (_a) {
37
+ return null;
38
+ }
39
+ };
40
+ class FilesystemComponentStore {
41
+ constructor(context) {
42
+ this.context = context;
43
+ }
44
+ get records() {
45
+ var _a, _b, _c;
46
+ return (_c = (_b = (_a = this.context.runtimeConfig) === null || _a === void 0 ? void 0 : _a.entries) === null || _b === void 0 ? void 0 : _b.components) !== null && _c !== void 0 ? _c : {};
47
+ }
48
+ list() {
49
+ return Object.values(this.records);
50
+ }
51
+ get(id) {
52
+ var _a;
53
+ return (_a = this.records[id]) !== null && _a !== void 0 ? _a : null;
54
+ }
55
+ getSource(ref) {
56
+ return readSourceByReference(ref);
57
+ }
58
+ getRelatedSourceFiles(id) {
59
+ const record = this.records[id];
60
+ if (!record)
61
+ return [];
62
+ return (0, source_files_1.getRelatedSourceFilesForRecord)(record);
63
+ }
64
+ }
65
+ exports.FilesystemComponentStore = FilesystemComponentStore;
66
+ class FilesystemPatternStore {
67
+ constructor(context) {
68
+ this.context = context;
69
+ }
70
+ get records() {
71
+ var _a, _b, _c;
72
+ return (_c = (_b = (_a = this.context.runtimeConfig) === null || _a === void 0 ? void 0 : _a.entries) === null || _b === void 0 ? void 0 : _b.patterns) !== null && _c !== void 0 ? _c : {};
73
+ }
74
+ list() {
75
+ return Object.values(this.records);
76
+ }
77
+ get(id) {
78
+ var _a;
79
+ return (_a = this.records[id]) !== null && _a !== void 0 ? _a : null;
80
+ }
81
+ getSource(ref) {
82
+ return readSourceByReference(ref);
83
+ }
84
+ getRelatedSourceFiles(id) {
85
+ const record = this.records[id];
86
+ if (!record)
87
+ return [];
88
+ return (0, source_files_1.getRelatedSourceFilesForRecord)(record);
89
+ }
90
+ }
91
+ exports.FilesystemPatternStore = FilesystemPatternStore;
92
+ /**
93
+ * Read a page's verbatim source `.md` as a registry-safe `markdown` resource. The registry-safe path
94
+ * is `${id}.md` (id may contain slashes for nested pages), which is also where checkout writes it.
95
+ */
96
+ const readPageSource = (record) => {
97
+ const absolutePath = record.sourcePath;
98
+ try {
99
+ if (!absolutePath || !fs_extra_1.default.existsSync(absolutePath) || !fs_extra_1.default.statSync(absolutePath).isFile()) {
100
+ return null;
101
+ }
102
+ return {
103
+ path: `${record.id}.md`,
104
+ absolutePath,
105
+ kind: 'markdown',
106
+ content: fs_extra_1.default.readFileSync(absolutePath, 'utf8'),
107
+ contentType: 'text/markdown; charset=utf-8',
108
+ };
109
+ }
110
+ catch (_a) {
111
+ return null;
112
+ }
113
+ };
114
+ class FilesystemPageStore {
115
+ constructor(context) {
116
+ this.context = context;
117
+ }
118
+ get records() {
119
+ var _a, _b, _c;
120
+ return (_c = (_b = (_a = this.context.runtimeConfig) === null || _a === void 0 ? void 0 : _a.entries) === null || _b === void 0 ? void 0 : _b.pages) !== null && _c !== void 0 ? _c : {};
121
+ }
122
+ list() {
123
+ return Object.values(this.records);
124
+ }
125
+ get(id) {
126
+ var _a;
127
+ return (_a = this.records[id]) !== null && _a !== void 0 ? _a : null;
128
+ }
129
+ getSource(ref) {
130
+ return readSourceByReference(ref);
131
+ }
132
+ getRelatedSourceFiles(id) {
133
+ const record = this.records[id];
134
+ if (!record)
135
+ return [];
136
+ const resource = readPageSource(record);
137
+ return resource ? [resource] : [];
138
+ }
139
+ }
140
+ exports.FilesystemPageStore = FilesystemPageStore;
141
+ /** Content type for a generated token artifact, keyed by extension. */
142
+ const CONTENT_TYPE_BY_EXT = {
143
+ '.css': 'text/css; charset=utf-8',
144
+ '.scss': 'text/x-scss; charset=utf-8',
145
+ '.sass': 'text/x-sass; charset=utf-8',
146
+ '.json': 'application/json; charset=utf-8',
147
+ };
148
+ const tokenArtifactContentType = (artifactPath) => { var _a; return (_a = CONTENT_TYPE_BY_EXT[path_1.default.extname(artifactPath).toLowerCase()]) !== null && _a !== void 0 ? _a : 'text/plain; charset=utf-8'; };
149
+ exports.tokenArtifactContentType = tokenArtifactContentType;
150
+ /**
151
+ * Filesystem-backed token store. Derives logical sets from the generated `tokens.json` and reads
152
+ * their generated artifacts from the tokens output dir using the shared transformer layout, so the
153
+ * paths it reads are exactly the ones `buildStyles` writes.
154
+ */
155
+ class FilesystemTokenStore {
156
+ constructor(context) {
157
+ this.context = context;
158
+ }
159
+ readDocument() {
160
+ var _a, _b;
161
+ const tokensFilePath = (_b = (_a = this.context).getTokensFilePath) === null || _b === void 0 ? void 0 : _b.call(_a);
162
+ if (!tokensFilePath || !fs_extra_1.default.existsSync(tokensFilePath)) {
163
+ return [];
164
+ }
165
+ try {
166
+ const doc = JSON.parse(fs_extra_1.default.readFileSync(tokensFilePath, 'utf8'));
167
+ return (0, sets_1.deriveTokenSets)(doc);
168
+ }
169
+ catch (_c) {
170
+ return [];
171
+ }
172
+ }
173
+ listSets() {
174
+ return this.readDocument().map(({ id, kind, record }) => ({ id, kind, record }));
175
+ }
176
+ getSet(id) {
177
+ var _a;
178
+ return (_a = this.listSets().find((set) => set.id === id)) !== null && _a !== void 0 ? _a : null;
179
+ }
180
+ getArtifacts(id) {
181
+ var _a, _b;
182
+ const baseDir = (_b = (_a = this.context).getVariablesFilePath) === null || _b === void 0 ? void 0 : _b.call(_a);
183
+ if (!baseDir || !this.getSet(id)) {
184
+ return [];
185
+ }
186
+ const transformers = (0, token_transformers_1.resolveTokenTransformers)(this.context);
187
+ const layouts = (0, token_transformers_1.tokenArtifactPathsForSet)(transformers, (0, sets_1.setNameForId)(id), (0, sets_1.isComponentSet)(id));
188
+ const resources = [];
189
+ for (const layout of layouts) {
190
+ const absolutePath = path_1.default.resolve(baseDir, ...layout.path.split('/'));
191
+ if (!fs_extra_1.default.existsSync(absolutePath) || !fs_extra_1.default.statSync(absolutePath).isFile()) {
192
+ continue;
193
+ }
194
+ resources.push({
195
+ path: layout.path,
196
+ format: layout.format,
197
+ content: fs_extra_1.default.readFileSync(absolutePath, 'utf8'),
198
+ contentType: (0, exports.tokenArtifactContentType)(layout.path),
199
+ });
200
+ }
201
+ return resources;
202
+ }
203
+ getArtifact(id, format) {
204
+ var _a;
205
+ return (_a = this.getArtifacts(id).find((artifact) => artifact.format === format)) !== null && _a !== void 0 ? _a : null;
206
+ }
207
+ }
208
+ exports.FilesystemTokenStore = FilesystemTokenStore;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Normalized store abstraction.
3
+ *
4
+ * The workspace (filesystem) store is exported here. The registry (database) store implements the
5
+ * same interface in `./registry`, but is intentionally **not** re-exported from this barrel so the
6
+ * Drizzle/Postgres dependencies it pulls in stay out of the workspace/static path — registry
7
+ * consumers import `@handoff/store/registry` directly (and lazily). Consumers depend only on the
8
+ * interfaces exported here so they remain storage-agnostic.
9
+ */
10
+ export type { AssetContentResource, AssetMetadata, AssetStore, Awaitable, ComponentStore, HandoffStore, PageStore, PatternStore, RegistryTextFileKind, RegistryTextFileResource, SourceReference, TextFileKind, TextFileResource, TokenArtifactResource, TokenSetRecord, TokenStore, } from './types';
11
+ export { FilesystemComponentStore, FilesystemPageStore, FilesystemPatternStore, FilesystemTokenStore, type FilesystemStoreContext, } from './filesystem';
12
+ export { FilesystemAssetStore } from './filesystem-assets';
13
+ export { getRelatedSourceFilesForRecord, isRegistrySourceFile, isWorkspaceOnlyFile, sourceContentTypeForPath } from './source-files';
14
+ import { type FilesystemStoreContext } from './filesystem';
15
+ import type { HandoffStore } from './types';
16
+ /**
17
+ * Build the filesystem-backed store set for a runtime context (a `Handoff` instance satisfies
18
+ * {@link FilesystemStoreContext}).
19
+ */
20
+ export declare const createFilesystemStore: (context: FilesystemStoreContext) => HandoffStore;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Normalized store abstraction.
4
+ *
5
+ * The workspace (filesystem) store is exported here. The registry (database) store implements the
6
+ * same interface in `./registry`, but is intentionally **not** re-exported from this barrel so the
7
+ * Drizzle/Postgres dependencies it pulls in stay out of the workspace/static path — registry
8
+ * consumers import `@handoff/store/registry` directly (and lazily). Consumers depend only on the
9
+ * interfaces exported here so they remain storage-agnostic.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createFilesystemStore = exports.sourceContentTypeForPath = exports.isWorkspaceOnlyFile = exports.isRegistrySourceFile = exports.getRelatedSourceFilesForRecord = exports.FilesystemAssetStore = exports.FilesystemTokenStore = exports.FilesystemPatternStore = exports.FilesystemPageStore = exports.FilesystemComponentStore = void 0;
13
+ var filesystem_1 = require("./filesystem");
14
+ Object.defineProperty(exports, "FilesystemComponentStore", { enumerable: true, get: function () { return filesystem_1.FilesystemComponentStore; } });
15
+ Object.defineProperty(exports, "FilesystemPageStore", { enumerable: true, get: function () { return filesystem_1.FilesystemPageStore; } });
16
+ Object.defineProperty(exports, "FilesystemPatternStore", { enumerable: true, get: function () { return filesystem_1.FilesystemPatternStore; } });
17
+ Object.defineProperty(exports, "FilesystemTokenStore", { enumerable: true, get: function () { return filesystem_1.FilesystemTokenStore; } });
18
+ var filesystem_assets_1 = require("./filesystem-assets");
19
+ Object.defineProperty(exports, "FilesystemAssetStore", { enumerable: true, get: function () { return filesystem_assets_1.FilesystemAssetStore; } });
20
+ var source_files_1 = require("./source-files");
21
+ Object.defineProperty(exports, "getRelatedSourceFilesForRecord", { enumerable: true, get: function () { return source_files_1.getRelatedSourceFilesForRecord; } });
22
+ Object.defineProperty(exports, "isRegistrySourceFile", { enumerable: true, get: function () { return source_files_1.isRegistrySourceFile; } });
23
+ Object.defineProperty(exports, "isWorkspaceOnlyFile", { enumerable: true, get: function () { return source_files_1.isWorkspaceOnlyFile; } });
24
+ Object.defineProperty(exports, "sourceContentTypeForPath", { enumerable: true, get: function () { return source_files_1.sourceContentTypeForPath; } });
25
+ const filesystem_2 = require("./filesystem");
26
+ const filesystem_assets_2 = require("./filesystem-assets");
27
+ /**
28
+ * Build the filesystem-backed store set for a runtime context (a `Handoff` instance satisfies
29
+ * {@link FilesystemStoreContext}).
30
+ */
31
+ const createFilesystemStore = (context) => ({
32
+ components: new filesystem_2.FilesystemComponentStore(context),
33
+ patterns: new filesystem_2.FilesystemPatternStore(context),
34
+ pages: new filesystem_2.FilesystemPageStore(context),
35
+ tokens: new filesystem_2.FilesystemTokenStore(context),
36
+ assets: new filesystem_assets_2.FilesystemAssetStore(context),
37
+ });
38
+ exports.createFilesystemStore = createFilesystemStore;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Database-backed implementation of the normalized store abstraction.
3
+ *
4
+ * Registry mode serves only what was published to it: this store reads normalized component and
5
+ * pattern records — and their checkout/inspection source files — straight from the registry
6
+ * database. It is the registry counterpart to {@link FilesystemComponentStore},
7
+ * so the docs read API and other consumers stay storage-agnostic.
8
+ *
9
+ * Two invariants hold here that the filesystem store does not enforce:
10
+ * - Filesystem workspace declarations are never loaded as registry content; declarations are
11
+ * workspace-only (synthesized on checkout) and the registry text-file tables reject the
12
+ * `declaration` kind at the schema level, so they can never surface through this store.
13
+ * - Reads never materialize source files or run the build pipeline — every record and file is
14
+ * returned exactly as it was published.
15
+ */
16
+ import type { AssetStorage } from '../registry/asset-storage/types';
17
+ import type { RegistryDatabase } from '../registry/db/client';
18
+ import { type AssetStorageProvider } from '../registry/db/schema';
19
+ import type { ComponentListObject, PageListObject, PatternListObject } from '../transformers/preview/types';
20
+ import type { AssetContentResource, AssetMetadata, AssetStore, ComponentStore, HandoffStore, PageStore, PatternStore, SourceReference, TextFileResource, TokenArtifactResource, TokenSetRecord, TokenStore } from './types';
21
+ /** Minimal context needed to back a registry store: a live, typed Drizzle database. */
22
+ export interface RegistryStoreContext {
23
+ db: RegistryDatabase;
24
+ /**
25
+ * Resolve the {@link AssetStorage} adapter for a blob's recorded provider (or `null` for the inline
26
+ * `database` provider). Injected by the app runtime so `src/store` stays free of app-side imports;
27
+ * when omitted, only inline DB-backed asset content is resolvable.
28
+ */
29
+ resolveAssetAdapter?: (provider: AssetStorageProvider) => Promise<AssetStorage | null>;
30
+ }
31
+ export declare class RegistryComponentStore implements ComponentStore {
32
+ private readonly context;
33
+ constructor(context: RegistryStoreContext);
34
+ list(): Promise<ComponentListObject[]>;
35
+ get(id: string): Promise<ComponentListObject | null>;
36
+ /**
37
+ * Registry source files are keyed by `(entity, path)`, not by an absolute filesystem path, so the
38
+ * filesystem-shaped {@link SourceReference} has no resolvable target here. Related files are read
39
+ * through {@link getRelatedSourceFiles}.
40
+ */
41
+ getSource(_ref: SourceReference): Promise<TextFileResource | null>;
42
+ getRelatedSourceFiles(id: string): Promise<TextFileResource[]>;
43
+ }
44
+ export declare class RegistryPatternStore implements PatternStore {
45
+ private readonly context;
46
+ constructor(context: RegistryStoreContext);
47
+ list(): Promise<PatternListObject[]>;
48
+ get(id: string): Promise<PatternListObject | null>;
49
+ getSource(_ref: SourceReference): Promise<TextFileResource | null>;
50
+ getRelatedSourceFiles(id: string): Promise<TextFileResource[]>;
51
+ }
52
+ export declare class RegistryPageStore implements PageStore {
53
+ private readonly context;
54
+ constructor(context: RegistryStoreContext);
55
+ list(): Promise<PageListObject[]>;
56
+ get(id: string): Promise<PageListObject | null>;
57
+ getSource(_ref: SourceReference): Promise<TextFileResource | null>;
58
+ getRelatedSourceFiles(id: string): Promise<TextFileResource[]>;
59
+ }
60
+ export declare class RegistryTokenStore implements TokenStore {
61
+ private readonly context;
62
+ constructor(context: RegistryStoreContext);
63
+ listSets(): Promise<TokenSetRecord[]>;
64
+ getSet(id: string): Promise<TokenSetRecord | null>;
65
+ getArtifacts(id: string): Promise<TokenArtifactResource[]>;
66
+ getArtifact(id: string, format: string): Promise<TokenArtifactResource | null>;
67
+ }
68
+ export declare class RegistryAssetStore implements AssetStore {
69
+ private readonly context;
70
+ constructor(context: RegistryStoreContext);
71
+ listCollections(): Promise<string[]>;
72
+ listAssets(collection: string): Promise<AssetMetadata[]>;
73
+ getAsset(collection: string, assetPath: string): Promise<AssetMetadata | null>;
74
+ getAssetContent(collection: string, assetPath: string): Promise<AssetContentResource | null>;
75
+ }
76
+ /** Build the database-backed store set for a registry database connection. */
77
+ export declare const createRegistryStore: (context: RegistryStoreContext) => HandoffStore;