@cosmicdrift/kumiko-framework 0.388.0 → 0.390.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 (711) hide show
  1. package/AGENTS.md +12 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/golden-path.md +13 -1
  13. package/agents/examples/inbound-mail-triage.md +1 -0
  14. package/agents/examples/lane-routing.md +2 -1
  15. package/agents/examples/legal-pages.md +2 -2
  16. package/agents/examples/lifecycle-hooks.md +55 -2
  17. package/agents/examples/list-table-options.md +466 -0
  18. package/agents/examples/managed-config.md +4 -4
  19. package/agents/examples/managed-pages.md +1 -1
  20. package/agents/examples/pdf-audit-export.md +4 -2
  21. package/agents/examples/relations.md +19 -4
  22. package/agents/examples/search.md +4 -4
  23. package/agents/examples/secrets-demo.md +9 -6
  24. package/agents/examples/state-machine.md +5 -4
  25. package/agents/examples/tenant-isolation.md +73 -1
  26. package/agents/examples/tenant-settings.md +1 -1
  27. package/agents/examples/user-data-rights.md +3 -6
  28. package/agents/examples/workflow-engine.md +53 -47
  29. package/agents/examples.md +5 -4
  30. package/agents/features.md +1 -1
  31. package/agents/widgets.md +1 -0
  32. package/dist/api/api-constants.d.ts +1 -0
  33. package/dist/api/api-constants.js +2 -0
  34. package/dist/api/auth-middleware.js +1 -1
  35. package/dist/api/auth-routes-invite.js +2 -1
  36. package/dist/api/auth-routes-shared.d.ts +2 -0
  37. package/dist/api/auth-routes-shared.js +5 -0
  38. package/dist/api/client-error-route.js +2 -3
  39. package/dist/api/entity-read-access.d.ts +4 -1
  40. package/dist/api/entity-read-access.js +14 -0
  41. package/dist/api/export/export-cells-reference.d.ts +9 -0
  42. package/dist/api/export/export-cells-reference.js +21 -0
  43. package/dist/api/export/export-cells.d.ts +11 -0
  44. package/dist/api/export/export-cells.js +136 -0
  45. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  46. package/dist/api/export/export-ciphertext-guard.js +27 -0
  47. package/dist/api/export/export-columns.d.ts +31 -0
  48. package/dist/api/export/export-columns.js +85 -0
  49. package/dist/api/export/export-errors.d.ts +4 -0
  50. package/dist/api/export/export-errors.js +14 -0
  51. package/dist/api/export/export-route.d.ts +4 -0
  52. package/dist/api/export/export-route.js +75 -0
  53. package/dist/api/export/export-rows.d.ts +13 -0
  54. package/dist/api/export/export-rows.js +62 -0
  55. package/dist/api/export/export-screen.d.ts +13 -0
  56. package/dist/api/export/export-screen.js +47 -0
  57. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  58. package/dist/api/export/export-xlsx-writer.js +21 -0
  59. package/dist/api/extra-route.d.ts +7 -1
  60. package/dist/api/index.d.ts +23 -27
  61. package/dist/api/index.js +13 -15
  62. package/dist/api/jwt.js +1 -1
  63. package/dist/api/observability-middleware.d.ts +1 -1
  64. package/dist/api/observability-middleware.js +2 -1
  65. package/dist/api/pii-leak-guard.d.ts +3 -0
  66. package/dist/api/pii-leak-guard.js +3 -2
  67. package/dist/api/request-context-internals.d.ts +31 -0
  68. package/dist/api/request-context-internals.js +11 -0
  69. package/dist/api/request-context-scopes.d.ts +14 -0
  70. package/dist/api/request-context-scopes.js +69 -0
  71. package/dist/api/request-context.d.ts +1 -40
  72. package/dist/api/request-context.js +22 -51
  73. package/dist/api/request-id-middleware.d.ts +1 -1
  74. package/dist/api/route-registrars.d.ts +2 -1
  75. package/dist/api/route-registrars.js +1 -1
  76. package/dist/api/routes.d.ts +16 -0
  77. package/dist/api/routes.js +9 -5
  78. package/dist/api/server-boot-checks.d.ts +1 -1
  79. package/dist/api/server-boot-checks.js +2 -2
  80. package/dist/api/server-event-dispatcher.d.ts +6 -1
  81. package/dist/api/server-event-dispatcher.js +3 -4
  82. package/dist/api/server-extra-routes.d.ts +1 -1
  83. package/dist/api/server-extra-routes.js +5 -1
  84. package/dist/api/server-middleware.js +3 -1
  85. package/dist/api/server-routes.d.ts +3 -2
  86. package/dist/api/server-routes.js +8 -2
  87. package/dist/api/server-wiring.js +8 -4
  88. package/dist/api/server.d.ts +2 -1
  89. package/dist/api/sse-route.d.ts +3 -1
  90. package/dist/api/sse-route.js +11 -1
  91. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  92. package/dist/api/tenant-scoped-secrets.js +13 -0
  93. package/dist/api/websocket-route.d.ts +1 -1
  94. package/dist/auth/index.d.ts +0 -1
  95. package/dist/auth/roles.d.ts +0 -5
  96. package/dist/compliance/duration-spec.d.ts +0 -1
  97. package/dist/compliance/duration-spec.js +0 -5
  98. package/dist/compliance/index.d.ts +4 -4
  99. package/dist/compliance/index.js +2 -2
  100. package/dist/compliance/profiles.d.ts +0 -15
  101. package/dist/compliance/profiles.js +0 -23
  102. package/dist/config/index.d.ts +11 -9
  103. package/dist/config/index.js +13 -1
  104. package/dist/config/internals.d.ts +9 -0
  105. package/dist/config/internals.js +1 -0
  106. package/dist/consumer-cli-internals.d.ts +4 -0
  107. package/dist/consumer-cli-internals.js +1 -0
  108. package/dist/consumer-cli.d.ts +1 -4
  109. package/dist/consumer-cli.js +5 -1
  110. package/dist/crypto/event-pii.js +1 -1
  111. package/dist/crypto/index.d.ts +8 -9
  112. package/dist/crypto/index.js +7 -8
  113. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  114. package/dist/crypto/pg-kms-adapter.js +17 -18
  115. package/dist/db/aggregate-sql.d.ts +2 -0
  116. package/dist/db/aggregate-sql.js +10 -0
  117. package/dist/db/apply-entity-event.d.ts +1 -1
  118. package/dist/db/apply-entity-event.js +15 -47
  119. package/dist/db/blind-index-cleanup.js +91 -77
  120. package/dist/db/closed-connection.js +12 -19
  121. package/dist/db/collect-table-metas.js +1 -1
  122. package/dist/db/compound-types.d.ts +1 -1
  123. package/dist/db/compound-types.js +0 -7
  124. package/dist/db/config-seed.d.ts +2 -1
  125. package/dist/db/config-seed.js +6 -1
  126. package/dist/db/connection.d.ts +7 -6
  127. package/dist/db/connection.js +43 -24
  128. package/dist/db/cross-tenant-reads.d.ts +1 -1
  129. package/dist/db/cross-tenant-reads.js +1 -1
  130. package/dist/db/dialect.d.ts +0 -5
  131. package/dist/db/dialect.js +0 -3
  132. package/dist/db/driver-row-coercion.js +4 -4
  133. package/dist/db/driver-value-preparation.js +6 -4
  134. package/dist/db/eagerload.d.ts +2 -1
  135. package/dist/db/entity-field-encryption.d.ts +1 -1
  136. package/dist/db/entity-table-meta.d.ts +1 -1
  137. package/dist/db/event-store-executor-context.d.ts +3 -1
  138. package/dist/db/event-store-executor-context.js +4 -3
  139. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  140. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  141. package/dist/db/event-store-executor-read-aggregate.js +36 -5
  142. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  143. package/dist/db/event-store-executor-read-filter.js +6 -3
  144. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  145. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  146. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  147. package/dist/db/event-store-executor-read.js +2 -2
  148. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  149. package/dist/db/event-store-executor-write-atomic.js +42 -0
  150. package/dist/db/event-store-executor-write-steps.d.ts +3 -5
  151. package/dist/db/event-store-executor-write-steps.js +0 -5
  152. package/dist/db/event-store-executor-write.js +22 -19
  153. package/dist/db/event-store-executor.d.ts +1 -1
  154. package/dist/db/event-store-executor.js +2 -1
  155. package/dist/db/executor-managed-tables.d.ts +7 -1
  156. package/dist/db/executor-managed-tables.js +12 -3
  157. package/dist/db/index.d.ts +29 -28
  158. package/dist/db/index.js +22 -20
  159. package/dist/db/known-table-names.d.ts +6 -0
  160. package/dist/db/known-table-names.js +21 -0
  161. package/dist/db/list-aggregate-labels.d.ts +1 -1
  162. package/dist/db/located-timestamp.d.ts +1 -1
  163. package/dist/db/located-timestamp.js +0 -5
  164. package/dist/db/migrate-generator.d.ts +17 -1
  165. package/dist/db/migrate-generator.js +50 -20
  166. package/dist/db/migrate-primary-key.d.ts +12 -0
  167. package/dist/db/migrate-primary-key.js +45 -0
  168. package/dist/db/migrate-rls-diff.d.ts +20 -0
  169. package/dist/db/migrate-rls-diff.js +61 -0
  170. package/dist/db/migrate-runner.js +7 -3
  171. package/dist/db/money.d.ts +1 -1
  172. package/dist/db/money.js +1 -1
  173. package/dist/db/parent-ref-clause.d.ts +2 -1
  174. package/dist/db/pg-error.d.ts +2 -0
  175. package/dist/db/pg-error.js +37 -21
  176. package/dist/db/queries/backfill-pii.js +3 -6
  177. package/dist/db/queries/database-now.js +2 -1
  178. package/dist/db/queries/ddl.d.ts +3 -0
  179. package/dist/db/queries/ddl.js +34 -1
  180. package/dist/db/queries/event-store.js +4 -2
  181. package/dist/db/queries/event-tenants.d.ts +2 -0
  182. package/dist/db/queries/event-tenants.js +17 -0
  183. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  184. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  185. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  186. package/dist/db/queries/rls-boot-catalog.js +39 -0
  187. package/dist/db/queries/rls-catalog.d.ts +6 -0
  188. package/dist/db/queries/rls-catalog.js +82 -0
  189. package/dist/db/queries/rls-scope.d.ts +3 -0
  190. package/dist/db/queries/rls-scope.js +17 -0
  191. package/dist/db/queries/rls-shape.d.ts +10 -0
  192. package/dist/db/queries/rls-shape.js +42 -0
  193. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  194. package/dist/db/queries/session-advisory-lock.js +23 -0
  195. package/dist/db/queries/shadow-swap.d.ts +1 -2
  196. package/dist/db/queries/shadow-swap.js +11 -28
  197. package/dist/db/queries/test-stack.d.ts +4 -1
  198. package/dist/db/queries/test-stack.js +83 -2
  199. package/dist/db/query.d.ts +14 -0
  200. package/dist/db/query.js +77 -48
  201. package/dist/db/reference-data.d.ts +1 -1
  202. package/dist/db/reference-data.js +20 -3
  203. package/dist/db/render-ddl.d.ts +6 -2
  204. package/dist/db/render-ddl.js +7 -7
  205. package/dist/db/render-rls-ddl.d.ts +35 -0
  206. package/dist/db/render-rls-ddl.js +127 -0
  207. package/dist/db/replay-migration-sql.d.ts +3 -1
  208. package/dist/db/replay-migration-sql.js +22 -5
  209. package/dist/db/replay-rls.d.ts +25 -0
  210. package/dist/db/replay-rls.js +156 -0
  211. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  212. package/dist/db/row-level-security-boot-check.js +85 -0
  213. package/dist/db/row-level-security-connection.d.ts +3 -0
  214. package/dist/db/row-level-security-connection.js +213 -0
  215. package/dist/db/row-level-security-scope.d.ts +33 -0
  216. package/dist/db/row-level-security-scope.js +127 -0
  217. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  218. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  219. package/dist/db/sql-identifier.d.ts +1 -0
  220. package/dist/db/sql-identifier.js +3 -0
  221. package/dist/db/statement-timeout.js +2 -1
  222. package/dist/db/table-builder.d.ts +2 -1
  223. package/dist/db/table-builder.js +1 -1
  224. package/dist/db/table-info.js +1 -1
  225. package/dist/db/table-push.d.ts +11 -2
  226. package/dist/db/table-push.js +15 -2
  227. package/dist/db/tenant-db-runner.d.ts +3 -1
  228. package/dist/db/tenant-db-runner.js +4 -3
  229. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  230. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  231. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  232. package/dist/db/tenant-db-statement-runner.js +48 -0
  233. package/dist/db/tenant-db-upsert.d.ts +5 -0
  234. package/dist/db/tenant-db-upsert.js +91 -0
  235. package/dist/db/tenant-db.d.ts +17 -12
  236. package/dist/db/tenant-db.js +60 -121
  237. package/dist/db/tenant-id-filter.d.ts +3 -0
  238. package/dist/db/tenant-id-filter.js +30 -0
  239. package/dist/db/transaction-serialization.d.ts +6 -0
  240. package/dist/db/transaction-serialization.js +60 -0
  241. package/dist/derivatives/delete-stored-file.js +1 -1
  242. package/dist/derivatives/index.d.ts +2 -5
  243. package/dist/derivatives/index.js +2 -3
  244. package/dist/engine/access.d.ts +2 -1
  245. package/dist/engine/access.js +1 -1
  246. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  247. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  248. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  249. package/dist/engine/boot-validator/entity-handler.js +1 -1
  250. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  251. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  252. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  253. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  254. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  255. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  256. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  257. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  258. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
  259. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  260. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  261. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  262. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  263. package/dist/engine/boot-validator/list-table-options.js +77 -0
  264. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  265. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  266. package/dist/engine/boot-validator/nav.d.ts +3 -1
  267. package/dist/engine/boot-validator/nav.js +1 -1
  268. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  269. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  270. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  271. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  272. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  273. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  274. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  275. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  276. package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
  277. package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
  278. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  279. package/dist/engine/boot-validator/screens-lists.js +12 -2
  280. package/dist/engine/boot-validator/screens.d.ts +2 -1
  281. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  282. package/dist/engine/bridge-stub.d.ts +5 -2
  283. package/dist/engine/bridge-stub.js +39 -24
  284. package/dist/engine/build-app-schema.d.ts +2 -1
  285. package/dist/engine/build-app-schema.js +9 -1
  286. package/dist/engine/build-config-feature-schema.js +6 -1
  287. package/dist/engine/config-helpers.d.ts +2 -2
  288. package/dist/engine/config-helpers.js +0 -9
  289. package/dist/engine/constants.d.ts +0 -10
  290. package/dist/engine/constants.js +0 -8
  291. package/dist/engine/create-app.js +1 -1
  292. package/dist/engine/define-feature.d.ts +2 -1
  293. package/dist/engine/define-feature.js +5 -2
  294. package/dist/engine/define-handler.d.ts +1 -1
  295. package/dist/engine/define-step.d.ts +0 -1
  296. package/dist/engine/define-step.js +0 -3
  297. package/dist/engine/embedded-derived.d.ts +1 -1
  298. package/dist/engine/entity-handlers.d.ts +2 -1
  299. package/dist/engine/entity-handlers.js +7 -7
  300. package/dist/engine/entity-list-runtime-options.js +3 -1
  301. package/dist/engine/entity-list-searchability.d.ts +2 -1
  302. package/dist/engine/event-def.d.ts +2 -1
  303. package/dist/engine/event-helpers.d.ts +3 -1
  304. package/dist/engine/event-helpers.js +3 -3
  305. package/dist/engine/extension-names.d.ts +2 -8
  306. package/dist/engine/extension-names.js +2 -2
  307. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  308. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  309. package/dist/engine/extensions/user-data.d.ts +0 -8
  310. package/dist/engine/factories.d.ts +2 -1
  311. package/dist/engine/feature-builder-state.d.ts +9 -1
  312. package/dist/engine/feature-builder-state.js +1 -0
  313. package/dist/engine/feature-changelog.d.ts +1 -1
  314. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  315. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  316. package/dist/engine/feature-manifest.d.ts +1 -0
  317. package/dist/engine/feature-manifest.js +2 -1
  318. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  319. package/dist/engine/feature-ui-extensions.js +6 -4
  320. package/dist/engine/field-access.d.ts +3 -1
  321. package/dist/engine/field-access.js +12 -0
  322. package/dist/engine/handler-field-references.d.ts +0 -4
  323. package/dist/engine/index.d.ts +58 -55
  324. package/dist/engine/index.js +23 -28
  325. package/dist/engine/instruction-fields.d.ts +1 -1
  326. package/dist/engine/personal-data-fields.d.ts +1 -1
  327. package/dist/engine/qualified-name.d.ts +0 -1
  328. package/dist/engine/read-claim.d.ts +2 -1
  329. package/dist/engine/registry-facade.js +0 -3
  330. package/dist/engine/registry-ingest.d.ts +2 -1
  331. package/dist/engine/registry-ingest.js +1 -2
  332. package/dist/engine/registry-state.d.ts +12 -2
  333. package/dist/engine/registry-state.js +2 -3
  334. package/dist/engine/registry-validate.d.ts +3 -1
  335. package/dist/engine/registry-validate.js +7 -7
  336. package/dist/engine/run-in.d.ts +1 -1
  337. package/dist/engine/run-in.js +0 -1
  338. package/dist/engine/schema-builder.d.ts +1 -1
  339. package/dist/engine/schema-builder.js +1 -1
  340. package/dist/engine/screen-filter-ops.d.ts +2 -1
  341. package/dist/engine/screen-filter-ops.js +2 -5
  342. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  343. package/dist/engine/soft-delete-cleanup.js +4 -4
  344. package/dist/engine/state-machine.js +2 -1
  345. package/dist/engine/steps/_read-source.js +1 -1
  346. package/dist/engine/steps/aggregate-append-event.js +2 -2
  347. package/dist/engine/steps/call-feature.js +2 -2
  348. package/dist/engine/steps/mail-send.js +1 -1
  349. package/dist/engine/steps/retry.js +1 -1
  350. package/dist/engine/steps/wait-for-event.js +1 -1
  351. package/dist/engine/steps/wait.js +1 -1
  352. package/dist/engine/steps/webhook-send.js +1 -1
  353. package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
  354. package/dist/engine/template-variables.d.ts +2 -1
  355. package/dist/engine/transfer-adjacency.d.ts +1 -1
  356. package/dist/engine/types/feature.d.ts +1 -0
  357. package/dist/engine/types/index.d.ts +8 -30
  358. package/dist/engine/types/index.js +2 -10
  359. package/dist/engine/types/screen.d.ts +1 -1
  360. package/dist/engine/types/screen.js +1 -1
  361. package/dist/engine/validation.d.ts +2 -1
  362. package/dist/entrypoint/index.d.ts +9 -35
  363. package/dist/entrypoint/index.js +10 -1
  364. package/dist/entrypoint/internals.d.ts +40 -0
  365. package/dist/entrypoint/internals.js +1 -0
  366. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  367. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  368. package/dist/env/dry-run-internals.d.ts +10 -0
  369. package/dist/env/dry-run-internals.js +1 -0
  370. package/dist/env/dry-run.d.ts +1 -10
  371. package/dist/env/dry-run.js +2 -1
  372. package/dist/env/index.d.ts +1 -85
  373. package/dist/env/index.js +6 -50
  374. package/dist/env/internals.d.ts +87 -0
  375. package/dist/env/internals.js +53 -0
  376. package/dist/errors/classes.js +2 -2
  377. package/dist/errors/index.d.ts +5 -14
  378. package/dist/errors/index.js +4 -9
  379. package/dist/errors/member-resolution.js +1 -1
  380. package/dist/errors/reasons.d.ts +0 -1
  381. package/dist/errors/reasons.js +7 -7
  382. package/dist/errors/serialize.d.ts +0 -18
  383. package/dist/errors/serialize.js +0 -27
  384. package/dist/es-ops/index.d.ts +4 -4
  385. package/dist/es-ops/index.js +2 -2
  386. package/dist/es-ops/operations-schema.d.ts +1 -1
  387. package/dist/es-ops/types.d.ts +4 -5
  388. package/dist/event-store/admin-api-internals.d.ts +14 -0
  389. package/dist/event-store/admin-api-internals.js +1 -0
  390. package/dist/event-store/admin-api.d.ts +1 -14
  391. package/dist/event-store/admin-api.js +11 -6
  392. package/dist/event-store/archive.js +4 -2
  393. package/dist/event-store/errors.js +2 -2
  394. package/dist/event-store/event-store.d.ts +1 -0
  395. package/dist/event-store/event-store.js +42 -32
  396. package/dist/event-store/events-schema.js +4 -1
  397. package/dist/event-store/index.d.ts +11 -13
  398. package/dist/event-store/index.js +7 -9
  399. package/dist/event-store/provenance-append.js +1 -1
  400. package/dist/event-store/rebuild-dead-letter.js +4 -2
  401. package/dist/event-store/snapshot.js +4 -3
  402. package/dist/event-store/stream-scope.d.ts +2 -0
  403. package/dist/event-store/stream-scope.js +6 -0
  404. package/dist/event-store/upcaster-dead-letter.js +4 -2
  405. package/dist/event-store/upcaster.d.ts +2 -1
  406. package/dist/files/action-form-upload.d.ts +2 -1
  407. package/dist/files/action-form-upload.js +1 -1
  408. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  409. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  410. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  411. package/dist/files/bind-pending-file-refs.js +2 -1
  412. package/dist/files/bind-referenced-files.write.js +1 -1
  413. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  414. package/dist/files/create-file-ref-from-bytes.js +6 -3
  415. package/dist/files/create-file-ref.d.ts +6 -2
  416. package/dist/files/create-file-ref.js +13 -4
  417. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  418. package/dist/files/dispose-removed-file-refs.js +1 -1
  419. package/dist/files/feature.js +2 -2
  420. package/dist/files/file-handle.js +1 -1
  421. package/dist/files/file-routes.d.ts +3 -1
  422. package/dist/files/file-routes.js +41 -4
  423. package/dist/files/index.d.ts +11 -13
  424. package/dist/files/index.js +5 -7
  425. package/dist/files/load-save-file-refs.d.ts +2 -1
  426. package/dist/files/load-save-file-refs.js +1 -1
  427. package/dist/files/provider-resolver.d.ts +6 -4
  428. package/dist/files/provider-resolver.js +5 -5
  429. package/dist/files/record-write-check.d.ts +6 -0
  430. package/dist/files/record-write-check.js +13 -0
  431. package/dist/files/storage-tracking.js +4 -2
  432. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  433. package/dist/files/sweep-orphaned-uploads.js +1 -1
  434. package/dist/files/upload-ledger.d.ts +2 -2
  435. package/dist/files/upload-ledger.js +4 -4
  436. package/dist/i18n/index.d.ts +2 -8
  437. package/dist/i18n/index.js +1 -1
  438. package/dist/i18n/internals.d.ts +7 -0
  439. package/dist/i18n/internals.js +1 -0
  440. package/dist/i18n/required-surface-keys.d.ts +4 -1
  441. package/dist/i18n/required-surface-keys.js +7 -2
  442. package/dist/internal/row-level-security.d.ts +3 -0
  443. package/dist/internal/row-level-security.js +3 -0
  444. package/dist/internal/stack-support.d.ts +1 -1
  445. package/dist/internal/stack-support.js +1 -1
  446. package/dist/internal/testing.d.ts +1 -0
  447. package/dist/internal/testing.js +10 -6
  448. package/dist/jobs/index.d.ts +1 -1
  449. package/dist/jobs/job-append-event.d.ts +12 -0
  450. package/dist/jobs/job-append-event.js +30 -0
  451. package/dist/jobs/job-runner-context.d.ts +2 -2
  452. package/dist/jobs/job-runner-context.js +46 -16
  453. package/dist/jobs/job-runner-execution.d.ts +1 -1
  454. package/dist/jobs/job-runner-execution.js +6 -4
  455. package/dist/jobs/job-runner-gates.d.ts +1 -1
  456. package/dist/jobs/job-runner-gates.js +0 -1
  457. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  458. package/dist/jobs/job-runner-helpers.js +10 -1
  459. package/dist/jobs/job-runner-scope.d.ts +5 -2
  460. package/dist/jobs/job-runner-scope.js +6 -6
  461. package/dist/jobs/job-runner-types.d.ts +2 -1
  462. package/dist/jobs/job-runner.js +22 -6
  463. package/dist/jobs/max-per-tenant.d.ts +1 -1
  464. package/dist/logging/index.d.ts +1 -2
  465. package/dist/logging/index.js +1 -1
  466. package/dist/logging/pino-logger.js +1 -1
  467. package/dist/logging/utils.d.ts +1 -0
  468. package/dist/logging/utils.js +6 -0
  469. package/dist/migrations/index.d.ts +3 -3
  470. package/dist/migrations/index.js +3 -3
  471. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  472. package/dist/migrations/pending-rebuilds.js +1 -1
  473. package/dist/migrations/pii-event-backfill.js +4 -1
  474. package/dist/observability/escape-hatch-report.d.ts +2 -1
  475. package/dist/observability/escape-hatch-report.js +9 -2
  476. package/dist/observability/index.d.ts +7 -15
  477. package/dist/observability/index.js +4 -12
  478. package/dist/observability/metric-validator.js +1 -1
  479. package/dist/observability/metrics-handle.d.ts +0 -1
  480. package/dist/observability/metrics-handle.js +2 -15
  481. package/dist/observability/recording-tracer.d.ts +1 -2
  482. package/dist/observability/recording-tracer.js +0 -6
  483. package/dist/observability/sensitive-filter.d.ts +0 -2
  484. package/dist/observability/sensitive-filter.js +0 -29
  485. package/dist/pipeline/active-membership.d.ts +2 -1
  486. package/dist/pipeline/active-membership.js +6 -2
  487. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  488. package/dist/pipeline/after-rollback-sink.js +32 -0
  489. package/dist/pipeline/append-event-core.d.ts +2 -1
  490. package/dist/pipeline/append-event-core.js +2 -2
  491. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  492. package/dist/pipeline/attach-outside-transaction.js +13 -0
  493. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  494. package/dist/pipeline/cascade-handler.d.ts +2 -1
  495. package/dist/pipeline/cascade-handler.js +3 -2
  496. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  497. package/dist/pipeline/config-accessor-factory.js +1 -1
  498. package/dist/pipeline/context-services.d.ts +56 -0
  499. package/dist/pipeline/context-services.js +73 -0
  500. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  501. package/dist/pipeline/dispatch-batch.js +39 -19
  502. package/dist/pipeline/dispatch-query.js +5 -4
  503. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  504. package/dist/pipeline/dispatch-scope.js +27 -0
  505. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  506. package/dist/pipeline/dispatch-shared.js +75 -194
  507. package/dist/pipeline/dispatch-stream.js +8 -4
  508. package/dist/pipeline/dispatch-write.d.ts +2 -1
  509. package/dist/pipeline/dispatch-write.js +10 -8
  510. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  511. package/dist/pipeline/dispatcher-utils.js +8 -2
  512. package/dist/pipeline/dispatcher.d.ts +3 -2
  513. package/dist/pipeline/dispatcher.js +4 -3
  514. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  515. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  516. package/dist/pipeline/event-dispatcher-delivery.js +7 -3
  517. package/dist/pipeline/event-dispatcher.d.ts +3 -2
  518. package/dist/pipeline/event-dispatcher.js +13 -12
  519. package/dist/pipeline/event-retention.js +59 -56
  520. package/dist/pipeline/handler-access-error.js +2 -1
  521. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  522. package/dist/pipeline/handler-context-auth.js +7 -4
  523. package/dist/pipeline/handler-context-config.d.ts +2 -5
  524. package/dist/pipeline/handler-context-config.js +2 -2
  525. package/dist/pipeline/handler-context-db.d.ts +32 -7
  526. package/dist/pipeline/handler-context-db.js +26 -17
  527. package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
  528. package/dist/pipeline/handler-context-dispatch.js +18 -5
  529. package/dist/pipeline/handler-context-events.d.ts +22 -38
  530. package/dist/pipeline/handler-context-events.js +42 -35
  531. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  532. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  533. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  534. package/dist/pipeline/handler-context-notify.js +1 -1
  535. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  536. package/dist/pipeline/handler-context-observability.js +7 -5
  537. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  538. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  539. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  540. package/dist/pipeline/handler-context-scope.js +18 -20
  541. package/dist/pipeline/index.d.ts +9 -21
  542. package/dist/pipeline/index.js +5 -7
  543. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  544. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  545. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  546. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  547. package/dist/pipeline/member-read-only-transaction.js +11 -3
  548. package/dist/pipeline/member-reader.d.ts +1 -1
  549. package/dist/pipeline/member-reader.js +2 -2
  550. package/dist/pipeline/msp-rebuild.js +5 -3
  551. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  552. package/dist/pipeline/notify-scope.d.ts +2 -1
  553. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  554. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  555. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  556. package/dist/pipeline/projection-rebuild.js +12 -5
  557. package/dist/pipeline/projection-state.d.ts +0 -6
  558. package/dist/pipeline/projection-state.js +0 -5
  559. package/dist/pipeline/projections-runner.d.ts +2 -1
  560. package/dist/pipeline/projections-runner.js +10 -6
  561. package/dist/pipeline/system-hooks.d.ts +6 -2
  562. package/dist/pipeline/system-hooks.js +61 -10
  563. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  564. package/dist/pipeline/system-identity-switch.js +51 -36
  565. package/dist/pipeline/typed-append-event.d.ts +2 -0
  566. package/dist/pipeline/typed-append-event.js +4 -0
  567. package/dist/pipeline/write-origin.js +2 -2
  568. package/dist/pipeline/write-result-masking.d.ts +1 -1
  569. package/dist/pipeline/write-result-masking.js +13 -10
  570. package/dist/random/index.d.ts +1 -2
  571. package/dist/random/index.js +1 -2
  572. package/dist/rate-limit/bucket.d.ts +2 -1
  573. package/dist/rate-limit/middleware.js +2 -1
  574. package/dist/redis/index.d.ts +3 -4
  575. package/dist/redis/index.js +2 -2
  576. package/dist/schema-cli/apply-command.js +5 -2
  577. package/dist/schema-cli/baseline-command.js +7 -2
  578. package/dist/schema-cli/generate-command.js +7 -9
  579. package/dist/schema-cli/shared.d.ts +4 -0
  580. package/dist/schema-cli/shared.js +21 -2
  581. package/dist/schema-cli/status-command.js +8 -2
  582. package/dist/schema-cli/validate-command.js +52 -4
  583. package/dist/schema-cli.d.ts +0 -1
  584. package/dist/search/configure-tenant-index.d.ts +1 -3
  585. package/dist/search/configure-tenant-index.js +0 -4
  586. package/dist/search/index.d.ts +1 -4
  587. package/dist/search/index.js +0 -2
  588. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  589. package/dist/search/meilisearch-adapter-internals.js +9 -0
  590. package/dist/search/meilisearch-adapter.d.ts +1 -8
  591. package/dist/search/meilisearch-adapter.js +6 -7
  592. package/dist/search/meilisearch-peer.d.ts +2 -0
  593. package/dist/search/meilisearch-peer.js +5 -0
  594. package/dist/search/reindex-entity.js +107 -91
  595. package/dist/secrets/index.d.ts +3 -4
  596. package/dist/secrets/index.js +2 -3
  597. package/dist/seeding/index.d.ts +2 -2
  598. package/dist/seeding/index.js +1 -2
  599. package/dist/time/index.d.ts +2 -2
  600. package/dist/time/index.js +1 -1
  601. package/dist/time/tz-context.d.ts +0 -5
  602. package/dist/time/tz-context.js +0 -9
  603. package/dist/ui-types/index.d.ts +8 -11
  604. package/dist/ui-types/index.js +3 -3
  605. package/dist/upgrade-changelog.d.ts +3 -0
  606. package/dist/upgrade-changelog.js +18 -0
  607. package/dist/upgrade-cli-internals.d.ts +8 -0
  608. package/dist/upgrade-cli-internals.js +63 -0
  609. package/dist/upgrade-cli.d.ts +1 -18
  610. package/dist/upgrade-cli.js +29 -137
  611. package/dist/upgrade-marker-parse.d.ts +32 -0
  612. package/dist/upgrade-marker-parse.js +73 -0
  613. package/dist/utils/import-optional-peer.d.ts +6 -0
  614. package/dist/utils/import-optional-peer.js +19 -0
  615. package/dist/utils/index.d.ts +1 -4
  616. package/dist/utils/index.js +1 -4
  617. package/package.json +27 -20
  618. package/src/changes.json +451 -0
  619. package/dist/crypto/request-kms-cache.d.ts +0 -8
  620. package/dist/crypto/request-kms-cache.js +0 -21
  621. package/dist/engine/codemod/index.d.ts +0 -2
  622. package/dist/engine/codemod/index.js +0 -1
  623. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  624. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  625. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  626. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  627. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  628. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  629. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  630. package/dist/engine/feature-ast/extractors/events.js +0 -275
  631. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  632. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  633. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  634. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  635. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  636. package/dist/engine/feature-ast/extractors/index.js +0 -13
  637. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  638. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  639. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  640. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  641. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  642. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  643. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
  644. package/dist/engine/feature-ast/extractors/round1.js +0 -81
  645. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  646. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  647. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  648. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  649. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  650. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  651. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  652. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  653. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  654. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  655. package/dist/engine/feature-ast/index.d.ts +0 -16
  656. package/dist/engine/feature-ast/index.js +0 -10
  657. package/dist/engine/feature-ast/parse.d.ts +0 -31
  658. package/dist/engine/feature-ast/parse.js +0 -483
  659. package/dist/engine/feature-ast/patch.d.ts +0 -210
  660. package/dist/engine/feature-ast/patch.js +0 -610
  661. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  662. package/dist/engine/feature-ast/patcher.js +0 -281
  663. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
  664. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
  665. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  666. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
  667. package/dist/engine/feature-ast/patterns.d.ts +0 -318
  668. package/dist/engine/feature-ast/patterns.js +0 -106
  669. package/dist/engine/feature-ast/render.d.ts +0 -47
  670. package/dist/engine/feature-ast/render.js +0 -662
  671. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  672. package/dist/engine/feature-ast/source-location.js +0 -27
  673. package/dist/engine/pattern-library/index.d.ts +0 -2
  674. package/dist/engine/pattern-library/index.js +0 -3
  675. package/dist/engine/pattern-library/library.d.ts +0 -14
  676. package/dist/engine/pattern-library/library.js +0 -93
  677. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  678. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  679. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  680. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  681. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  682. package/dist/engine/pattern-library/shared-fields.js +0 -88
  683. package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
  684. package/dist/engine/pattern-library/static-schemas.js +0 -478
  685. package/dist/engine/pattern-library/types.d.ts +0 -158
  686. package/dist/engine/pattern-library/types.js +0 -36
  687. package/dist/engine/provider-plugin-context.d.ts +0 -3
  688. package/dist/engine/provider-plugin-context.js +0 -28
  689. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  690. package/dist/engine/resolve-config-or-param.js +0 -76
  691. package/src/scripts/codemod/README.md +0 -187
  692. package/src/scripts/codemod/codemod-support.ts +0 -334
  693. package/src/scripts/codemod/collect-source-files.ts +0 -48
  694. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  695. package/src/scripts/codemod/db-factory.ts +0 -810
  696. package/src/scripts/codemod/feature-factory.ts +0 -429
  697. package/src/scripts/codemod/feature-layout.ts +0 -424
  698. package/src/scripts/codemod/import-extensions.ts +0 -118
  699. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  700. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  701. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  702. package/src/scripts/codemod/object-form.ts +0 -746
  703. package/src/scripts/codemod/package-merge.ts +0 -299
  704. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  705. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  706. package/src/scripts/codemod/s3-imports.ts +0 -236
  707. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  708. package/src/scripts/codemod/testing-injection.ts +0 -215
  709. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  710. package/src/scripts/codemod/testing-move.ts +0 -542
  711. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -1,662 +0,0 @@
1
- // Pattern → TS-Source renderer. Produces canonical Object-Form for every
2
- // FeaturePattern kind: a single object-literal argument per r.* call.
3
- // Output is biome-format-stable so consumers can write the file directly
4
- // without an extra format pass.
5
- //
6
- // **Source-of-Truth Contract:**
7
- // - Static patterns (entity, nav, config, etc.) round-trip cleanly:
8
- // parse → render → parse yields the same patterns.
9
- // - Mixed patterns (writeHandler, hook, screen) embed the original
10
- // source-text of opaque bodies (handler/fn/closure) verbatim via
11
- // SourceLocation.raw — the renderer doesn't re-print closure code.
12
- // - Patterns carrying a RawRefSentinel value (e.g. entity/metric/secret
13
- // `definition`/`options`) or a `*NameRaw` identifier reference
14
- // (useExtension/defineEvent/extendsRegistrar) fall back to positional-arg
15
- // form instead of Object-Form, since the raw source text can't be spread
16
- // into a merged object literal without losing its verbatim-ness.
17
- // - Comments inside an existing pattern are NOT preserved (Designer
18
- // edits via forms; for AI generation the output is fresh anyway).
19
- //
20
- // **Schema-Version-Header:** every renderFeatureFile output starts with
21
- // `// kumiko-feature-version: 1`. Future format bumps run a dedicated
22
- // migrator over the version comment.
23
- import { isRawRefSentinel } from "./extractors/shared.js";
24
- import { SCREEN_OPAQUE_MARKER } from "./patterns.js";
25
- export const FEATURE_FILE_VERSION = 1;
26
- export const VERSION_HEADER = `// kumiko-feature-version: ${FEATURE_FILE_VERSION}`;
27
- /**
28
- * Render a single FeaturePattern back to TypeScript source — a `r.<kind>(...)`
29
- * call in canonical Object-Form. The result is a single statement WITHOUT a
30
- * trailing newline; callers compose statements with their own joiner.
31
- */
32
- export function renderPattern(pattern) {
33
- return renderPatternOfKind(pattern.kind, pattern);
34
- }
35
- const PATTERN_RENDERERS = {
36
- requires: renderRequires,
37
- optionalRequires: renderOptionalRequires,
38
- readsConfig: renderReadsConfig,
39
- systemScope: renderSystemScope,
40
- toggleable: renderToggleable,
41
- describe: renderDescribe,
42
- uiHints: renderUiHints,
43
- entity: renderEntity,
44
- relation: renderRelation,
45
- nav: renderNav,
46
- workspace: renderWorkspace,
47
- config: renderConfig,
48
- translations: renderTranslations,
49
- metric: renderMetric,
50
- secret: renderSecret,
51
- secretNamespace: renderSecretNamespace,
52
- claimKey: renderClaimKey,
53
- referenceData: renderReferenceData,
54
- useExtension: renderUseExtension,
55
- screen: renderScreen,
56
- writeHandler: renderWriteHandler,
57
- queryHandler: renderQueryHandler,
58
- streamHandler: renderStreamHandler,
59
- hook: renderHook,
60
- job: renderJob,
61
- notification: renderNotification,
62
- authClaims: renderAuthClaims,
63
- httpRoute: renderHttpRoute,
64
- projection: renderProjection,
65
- multiStreamProjection: renderMultiStreamProjection,
66
- defineEvent: renderDefineEvent,
67
- extendsRegistrar: renderExtendsRegistrar,
68
- usesApi: renderUsesApi,
69
- exposesApi: renderExposesApi,
70
- treeActions: renderTreeActions,
71
- envSchema: renderEnvSchema,
72
- "ai.generate": renderAiGenerate,
73
- "ai.extract": renderAiExtract,
74
- "ai.classify": renderAiClassify,
75
- unknown: renderUnknown,
76
- };
77
- function renderPatternOfKind(kind, pattern) {
78
- return PATTERN_RENDERERS[kind](pattern);
79
- }
80
- // =============================================================================
81
- // JSON-Like Value Renderer — emits TypeScript-source-compatible literals.
82
- // Used for declarative pattern bodies (entity definitions, config keys, etc.).
83
- // =============================================================================
84
- /**
85
- * Threshold above which a single-line array/object renders multi-line.
86
- * Biome's default print-width is 100 columns; we leave a margin so a
87
- * pattern at indent=4 still fits before wrapping. Short arrays/objects
88
- * stay on one line, long ones go multi-line — biome-stable in both.
89
- */
90
- const SINGLE_LINE_WIDTH = 80;
91
- /**
92
- * Render a JSON-compatible value as TypeScript source. Matches what
93
- * `readDataLiteralNode` accepts on the parser side: strings, numbers,
94
- * booleans, null, arrays, plain objects. Unsupported values (functions,
95
- * undefined) throw — they should never reach here for a static pattern.
96
- *
97
- * Keys are quoted only when they are not valid JS identifiers. The
98
- * renderer prefers single-line output for short arrays/objects (≤80
99
- * chars including indent and no nested newlines) and falls back to
100
- * multi-line otherwise — biome-stable in both branches.
101
- */
102
- export function renderValue(value, indent = 0) {
103
- if (isRawRefSentinel(value))
104
- return value.__raw;
105
- if (value === null)
106
- return "null";
107
- if (typeof value === "string")
108
- return JSON.stringify(value);
109
- if (typeof value === "number" || typeof value === "boolean")
110
- return String(value);
111
- if (Array.isArray(value)) {
112
- if (value.length === 0)
113
- return "[]";
114
- const items = value.map((v) => renderValue(v, indent + 2));
115
- const singleLine = `[${items.join(", ")}]`;
116
- if (singleLine.length + indent <= SINGLE_LINE_WIDTH && !singleLine.includes("\n")) {
117
- return singleLine;
118
- }
119
- const inner = items.map((item) => `${spaces(indent + 2)}${item}`).join(",\n");
120
- return `[\n${inner},\n${spaces(indent)}]`;
121
- }
122
- if (typeof value === "object") {
123
- const entries = Object.entries(value);
124
- if (entries.length === 0)
125
- return "{}";
126
- const items = entries.map(([k, v]) => `${renderKey(k)}: ${renderValue(v, indent + 2)}`);
127
- const singleLine = `{ ${items.join(", ")} }`;
128
- if (singleLine.length + indent <= SINGLE_LINE_WIDTH && !singleLine.includes("\n")) {
129
- return singleLine;
130
- }
131
- const inner = items.map((item) => `${spaces(indent + 2)}${item}`).join(",\n");
132
- return `{\n${inner},\n${spaces(indent)}}`;
133
- }
134
- throw new Error(`renderValue: unsupported type for value ${String(value)}`);
135
- }
136
- const VALID_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
137
- function renderKey(key) {
138
- return VALID_IDENT.test(key) ? key : JSON.stringify(key);
139
- }
140
- function spaces(n) {
141
- return " ".repeat(n);
142
- }
143
- // =============================================================================
144
- // Static patterns
145
- // =============================================================================
146
- function renderRequires(p) {
147
- return `r.requires({ features: ${renderValue([...p.featureNames])} });`;
148
- }
149
- function renderOptionalRequires(p) {
150
- return `r.optionalRequires({ features: ${renderValue([...p.featureNames])} });`;
151
- }
152
- function renderReadsConfig(p) {
153
- return `r.readsConfig({ keys: ${renderValue([...p.qualifiedKeys])} });`;
154
- }
155
- function renderSystemScope(_p) {
156
- return "r.systemScope();";
157
- }
158
- function renderToggleable(p) {
159
- return `r.toggleable({ default: ${p.default} });`;
160
- }
161
- function renderDescribe(p) {
162
- return `r.describe(${JSON.stringify(p.text)});`;
163
- }
164
- function renderEntity(p) {
165
- // A whole-value raw-ref (`eventEntity`) can't go through renderValue without
166
- // losing `name` to the sentinel shortcut — spread the reference verbatim
167
- // next to the name instead.
168
- if (isRawRefSentinel(p.definition)) {
169
- const backingTable = p.backingTable ? `, backingTable: ${p.backingTable.__raw}` : "";
170
- return `r.entity({ name: ${JSON.stringify(p.entityName)}, ...${p.definition.__raw}${backingTable} });`;
171
- }
172
- const merged = { name: p.entityName, ...p.definition };
173
- return `r.entity(${renderValue(merged)});`;
174
- }
175
- function renderRelation(p) {
176
- if (isRawRefSentinel(p.definition)) {
177
- return `r.relation(${JSON.stringify(p.entityName)}, ${JSON.stringify(p.relationName)}, ${p.definition.__raw});`;
178
- }
179
- const merged = { entity: p.entityName, name: p.relationName, ...p.definition };
180
- return `r.relation(${renderValue(merged)});`;
181
- }
182
- function renderNav(p) {
183
- return `r.nav(${renderValue(p.definition)});`;
184
- }
185
- function renderWorkspace(p) {
186
- return `r.workspace(${renderValue(p.definition)});`;
187
- }
188
- function renderConfig(p) {
189
- return `r.config(${renderValue({ keys: p.keys })});`;
190
- }
191
- function renderTranslations(p) {
192
- return `r.translations(${renderValue({ keys: p.keys })});`;
193
- }
194
- function renderMetric(p) {
195
- if (isRawRefSentinel(p.options)) {
196
- return `r.metric(${JSON.stringify(p.shortName)}, ${p.options.__raw});`;
197
- }
198
- const merged = { name: p.shortName, ...p.options };
199
- return `r.metric(${renderValue(merged)});`;
200
- }
201
- // r.secret / r.secretNamespace throw on an empty writeRoles list; the designer's
202
- // string-list input emits [] when cleared, which means "rely on handler access alone".
203
- function dropEmptyWriteRoles(options) {
204
- if (options.writeRoles?.length !== 0)
205
- return options;
206
- const { writeRoles: _emptyWriteRoles, ...rest } = options;
207
- return rest;
208
- }
209
- function renderSecret(p) {
210
- if (isRawRefSentinel(p.options)) {
211
- return `r.secret(${JSON.stringify(p.shortName)}, ${p.options.__raw});`;
212
- }
213
- const merged = { name: p.shortName, ...dropEmptyWriteRoles(p.options) };
214
- return `r.secret(${renderValue(merged)});`;
215
- }
216
- function renderSecretNamespace(p) {
217
- if (isRawRefSentinel(p.options)) {
218
- return `r.secretNamespace(${JSON.stringify(p.shortName)}, ${p.options.__raw});`;
219
- }
220
- const merged = { name: p.shortName, ...dropEmptyWriteRoles(p.options) };
221
- return `r.secretNamespace(${renderValue(merged)});`;
222
- }
223
- function renderClaimKey(p) {
224
- return `r.claimKey(${renderValue({ name: p.shortName, type: p.claimType })});`;
225
- }
226
- function renderReferenceData(p) {
227
- const merged = {
228
- entity: p.entityName,
229
- data: [...p.data],
230
- ...(p.upsertKey !== undefined && { upsertKey: p.upsertKey }),
231
- };
232
- return `r.referenceData(${renderValue(merged)});`;
233
- }
234
- function renderUseExtension(p) {
235
- const nameLiteral = p.extensionNameRaw ?? JSON.stringify(p.extensionName);
236
- if (isRawRefSentinel(p.options)) {
237
- return `r.useExtension(${nameLiteral}, ${JSON.stringify(p.entityName)}, ${p.options.__raw});`;
238
- }
239
- if (p.extensionNameRaw !== undefined) {
240
- // A raw-ref name can't be spread into the merged Object-Form without
241
- // losing it to renderValue's plain-string serialization — fall back
242
- // to positional form, which keeps the reference verbatim.
243
- const optionsArg = p.options !== undefined ? `, ${renderValue(p.options)}` : "";
244
- return `r.useExtension(${nameLiteral}, ${JSON.stringify(p.entityName)}${optionsArg});`;
245
- }
246
- const merged = {
247
- name: p.extensionName,
248
- entity: p.entityName,
249
- ...(p.options ?? {}),
250
- };
251
- return `r.useExtension(${renderValue(merged)});`;
252
- }
253
- // =============================================================================
254
- // Mixed patterns — header is data, body is opaque source-span (raw TS).
255
- //
256
- // We embed `SourceLocation.raw` verbatim. The static parts get rendered
257
- // as JSON-like values; the closure / schema / template body slots in as
258
- // the original text. Indentation matters for biome-stability — opaque
259
- // bodies are placed at the property's indent level.
260
- // =============================================================================
261
- function renderScreen(p) {
262
- // ScreenDefinition may carry $opaque markers where closures lived.
263
- // We swap each marker for the raw source span from opaqueProps. Walking
264
- // the definition by JSON-path matches how the parser keys the spans.
265
- const woven = weaveOpaque(p.definition, p.opaqueProps, "");
266
- return `r.screen(${renderValueWithRawSlots(woven, 0)});`;
267
- }
268
- /**
269
- * Re-indent a multi-line opaque source span so its continuation lines
270
- * align with the new context. The body's first line is left as-is (it's
271
- * inserted right after `: ` in the property assignment); follow-up
272
- * lines have their *minimum leading whitespace* stripped, then the new
273
- * indent prepended. Single-line bodies pass through.
274
- *
275
- * Why: bodies are captured verbatim from the original file at whatever
276
- * indent they sat at. When embedded into a different surrounding
277
- * structure (e.g. positional → object form), the relative indent
278
- * shifts. Without this normalisation the rendered output looks ragged
279
- * and the roundtrip equality test sees `raw` strings that differ in
280
- * whitespace, even though the code is identical.
281
- */
282
- function reindentBody(raw, newIndent) {
283
- const lines = raw.split("\n");
284
- if (lines.length <= 1)
285
- return raw;
286
- // Determine the smallest leading-whitespace of non-empty continuation lines.
287
- let minIndent = Infinity;
288
- for (let i = 1; i < lines.length; i++) {
289
- const line = lines[i];
290
- if (line === undefined)
291
- continue;
292
- if (line.trim() === "")
293
- continue;
294
- const lead = line.match(/^[ \t]*/)?.[0].length ?? 0;
295
- if (lead < minIndent)
296
- minIndent = lead;
297
- }
298
- if (!Number.isFinite(minIndent))
299
- return raw;
300
- const out = [lines[0] ?? ""];
301
- for (let i = 1; i < lines.length; i++) {
302
- const line = lines[i] ?? "";
303
- if (line.trim() === "") {
304
- out.push("");
305
- }
306
- else {
307
- out.push(newIndent + line.slice(minIndent));
308
- }
309
- }
310
- return out.join("\n");
311
- }
312
- function renderWriteHandler(p) {
313
- if (p.handlerName === undefined)
314
- return p.source.raw;
315
- const lines = ["r.writeHandler({"];
316
- lines.push(` name: ${JSON.stringify(p.handlerName)},`);
317
- lines.push(` schema: ${reindentBody(p.schemaSource?.raw ?? "", PATTERN_INDENT)},`);
318
- lines.push(` handler: ${reindentBody(p.handlerBody?.raw ?? "", PATTERN_INDENT)},`);
319
- if (p.access !== undefined)
320
- lines.push(` access: ${renderValue(p.access)},`);
321
- if (p.description !== undefined)
322
- lines.push(` description: ${JSON.stringify(p.description)},`);
323
- if (p.agent !== undefined)
324
- lines.push(` agent: ${renderValue(p.agent)},`);
325
- if (p.rateLimit !== undefined)
326
- lines.push(` rateLimit: ${renderValue(p.rateLimit)},`);
327
- if (p.additionalRateLimits !== undefined) {
328
- lines.push(` additionalRateLimits: ${renderValue(p.additionalRateLimits)},`);
329
- }
330
- if (p.unsafeSkipTransitionGuard === true)
331
- lines.push(" unsafeSkipTransitionGuard: true,");
332
- if (p.escapeHatch !== undefined)
333
- lines.push(` escapeHatch: ${renderValue(p.escapeHatch)},`);
334
- lines.push("});");
335
- return lines.join("\n");
336
- }
337
- function renderQueryHandler(p) {
338
- if (p.handlerName === undefined)
339
- return p.source.raw;
340
- const lines = ["r.queryHandler({"];
341
- lines.push(` name: ${JSON.stringify(p.handlerName)},`);
342
- lines.push(` schema: ${reindentBody(p.schemaSource?.raw ?? "", PATTERN_INDENT)},`);
343
- lines.push(` handler: ${reindentBody(p.handlerBody?.raw ?? "", PATTERN_INDENT)},`);
344
- if (p.access !== undefined)
345
- lines.push(` access: ${renderValue(p.access)},`);
346
- if (p.description !== undefined)
347
- lines.push(` description: ${JSON.stringify(p.description)},`);
348
- if (p.agent !== undefined)
349
- lines.push(` agent: ${renderValue(p.agent)},`);
350
- if (p.rateLimit !== undefined)
351
- lines.push(` rateLimit: ${renderValue(p.rateLimit)},`);
352
- if (p.escapeHatch !== undefined)
353
- lines.push(` escapeHatch: ${renderValue(p.escapeHatch)},`);
354
- lines.push("});");
355
- return lines.join("\n");
356
- }
357
- function renderStreamHandler(p) {
358
- if (p.handlerName === undefined)
359
- return p.source.raw;
360
- const lines = ["r.streamHandler({"];
361
- lines.push(` name: ${JSON.stringify(p.handlerName)},`);
362
- lines.push(` schema: ${reindentBody(p.schemaSource?.raw ?? "", PATTERN_INDENT)},`);
363
- lines.push(` handler: ${reindentBody(p.handlerBody?.raw ?? "", PATTERN_INDENT)},`);
364
- if (p.access !== undefined)
365
- lines.push(` access: ${renderValue(p.access)},`);
366
- if (p.rateLimit !== undefined)
367
- lines.push(` rateLimit: ${renderValue(p.rateLimit)},`);
368
- if (p.escapeHatch !== undefined)
369
- lines.push(` escapeHatch: ${renderValue(p.escapeHatch)},`);
370
- lines.push("});");
371
- return lines.join("\n");
372
- }
373
- function renderHookTarget(target) {
374
- if (typeof target === "string")
375
- return renderValue(target);
376
- if ("allOf" in target)
377
- return `{ allOf: ${JSON.stringify(target.allOf)} }`;
378
- return renderValue([...target]);
379
- }
380
- function renderHook(p) {
381
- const lines = ["r.hook({"];
382
- lines.push(` type: ${JSON.stringify(p.hookType)},`);
383
- lines.push(` target: ${renderHookTarget(p.target)},`);
384
- lines.push(` handler: ${reindentBody(p.fnBody.raw, PATTERN_INDENT)},`);
385
- if (p.phase !== undefined)
386
- lines.push(` phase: ${JSON.stringify(p.phase)},`);
387
- if (p.escapeHatch !== undefined)
388
- lines.push(` escapeHatch: ${renderValue(p.escapeHatch)},`);
389
- lines.push("});");
390
- return lines.join("\n");
391
- }
392
- function renderEditableString(value) {
393
- return typeof value === "string" ? JSON.stringify(value) : value.__raw;
394
- }
395
- function renderEditableDefaults(value) {
396
- if (isRawRefSentinel(value))
397
- return value.__raw;
398
- return renderValue(value);
399
- }
400
- function renderAiStepCommonFields(lines, p) {
401
- if (p.stepKey !== undefined)
402
- lines.push(` stepKey: ${renderEditableString(p.stepKey)},`);
403
- if (p.promptKey !== undefined)
404
- lines.push(` promptKey: ${renderEditableString(p.promptKey)},`);
405
- if (p.promptFallback !== undefined) {
406
- lines.push(` promptFallback: ${renderEditableString(p.promptFallback)},`);
407
- }
408
- if (p.paramsSchemaSource !== undefined) {
409
- lines.push(` paramsSchema: ${p.paramsSchemaSource.raw},`);
410
- }
411
- if (p.defaults !== undefined) {
412
- lines.push(` defaults: ${renderEditableDefaults(p.defaults)},`);
413
- }
414
- }
415
- function renderAiGenerate(p) {
416
- if (p.argsSource)
417
- return `aiGenerateStep(${p.argsSource.__raw})`;
418
- const lines = ["aiGenerateStep({"];
419
- renderAiStepCommonFields(lines, p);
420
- if (p.inputBody !== undefined)
421
- lines.push(` input: ${p.inputBody.raw},`);
422
- lines.push("})");
423
- return lines.join("\n");
424
- }
425
- function renderAiExtract(p) {
426
- if (p.argsSource)
427
- return `aiExtractStep(${p.argsSource.__raw})`;
428
- const lines = ["aiExtractStep({"];
429
- renderAiStepCommonFields(lines, p);
430
- if (p.outputSchemaSource !== undefined) {
431
- lines.push(` outputSchema: ${p.outputSchemaSource.raw},`);
432
- }
433
- if (p.instructionsBody !== undefined) {
434
- lines.push(` instructions: ${p.instructionsBody.raw},`);
435
- }
436
- if (p.documentBody !== undefined)
437
- lines.push(` document: ${p.documentBody.raw},`);
438
- lines.push("})");
439
- return lines.join("\n");
440
- }
441
- function renderAiClassify(p) {
442
- if (p.argsSource)
443
- return `aiClassifyStep(${p.argsSource.__raw})`;
444
- const lines = ["aiClassifyStep({"];
445
- renderAiStepCommonFields(lines, p);
446
- if (p.actions !== undefined)
447
- lines.push(` actions: ${renderValue(p.actions)},`);
448
- if (p.inputBody !== undefined)
449
- lines.push(` input: ${p.inputBody.raw},`);
450
- lines.push("})");
451
- return lines.join("\n");
452
- }
453
- function renderJob(p) {
454
- const lines = ["r.job({"];
455
- lines.push(` name: ${JSON.stringify(p.jobName)},`);
456
- for (const [k, v] of Object.entries(p.options)) {
457
- lines.push(` ${renderKey(k)}: ${renderValue(v)},`);
458
- }
459
- lines.push(` handler: ${p.handlerBody.raw},`);
460
- lines.push("});");
461
- return lines.join("\n");
462
- }
463
- function renderNotification(p) {
464
- const lines = ["r.notification({"];
465
- lines.push(` name: ${JSON.stringify(p.notificationName)},`);
466
- if (p.trigger)
467
- lines.push(` trigger: { on: ${JSON.stringify(p.trigger.on)} },`);
468
- if (p.recipientBody)
469
- lines.push(` recipient: ${p.recipientBody.raw},`);
470
- if (p.dataBody)
471
- lines.push(` data: ${p.dataBody.raw},`);
472
- if (p.templates && Object.keys(p.templates).length > 0) {
473
- lines.push(" templates: {");
474
- for (const [k, loc] of Object.entries(p.templates)) {
475
- lines.push(` ${renderKey(k)}: ${loc.raw},`);
476
- }
477
- lines.push(" },");
478
- }
479
- lines.push("});");
480
- return lines.join("\n");
481
- }
482
- function renderAuthClaims(p) {
483
- return `r.authClaims(${p.fnBody.raw});`;
484
- }
485
- // treeActions is a static object-literal (mirrors renderWorkspace).
486
- function renderTreeActions(p) {
487
- return `r.treeActions(${renderValue(p.definitions)});`;
488
- }
489
- function renderHttpRoute(p) {
490
- const lines = ["r.httpRoute({"];
491
- lines.push(` method: ${JSON.stringify(p.method)},`);
492
- lines.push(` path: ${JSON.stringify(p.path)},`);
493
- lines.push(` anonymous: ${p.anonymous},`);
494
- lines.push(` handler: ${p.handlerBody.raw},`);
495
- lines.push("});");
496
- return lines.join("\n");
497
- }
498
- function renderProjection(p) {
499
- const lines = ["r.projection({"];
500
- lines.push(` name: ${JSON.stringify(p.name)},`);
501
- // ProjectionPattern.sourceEntity is the typed field; the runtime
502
- // r.projection({...}) call uses `source` (matches ProjectionDefinition).
503
- lines.push(` source: ${renderValue(typeof p.sourceEntity === "string" ? p.sourceEntity : [...p.sourceEntity])},`);
504
- lines.push(" apply: {");
505
- for (const [eventType, loc] of Object.entries(p.applyBodies)) {
506
- lines.push(` ${renderKey(eventType)}: ${loc.raw},`);
507
- }
508
- lines.push(" },");
509
- lines.push("});");
510
- return lines.join("\n");
511
- }
512
- function renderMultiStreamProjection(p) {
513
- const lines = ["r.multiStreamProjection({"];
514
- lines.push(` name: ${JSON.stringify(p.name)},`);
515
- lines.push(" apply: {");
516
- for (const [eventType, loc] of Object.entries(p.applyBodies)) {
517
- lines.push(` ${renderKey(eventType)}: ${loc.raw},`);
518
- }
519
- lines.push(" },");
520
- if (p.errorMode !== undefined)
521
- lines.push(` errorMode: ${renderValue(p.errorMode)},`);
522
- if (p.runIn !== undefined)
523
- lines.push(` runIn: ${renderValue(p.runIn)},`);
524
- if (p.delivery !== undefined)
525
- lines.push(` delivery: ${JSON.stringify(p.delivery)},`);
526
- lines.push("});");
527
- return lines.join("\n");
528
- }
529
- function renderDefineEvent(p) {
530
- const nameLiteral = p.eventNameRaw ?? JSON.stringify(p.eventName);
531
- const migrationEntries = p.migrations !== undefined ? Object.entries(p.migrations) : [];
532
- // piiFields is a mandatory option — the options object is
533
- // always rendered, unlike the old version/migrations-only shortcut.
534
- const lines = [`r.defineEvent(${nameLiteral}, ${p.schemaSource.raw}, {`];
535
- lines.push(` piiFields: ${p.piiFields.raw},`);
536
- if (p.version !== undefined)
537
- lines.push(` version: ${p.version},`);
538
- if (migrationEntries.length > 0) {
539
- lines.push(" migrations: [");
540
- for (const [fromVersion, transformBody] of migrationEntries) {
541
- const from = Number(fromVersion);
542
- lines.push(` { fromVersion: ${from}, toVersion: ${from + 1}, transform: ${transformBody.raw} },`);
543
- }
544
- lines.push(" ],");
545
- }
546
- lines.push("});");
547
- return lines.join("\n");
548
- }
549
- function renderExtendsRegistrar(p) {
550
- const nameLiteral = p.extensionNameRaw ?? JSON.stringify(p.extensionName);
551
- return `r.extendsRegistrar(${nameLiteral}, ${p.defBody.raw});`;
552
- }
553
- function renderEnvSchema(p) {
554
- return `r.envSchema(${p.schemaBody.raw});`;
555
- }
556
- function renderUsesApi(p) {
557
- return `r.usesApi(${JSON.stringify(p.apiName)});`;
558
- }
559
- function renderExposesApi(p) {
560
- return `r.exposesApi(${JSON.stringify(p.apiName)});`;
561
- }
562
- function renderUiHints(p) {
563
- return p.source.raw;
564
- }
565
- function renderUnknown(p) {
566
- // Round-trip preservation only: emit the raw call text from the
567
- // SourceLocation so the rendered file stays semantically identical
568
- // to the input.
569
- //
570
- // **Patch-Surprise warning:** an UnknownPattern cannot be added via
571
- // FeaturePatcher (no typed `addUnknown` exists, by design — typed
572
- // adds force the caller to commit to a known pattern-kind). It also
573
- // cannot be replaced/removed cleanly, because no PatternId variant
574
- // matches an UnknownPattern's free-form shape. Treat UnknownPattern
575
- // as read-only in the patcher pipeline; the only way to "edit" one
576
- // is to convert it to a known pattern-kind first (i.e. add a typed
577
- // extractor + pattern type).
578
- return p.source.raw;
579
- }
580
- function weaveOpaque(value, opaqueProps, path) {
581
- if (value === SCREEN_OPAQUE_MARKER) {
582
- const span = opaqueProps[path];
583
- if (!span)
584
- throw new Error(`weaveOpaque: missing span for path "${path}"`);
585
- return { __raw: span.raw };
586
- }
587
- if (Array.isArray(value)) {
588
- return value.map((el, idx) => weaveOpaque(el, opaqueProps, `${path}.${idx}`));
589
- }
590
- if (value && typeof value === "object") {
591
- const out = {};
592
- for (const [k, v] of Object.entries(value)) {
593
- const childPath = path ? `${path}.${k}` : k;
594
- out[k] = weaveOpaque(v, opaqueProps, childPath);
595
- }
596
- return out;
597
- }
598
- return value;
599
- }
600
- function renderValueWithRawSlots(value, indent) {
601
- if (isRawRefSentinel(value))
602
- return value.__raw;
603
- if (Array.isArray(value)) {
604
- if (value.length === 0)
605
- return "[]";
606
- const inner = value
607
- .map((v) => `${spaces(indent + 2)}${renderValueWithRawSlots(v, indent + 2)}`)
608
- .join(",\n");
609
- return `[\n${inner},\n${spaces(indent)}]`;
610
- }
611
- if (value !== null && typeof value === "object") {
612
- const entries = Object.entries(value);
613
- if (entries.length === 0)
614
- return "{}";
615
- const inner = entries
616
- .map(([k, v]) => `${spaces(indent + 2)}${renderKey(k)}: ${renderValueWithRawSlots(v, indent + 2)}`)
617
- .join(",\n");
618
- return `{\n${inner},\n${spaces(indent)}}`;
619
- }
620
- return renderValue(value, indent);
621
- }
622
- const DEFAULT_IMPORTS = [
623
- 'import { defineFeature } from "@cosmicdrift/kumiko-framework/engine";',
624
- 'import * as z from "zod";',
625
- ];
626
- /**
627
- * Render a complete feature-file: schema-version header, imports, the
628
- * defineFeature call wrapping every pattern in source order. The output
629
- * is biome-format-stable so callers can persist it directly.
630
- */
631
- export function renderFeatureFile(input) {
632
- const imports = input.imports ?? DEFAULT_IMPORTS;
633
- const body = input.patterns.map((p) => indent(renderPattern(p), PATTERN_INDENT)).join("\n\n");
634
- return [
635
- VERSION_HEADER,
636
- "",
637
- ...imports,
638
- "",
639
- `defineFeature(${JSON.stringify(input.featureName)}, (r) => {`,
640
- body,
641
- "});",
642
- "",
643
- ].join("\n");
644
- }
645
- /**
646
- * Prefix every non-empty line of `text` with `prefix`. Re-used from the
647
- * patcher (patch.ts imports this) so indent helpers stay in one place
648
- * — when canonical-form indentation conventions ever change, only this
649
- * function needs to follow.
650
- */
651
- export function indent(text, prefix) {
652
- return text
653
- .split("\n")
654
- .map((line) => (line.length === 0 ? line : prefix + line))
655
- .join("\n");
656
- }
657
- /**
658
- * Indentation prefix used inside `defineFeature((r) => { ... })` for
659
- * every top-level r.* statement. Two-space convention matches biome's
660
- * default and the parse-happy-path test fixture.
661
- */
662
- export const PATTERN_INDENT = " ";
@@ -1,17 +0,0 @@
1
- import type { Node, SourceFile } from "ts-morph";
2
- export type SourcePosition = {
3
- readonly line: number;
4
- readonly column: number;
5
- };
6
- export type SourceLocation = {
7
- readonly file: string;
8
- readonly start: SourcePosition;
9
- readonly end: SourcePosition;
10
- readonly raw: string;
11
- };
12
- /**
13
- * Build a SourceLocation from a ts-morph Node. Lives here (not in
14
- * parse.ts) so extractors can use it without importing parse.ts —
15
- * keeps the dependency graph one-way.
16
- */
17
- export declare function sourceLocationFromNode(node: Node, sourceFile: SourceFile): SourceLocation;