@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,358 +0,0 @@
1
- import { ENTITY_CONVENTION_QUERY_BRAND } from "@cosmicdrift/kumiko-types/handlers";
2
- import { SyntaxKind } from "ts-morph";
3
- import { sourceLocationFromNode } from "../source-location.js";
4
- import { readHeaderValueOrRaw, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalEscapeHatch, readOptionalRateLimit, } from "./hooks.js";
5
- import { fail, findFunctionLiteral, isPlainObject, isRawRefSentinel, ok, readBooleanProperty, readDataLiteralNode, readNameLiteral, readObjectPropertyInitializer, readPropertyKey, } from "./shared.js";
6
- export const AGENT_RISK_VALUES = ["low", "mid", "high"];
7
- function isAgentRisk(value) {
8
- return typeof value === "string" && AGENT_RISK_VALUES.includes(value);
9
- }
10
- export function readOptionalAgentHints(value) {
11
- if (!isPlainObject(value))
12
- return undefined;
13
- const expose = typeof value["expose"] === "boolean" ? value["expose"] : undefined;
14
- const risk = isAgentRisk(value["risk"]) ? value["risk"] : undefined;
15
- if (expose === undefined && risk === undefined)
16
- return undefined;
17
- return {
18
- ...(expose !== undefined && { expose }),
19
- ...(risk !== undefined && { risk }),
20
- };
21
- }
22
- // Record<keyof Def, ...> instead of a looser map: adding a field to
23
- // WriteHandlerDef/QueryHandlerDef/StreamHandlerDef without classifying it
24
- // here is a compile error, not a silent drop on render.
25
- const WRITE_HANDLER_KEY_KINDS = {
26
- name: "modeled",
27
- schema: "modeled",
28
- handler: "modeled",
29
- access: "modeled",
30
- description: "modeled",
31
- agent: "modeled",
32
- excludedFields: "opaque",
33
- unsafeSkipTransitionGuard: "modeled",
34
- rateLimit: "modeled",
35
- additionalRateLimits: "modeled",
36
- rateLimitCost: "opaque",
37
- escapeHatch: "modeled",
38
- tenantlessAnonymous: "opaque",
39
- reserveBeforeTransaction: "opaque",
40
- beforeTransaction: "opaque",
41
- transaction: "opaque",
42
- perform: "opaque",
43
- };
44
- const QUERY_HANDLER_KEY_KINDS = {
45
- name: "modeled",
46
- schema: "modeled",
47
- handler: "modeled",
48
- [ENTITY_CONVENTION_QUERY_BRAND]: "opaque",
49
- access: "modeled",
50
- description: "modeled",
51
- agent: "modeled",
52
- rateLimit: "modeled",
53
- outputSchema: "opaque",
54
- liveEntities: "opaque",
55
- escapeHatch: "modeled",
56
- };
57
- const STREAM_HANDLER_KEY_KINDS = {
58
- name: "modeled",
59
- schema: "modeled",
60
- handler: "modeled",
61
- access: "modeled",
62
- rateLimit: "modeled",
63
- escapeHatch: "modeled",
64
- };
65
- const HANDLER_KEY_KINDS = {
66
- writeHandler: WRITE_HANDLER_KEY_KINDS,
67
- queryHandler: QUERY_HANDLER_KEY_KINDS,
68
- streamHandler: STREAM_HANDLER_KEY_KINDS,
69
- };
70
- function lookupClassification(map, key) {
71
- return key in map ? map[key] : undefined;
72
- }
73
- function isStaticStringNode(node) {
74
- const kind = node.getKind();
75
- return kind === SyntaxKind.StringLiteral || kind === SyntaxKind.NoSubstitutionTemplateLiteral;
76
- }
77
- function isBooleanLiteralNode(node) {
78
- const kind = node.getKind();
79
- return kind === SyntaxKind.TrueKeyword || kind === SyntaxKind.FalseKeyword;
80
- }
81
- // The literal readers below only understand a static string `description` and
82
- // a true/false `unsafeSkipTransitionGuard`; any other value shape is lossy.
83
- function hasUnreadableLiteralValue(key, initializer) {
84
- if (key === "description")
85
- return !(initializer && isStaticStringNode(initializer));
86
- if (key === "unsafeSkipTransitionGuard")
87
- return !(initializer && isBooleanLiteralNode(initializer));
88
- return false;
89
- }
90
- function readStaticStringProperty(obj, key) {
91
- const initializer = obj.getProperty(key)?.asKind(SyntaxKind.PropertyAssignment)?.getInitializer();
92
- return (initializer?.asKind(SyntaxKind.StringLiteral) ??
93
- initializer?.asKind(SyntaxKind.NoSubstitutionTemplateLiteral))?.getLiteralValue();
94
- }
95
- // True when the call's object body/options carry a shape the extractor
96
- // cannot losslessly model property-by-property (a spread, a method/accessor
97
- // shorthand, a computed key, or a key outside the classification map above).
98
- // Callers fall back to the opaque whole-call pattern instead of dropping
99
- // whatever they can't read.
100
- function hasUnmodeledShape(obj, methodName) {
101
- const keyKinds = HANDLER_KEY_KINDS[methodName];
102
- for (const prop of obj.getProperties()) {
103
- if (prop.getKind() === SyntaxKind.SpreadAssignment)
104
- return true;
105
- const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
106
- if (propAssign) {
107
- if (propAssign.getNameNode().getKind() === SyntaxKind.ComputedPropertyName)
108
- return true;
109
- const key = readPropertyKey(propAssign);
110
- if (lookupClassification(keyKinds, key) !== "modeled")
111
- return true;
112
- const initializer = propAssign.getInitializer();
113
- if (hasUnreadableLiteralValue(key, initializer))
114
- return true;
115
- continue;
116
- }
117
- const shorthand = prop.asKind(SyntaxKind.ShorthandPropertyAssignment);
118
- if (shorthand) {
119
- const key = shorthand.getName();
120
- if (lookupClassification(keyKinds, key) !== "modeled")
121
- return true;
122
- // A shorthand's value is invisible to the literal readers below.
123
- if (key === "description" || key === "unsafeSkipTransitionGuard")
124
- return true;
125
- continue;
126
- }
127
- return true;
128
- }
129
- return false;
130
- }
131
- /**
132
- * Resolves an argument standing in for a handler-call's object-form body:
133
- * either it's already an object literal, or a bare identifier declared
134
- * locally (same file only) with one as its initializer. Anything else
135
- * (imported binding, factory call, ...) is not resolvable here.
136
- */
137
- function resolveObjectLiteralArg(node) {
138
- const direct = node.asKind(SyntaxKind.ObjectLiteralExpression);
139
- if (direct)
140
- return direct;
141
- const identifier = node.asKind(SyntaxKind.Identifier);
142
- if (!identifier)
143
- return undefined;
144
- const varDecl = node.getSourceFile().getVariableDeclaration(identifier.getText());
145
- return varDecl?.getInitializer()?.asKind(SyntaxKind.ObjectLiteralExpression);
146
- }
147
- // Deliberately does NOT resolve identifiers (unlike resolveObjectLiteralArg):
148
- // an options argument authored as a bare reference has no per-property
149
- // nodes to read, so parseHandlerCall falls back to the opaque whole-call
150
- // pattern instead of trying to read headers off it.
151
- function unwrapObjectLiteral(node) {
152
- const direct = node.asKind(SyntaxKind.ObjectLiteralExpression);
153
- if (direct)
154
- return direct;
155
- const asExpr = node.asKind(SyntaxKind.AsExpression);
156
- if (asExpr)
157
- return unwrapObjectLiteral(asExpr.getExpression());
158
- const satisfiesExpr = node.asKind(SyntaxKind.SatisfiesExpression);
159
- if (satisfiesExpr)
160
- return unwrapObjectLiteral(satisfiesExpr.getExpression());
161
- const paren = node.asKind(SyntaxKind.ParenthesizedExpression);
162
- if (paren)
163
- return unwrapObjectLiteral(paren.getExpression());
164
- return undefined;
165
- }
166
- function readHeaderField(init, recognize, methodName, sourceFile, unrecognizedReason) {
167
- if (!init)
168
- return ok(undefined);
169
- const result = readHeaderValueOrRaw(init, recognize);
170
- if (result.kind === "value")
171
- return ok(result.value);
172
- if (result.kind === "raw")
173
- return ok(result.sentinel);
174
- return fail(methodName, sourceLocationFromNode(init, sourceFile), unrecognizedReason);
175
- }
176
- // Shared by the object-form call body and the positional options object,
177
- // which carry the same header shape.
178
- function readHandlerHeaderFields(obj, methodName, sourceFile) {
179
- const accessResult = readHeaderField(readObjectPropertyInitializer(obj, "access"), readOptionalAccessRule, methodName, sourceFile, "access must be a recognized AccessRule ({ roles: [...] } or { openToAll: { reason } }), or a reference to one");
180
- if (accessResult.kind === "error")
181
- return accessResult;
182
- const rateLimitResult = readHeaderField(readObjectPropertyInitializer(obj, "rateLimit"), readOptionalRateLimit, methodName, sourceFile, "rateLimit must be { per, limit, windowSeconds }, a non-empty list of those, or { disabled: true, reason }, or a reference to one");
183
- if (rateLimitResult.kind === "error")
184
- return rateLimitResult;
185
- const additionalRateLimitsResult = readHeaderField(readObjectPropertyInitializer(obj, "additionalRateLimits"), readOptionalAdditionalRateLimits, methodName, sourceFile, "additionalRateLimits must be an array of { per: { payloadField }, limit, windowSeconds }, or a reference to one");
186
- if (additionalRateLimitsResult.kind === "error")
187
- return additionalRateLimitsResult;
188
- const escapeHatchResult = readHeaderField(readObjectPropertyInitializer(obj, "escapeHatch"), readOptionalEscapeHatch, methodName, sourceFile, "escapeHatch must be { reason: string }, or a reference to one");
189
- if (escapeHatchResult.kind === "error")
190
- return escapeHatchResult;
191
- const agentResult = readHeaderField(readObjectPropertyInitializer(obj, "agent"), readOptionalAgentHints, methodName, sourceFile, 'agent must be { expose?: boolean, risk?: "low" | "mid" | "high" }, or a reference to one');
192
- if (agentResult.kind === "error")
193
- return agentResult;
194
- return ok({
195
- ...(accessResult.pattern !== undefined && { access: accessResult.pattern }),
196
- ...(rateLimitResult.pattern !== undefined && { rateLimit: rateLimitResult.pattern }),
197
- ...(additionalRateLimitsResult.pattern !== undefined && {
198
- additionalRateLimits: additionalRateLimitsResult.pattern,
199
- }),
200
- ...(escapeHatchResult.pattern !== undefined && { escapeHatch: escapeHatchResult.pattern }),
201
- ...(agentResult.pattern !== undefined && { agent: agentResult.pattern }),
202
- });
203
- }
204
- export function parseHandlerCall(call, sourceFile, methodName) {
205
- const args = call.getArguments();
206
- const first = args[0];
207
- if (!first) {
208
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "expected at least one argument");
209
- }
210
- const obj = args.length === 1 ? resolveObjectLiteralArg(first) : undefined;
211
- if (obj) {
212
- if (hasUnmodeledShape(obj, methodName)) {
213
- return ok({ source: sourceLocationFromNode(call, sourceFile) });
214
- }
215
- const nameLiteral = obj
216
- .getProperty("name")
217
- ?.asKind(SyntaxKind.PropertyAssignment)
218
- ?.getInitializer()
219
- ?.asKind(SyntaxKind.StringLiteral);
220
- if (!nameLiteral) {
221
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `name` property");
222
- }
223
- const schemaInit = obj
224
- .getProperty("schema")
225
- ?.asKind(SyntaxKind.PropertyAssignment)
226
- ?.getInitializer();
227
- if (!schemaInit) {
228
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "object form requires a `schema` property");
229
- }
230
- const handlerInit = obj
231
- .getProperty("handler")
232
- ?.asKind(SyntaxKind.PropertyAssignment)
233
- ?.getInitializer();
234
- if (!handlerInit) {
235
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "object form requires a `handler` property");
236
- }
237
- const fn = findFunctionLiteral(handlerInit);
238
- if (!fn) {
239
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "handler must be an inline arrow function or function expression");
240
- }
241
- const headerResult = readHandlerHeaderFields(obj, methodName, sourceFile);
242
- if (headerResult.kind === "error")
243
- return headerResult;
244
- const description = readStaticStringProperty(obj, "description");
245
- const skip = readBooleanProperty(obj, "unsafeSkipTransitionGuard");
246
- return ok({
247
- source: sourceLocationFromNode(call, sourceFile),
248
- handlerName: nameLiteral.getLiteralValue(),
249
- schemaSource: sourceLocationFromNode(schemaInit, sourceFile),
250
- handlerBody: sourceLocationFromNode(fn, sourceFile),
251
- ...headerResult.pattern,
252
- ...(description !== undefined && { description }),
253
- ...(skip === true && { unsafeSkipTransitionGuard: true }),
254
- });
255
- }
256
- // A single reference standing in for the whole handler argument set
257
- // (`r.writeHandler(eventCreateHandler)`, `r.queryHandler(someQuery())`)
258
- // that resolveObjectLiteralArg above couldn't turn into an object literal
259
- // (imported binding, factory call, ...). Keep it recognised as this kind
260
- // instead of ParseErroring. Opaque: renderWriteHandler/
261
- // renderQueryHandler re-emit `source.raw` verbatim when handlerName is
262
- // undefined.
263
- if (args.length === 1 && isRawRefSentinel(readDataLiteralNode(first))) {
264
- return ok({ source: sourceLocationFromNode(call, sourceFile) });
265
- }
266
- const handlerName = readNameLiteral(first);
267
- if (handlerName === undefined) {
268
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "first argument must be a string literal handler name, or an identifier resolving to one (or use the object form)");
269
- }
270
- const schemaArg = args[1];
271
- if (!schemaArg) {
272
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "expected a Zod schema as second argument");
273
- }
274
- const handlerArg = args[2];
275
- if (!handlerArg) {
276
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "expected a handler function as third argument");
277
- }
278
- const fn = findFunctionLiteral(handlerArg);
279
- if (!fn) {
280
- return fail(methodName, sourceLocationFromNode(call, sourceFile), "third argument must be an inline arrow function or function expression");
281
- }
282
- const optionsArg = args[3];
283
- let headerFields = {};
284
- let description;
285
- let skipTransitionGuard;
286
- if (optionsArg) {
287
- const optionsObj = unwrapObjectLiteral(optionsArg);
288
- if (!optionsObj || hasUnmodeledShape(optionsObj, methodName)) {
289
- return ok({ source: sourceLocationFromNode(call, sourceFile) });
290
- }
291
- const headerResult = readHandlerHeaderFields(optionsObj, methodName, sourceFile);
292
- if (headerResult.kind === "error")
293
- return headerResult;
294
- headerFields = headerResult.pattern;
295
- description = readStaticStringProperty(optionsObj, "description");
296
- skipTransitionGuard = readBooleanProperty(optionsObj, "unsafeSkipTransitionGuard");
297
- }
298
- return ok({
299
- source: sourceLocationFromNode(call, sourceFile),
300
- handlerName,
301
- schemaSource: sourceLocationFromNode(schemaArg, sourceFile),
302
- handlerBody: sourceLocationFromNode(fn, sourceFile),
303
- ...headerFields,
304
- ...(description !== undefined && { description }),
305
- ...(skipTransitionGuard === true && { unsafeSkipTransitionGuard: true }),
306
- });
307
- }
308
- export function extractWriteHandler(call, sourceFile) {
309
- const parsed = parseHandlerCall(call, sourceFile, "writeHandler");
310
- if (parsed.kind === "error")
311
- return parsed;
312
- return ok({
313
- kind: "writeHandler",
314
- source: parsed.pattern.source,
315
- handlerName: parsed.pattern.handlerName,
316
- schemaSource: parsed.pattern.schemaSource,
317
- handlerBody: parsed.pattern.handlerBody,
318
- ...(parsed.pattern.access !== undefined && { access: parsed.pattern.access }),
319
- ...(parsed.pattern.description !== undefined && { description: parsed.pattern.description }),
320
- ...(parsed.pattern.agent !== undefined && { agent: parsed.pattern.agent }),
321
- ...(parsed.pattern.rateLimit !== undefined && { rateLimit: parsed.pattern.rateLimit }),
322
- ...(parsed.pattern.additionalRateLimits !== undefined && {
323
- additionalRateLimits: parsed.pattern.additionalRateLimits,
324
- }),
325
- ...(parsed.pattern.unsafeSkipTransitionGuard === true && { unsafeSkipTransitionGuard: true }),
326
- ...(parsed.pattern.escapeHatch !== undefined && { escapeHatch: parsed.pattern.escapeHatch }),
327
- });
328
- }
329
- function readHandlerFields(parsed) {
330
- return {
331
- source: parsed.pattern.source,
332
- handlerName: parsed.pattern.handlerName,
333
- schemaSource: parsed.pattern.schemaSource,
334
- handlerBody: parsed.pattern.handlerBody,
335
- ...(parsed.pattern.access !== undefined && { access: parsed.pattern.access }),
336
- ...(parsed.pattern.rateLimit !== undefined && { rateLimit: parsed.pattern.rateLimit }),
337
- ...(parsed.pattern.escapeHatch !== undefined && { escapeHatch: parsed.pattern.escapeHatch }),
338
- };
339
- }
340
- export function extractQueryHandler(call, sourceFile) {
341
- const parsed = parseHandlerCall(call, sourceFile, "queryHandler");
342
- if (parsed.kind === "error")
343
- return parsed;
344
- return ok({
345
- kind: "queryHandler",
346
- ...readHandlerFields(parsed),
347
- ...(parsed.pattern.description !== undefined && { description: parsed.pattern.description }),
348
- ...(parsed.pattern.agent !== undefined && { agent: parsed.pattern.agent }),
349
- });
350
- }
351
- // StreamHandlerDef has no description/agent at runtime, unlike escapeHatch,
352
- // so readHandlerFields forwards only access/rateLimit/escapeHatch.
353
- export function extractStreamHandler(call, sourceFile) {
354
- const parsed = parseHandlerCall(call, sourceFile, "streamHandler");
355
- if (parsed.kind === "error")
356
- return parsed;
357
- return ok({ kind: "streamHandler", ...readHandlerFields(parsed) });
358
- }
@@ -1,24 +0,0 @@
1
- import type { CallExpression, Node, SourceFile } from "ts-morph";
2
- import type { LifecycleHookType } from "../../constants.ts";
3
- import type { AccessRule, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.ts";
4
- import type { HookPhase } from "../../types/hooks.ts";
5
- import type { AuthClaimsPattern, HookPattern } from "../patterns.ts";
6
- import { type ExtractOutput, type RawRefSentinel } from "./shared.ts";
7
- export type HeaderReadResult<T> = {
8
- readonly kind: "value";
9
- readonly value: T;
10
- } | {
11
- readonly kind: "raw";
12
- readonly sentinel: RawRefSentinel;
13
- } | {
14
- readonly kind: "unrecognized";
15
- };
16
- export declare function readHeaderValueOrRaw<T>(init: Node, recognize: (value: unknown) => T | undefined): HeaderReadResult<T>;
17
- export declare function isHookType(value: string): value is LifecycleHookType | "validation";
18
- export declare function readOptionalPhase(node: Node | undefined): HookPhase | undefined;
19
- export declare function readOptionalAccessRule(value: unknown): AccessRule | undefined;
20
- export declare function readOptionalRateLimit(value: unknown): RateLimitDeclaration | undefined;
21
- export declare function readOptionalAdditionalRateLimits(value: unknown): readonly PayloadRateLimitOption[] | undefined;
22
- export declare function readOptionalEscapeHatch(value: unknown): EscapeHatchDeclaration | undefined;
23
- export declare function extractHook(call: CallExpression, sourceFile: SourceFile): ExtractOutput<HookPattern>;
24
- export declare function extractAuthClaims(call: CallExpression, sourceFile: SourceFile): ExtractOutput<AuthClaimsPattern>;
@@ -1,248 +0,0 @@
1
- import { isEscapeHatchGrant, isRateLimitOption } from "@cosmicdrift/kumiko-types/handlers";
2
- import { SyntaxKind } from "ts-morph";
3
- import { sourceLocationFromNode } from "../source-location.js";
4
- import { containsRawRefSentinel, fail, findFunctionLiteral, isPlainObject, ok, readDataLiteralNode, readNameLiteral, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, } from "./shared.js";
5
- // Raw-sentinel check runs before recognize: recognize narrows literals and
6
- // would silently drop a nested reference (e.g. roles array plus a
7
- // non-literal personalData) that the whole-object narrowing can't see.
8
- export function readHeaderValueOrRaw(init, recognize) {
9
- const value = readDataLiteralNode(init);
10
- if (value === undefined || containsRawRefSentinel(value)) {
11
- return { kind: "raw", sentinel: { __raw: init.getText() } };
12
- }
13
- const recognized = recognize(value);
14
- if (recognized === undefined)
15
- return { kind: "unrecognized" };
16
- return { kind: "value", value: recognized };
17
- }
18
- export function isHookType(value) {
19
- return (value === "preSave" ||
20
- value === "postSave" ||
21
- value === "preDelete" ||
22
- value === "postDelete" ||
23
- value === "preQuery" ||
24
- value === "validation");
25
- }
26
- export function readOptionalPhase(node) {
27
- if (!node)
28
- return undefined;
29
- const obj = readDataLiteralNode(node);
30
- if (!isPlainObject(obj))
31
- return undefined;
32
- const phase = obj["phase"];
33
- if (phase === "inTransaction" || phase === "afterCommit")
34
- return phase;
35
- return undefined;
36
- }
37
- // `openToAll: true` (deprecated) is not recognised here — isOpenToAllGranted never grants it, so extracting it would round-trip a rule that looks configured but denies everyone.
38
- export function readOptionalAccessRule(value) {
39
- if (!isPlainObject(value))
40
- return undefined;
41
- if (Array.isArray(value["roles"]) && value["roles"].every((r) => typeof r === "string")) {
42
- const personalData = value["personalData"] === "public-intake" ? { personalData: "public-intake" } : {};
43
- return { roles: value["roles"], ...personalData };
44
- }
45
- const openToAll = value["openToAll"];
46
- if (isPlainObject(openToAll) && typeof openToAll["reason"] === "string") {
47
- const personalData = openToAll["personalData"] === "tenant-members"
48
- ? { personalData: "tenant-members" }
49
- : {};
50
- return { openToAll: { reason: openToAll["reason"], ...personalData } };
51
- }
52
- return undefined;
53
- }
54
- export function readOptionalRateLimit(value) {
55
- if (Array.isArray(value)) {
56
- if (!value.every(isRateLimitOption))
57
- return undefined;
58
- const [first, ...rest] = value;
59
- return first === undefined ? undefined : [first, ...rest];
60
- }
61
- if (!isPlainObject(value))
62
- return undefined;
63
- if (value["disabled"] === true) {
64
- // Strict shape: exactly { disabled: true, reason } — anything extra
65
- // isn't RateLimitDisabled and falls through to "unrecognized".
66
- if (typeof value["reason"] !== "string")
67
- return undefined;
68
- if (Object.keys(value).length !== 2)
69
- return undefined;
70
- return { disabled: true, reason: value["reason"] };
71
- }
72
- return isRateLimitOption(value) ? value : undefined;
73
- }
74
- function isPayloadRateLimitOption(value) {
75
- if (!isPlainObject(value))
76
- return false;
77
- const per = value["per"];
78
- return (isPlainObject(per) &&
79
- typeof per["payloadField"] === "string" &&
80
- typeof value["limit"] === "number" &&
81
- typeof value["windowSeconds"] === "number");
82
- }
83
- export function readOptionalAdditionalRateLimits(value) {
84
- if (!Array.isArray(value) || !value.every(isPayloadRateLimitOption))
85
- return undefined;
86
- return value;
87
- }
88
- export function readOptionalEscapeHatch(value) {
89
- if (!isPlainObject(value))
90
- return undefined;
91
- if (typeof value["reason"] !== "string")
92
- return undefined;
93
- const grants = value["grants"];
94
- if (grants === undefined)
95
- return { reason: value["reason"] };
96
- if (!Array.isArray(grants) || !grants.every(isEscapeHatchGrant))
97
- return undefined;
98
- return { reason: value["reason"], grants };
99
- }
100
- // Reads the `escapeHatch` sub-property node first, not via readDataLiteralNode
101
- // on the whole object: a sibling property like `handler` (a closure) isn't
102
- // representable as plain data, which would make the whole-object read
103
- // return undefined. undefined means the property is absent, not an error.
104
- function readOptionalHookEscapeHatch(node) {
105
- const obj = node?.asKind(SyntaxKind.ObjectLiteralExpression);
106
- if (!obj)
107
- return undefined;
108
- const init = readObjectPropertyInitializer(obj, "escapeHatch");
109
- if (!init)
110
- return undefined;
111
- return readHeaderValueOrRaw(init, readOptionalEscapeHatch);
112
- }
113
- // Resolves the hook's escapeHatch into either a field to spread into the
114
- // pattern, or a ParseError for a fully literal but unrecognized shape.
115
- function readHookEscapeHatch(node, call, sourceFile) {
116
- const result = readOptionalHookEscapeHatch(node);
117
- if (!result)
118
- return {};
119
- if (result.kind === "unrecognized") {
120
- return fail("hook", sourceLocationFromNode(call, sourceFile), "escapeHatch must be { reason: string }, or a reference to one");
121
- }
122
- return { escapeHatch: result.kind === "value" ? result.value : result.sentinel };
123
- }
124
- // r.hook's target: a NameOrRef, a list of them, or an entity-wide
125
- // `{ allOf: entityRef }` (replaces the old r.entityHook(type, entity, fn)).
126
- // Checked first so a malformed `{ allOf }` doesn't silently fall through
127
- // to being read as some other object shape.
128
- function readHookTarget(node) {
129
- const obj = node.asKind(SyntaxKind.ObjectLiteralExpression);
130
- if (obj) {
131
- const allOfProp = obj.getProperty("allOf")?.asKind(SyntaxKind.PropertyAssignment);
132
- if (allOfProp) {
133
- const initializer = allOfProp.getInitializer();
134
- const entityName = initializer && readNameOrRef(initializer);
135
- return entityName ? { allOf: entityName } : undefined;
136
- }
137
- }
138
- return readNameOrRefOrList(node);
139
- }
140
- export function extractHook(call, sourceFile) {
141
- const args = call.getArguments();
142
- const first = args[0];
143
- if (!first) {
144
- return fail("hook", sourceLocationFromNode(call, sourceFile), "expected at least one argument");
145
- }
146
- const obj = first.asKind(SyntaxKind.ObjectLiteralExpression);
147
- if (obj && args.length === 1) {
148
- const typeInit = obj
149
- .getProperty("type")
150
- ?.asKind(SyntaxKind.PropertyAssignment)
151
- ?.getInitializer()
152
- ?.asKind(SyntaxKind.StringLiteral);
153
- if (!typeInit) {
154
- return fail("hook", sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `type` property");
155
- }
156
- const hookType = typeInit.getLiteralValue();
157
- if (!isHookType(hookType)) {
158
- return fail("hook", sourceLocationFromNode(call, sourceFile), `hook type "${hookType}" is not one of the lifecycle types or "validation"`);
159
- }
160
- const targetInit = obj
161
- .getProperty("target")
162
- ?.asKind(SyntaxKind.PropertyAssignment)
163
- ?.getInitializer();
164
- if (!targetInit) {
165
- return fail("hook", sourceLocationFromNode(call, sourceFile), "object form requires a `target` property");
166
- }
167
- const target = readHookTarget(targetInit);
168
- if (!target) {
169
- return fail("hook", sourceLocationFromNode(call, sourceFile), "target must be a string literal, an inline { name } object, or an array");
170
- }
171
- const handlerInit = obj
172
- .getProperty("handler")
173
- ?.asKind(SyntaxKind.PropertyAssignment)
174
- ?.getInitializer();
175
- if (!handlerInit) {
176
- return fail("hook", sourceLocationFromNode(call, sourceFile), "object form requires a `handler` property");
177
- }
178
- const fn = findFunctionLiteral(handlerInit);
179
- if (!fn) {
180
- return fail("hook", sourceLocationFromNode(call, sourceFile), "handler must be an inline arrow function or function expression");
181
- }
182
- const phase = readOptionalPhase(obj);
183
- const escapeHatchOutcome = readHookEscapeHatch(obj, call, sourceFile);
184
- if ("kind" in escapeHatchOutcome)
185
- return escapeHatchOutcome;
186
- return ok({
187
- kind: "hook",
188
- source: sourceLocationFromNode(call, sourceFile),
189
- hookType,
190
- target,
191
- fnBody: sourceLocationFromNode(fn, sourceFile),
192
- ...(phase !== undefined && { phase }),
193
- ...escapeHatchOutcome,
194
- });
195
- }
196
- const hookType = readNameLiteral(first);
197
- if (hookType === undefined) {
198
- return fail("hook", sourceLocationFromNode(call, sourceFile), "first argument must be a string literal hook type, or an identifier resolving to one (or use the object form)");
199
- }
200
- if (!isHookType(hookType)) {
201
- return fail("hook", sourceLocationFromNode(call, sourceFile), `hook type "${hookType}" is not one of the lifecycle types or "validation"`);
202
- }
203
- const targetArg = args[1];
204
- if (!targetArg) {
205
- return fail("hook", sourceLocationFromNode(call, sourceFile), "expected a target (NameOrRef or array) as second argument");
206
- }
207
- const target = readHookTarget(targetArg);
208
- if (!target) {
209
- return fail("hook", sourceLocationFromNode(call, sourceFile), "target must be a string literal, an inline { name } object, or an array");
210
- }
211
- const fnArg = args[2];
212
- if (!fnArg) {
213
- return fail("hook", sourceLocationFromNode(call, sourceFile), "expected a hook function as third argument");
214
- }
215
- const fn = findFunctionLiteral(fnArg);
216
- if (!fn) {
217
- return fail("hook", sourceLocationFromNode(call, sourceFile), "third argument must be an inline arrow function or function expression");
218
- }
219
- const phase = readOptionalPhase(args[3]);
220
- const escapeHatchOutcome = readHookEscapeHatch(args[3], call, sourceFile);
221
- if ("kind" in escapeHatchOutcome)
222
- return escapeHatchOutcome;
223
- return ok({
224
- kind: "hook",
225
- source: sourceLocationFromNode(call, sourceFile),
226
- hookType,
227
- target,
228
- fnBody: sourceLocationFromNode(fn, sourceFile),
229
- ...(phase !== undefined && { phase }),
230
- ...escapeHatchOutcome,
231
- });
232
- }
233
- // guard:dup-ok — intentional parallel to extractTree; different Feature-AST extractors by design
234
- export function extractAuthClaims(call, sourceFile) {
235
- const arg = call.getArguments()[0];
236
- if (!arg) {
237
- return fail("authClaims", sourceLocationFromNode(call, sourceFile), "expected a function as first argument");
238
- }
239
- const fn = findFunctionLiteral(arg);
240
- if (!fn) {
241
- return fail("authClaims", sourceLocationFromNode(call, sourceFile), "first argument must be an inline arrow function or function expression");
242
- }
243
- return ok({
244
- kind: "authClaims",
245
- source: sourceLocationFromNode(call, sourceFile),
246
- fnBody: sourceLocationFromNode(fn, sourceFile),
247
- });
248
- }
@@ -1,14 +0,0 @@
1
- export { extractAiClassify, extractAiExtract, extractAiGenerate, } from "./ai-steps.ts";
2
- export { extractDefineEvent, extractNotification, } from "./events.ts";
3
- export { extractQueryHandler, extractStreamHandler, extractWriteHandler, type ParsedHandlerCall, parseHandlerCall, } from "./handlers.ts";
4
- export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalPhase, readOptionalRateLimit, } from "./hooks.ts";
5
- export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.ts";
6
- export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.ts";
7
- export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.ts";
8
- export { extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.ts";
9
- export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.ts";
10
- export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, type NamedOptionsResult, readNamedOptions, } from "./round3.ts";
11
- export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.ts";
12
- export { extractTreeActions } from "./round6.ts";
13
- export type { ExtractOutput } from "./shared.ts";
14
- export { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, readPropertyKey, readStringLiteralArgs, readVarargsOrArrayProp, resolveSameFileObjectLiteral, } from "./shared.ts";
@@ -1,13 +0,0 @@
1
- export { extractAiClassify, extractAiExtract, extractAiGenerate, } from "./ai-steps.js";
2
- export { extractDefineEvent, extractNotification, } from "./events.js";
3
- export { extractQueryHandler, extractStreamHandler, extractWriteHandler, parseHandlerCall, } from "./handlers.js";
4
- export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalPhase, readOptionalRateLimit, } from "./hooks.js";
5
- export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.js";
6
- export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.js";
7
- export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.js";
8
- export { extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.js";
9
- export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.js";
10
- export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, readNamedOptions, } from "./round3.js";
11
- export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.js";
12
- export { extractTreeActions } from "./round6.js";
13
- export { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, readPropertyKey, readStringLiteralArgs, readVarargsOrArrayProp, resolveSameFileObjectLiteral, } from "./shared.js";
@@ -1,7 +0,0 @@
1
- import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { HttpRouteMethod } from "../../types/http-route.ts";
3
- import type { HttpRoutePattern, JobPattern } from "../patterns.ts";
4
- import { type ExtractOutput } from "./shared.ts";
5
- export declare function isHttpRouteMethod(value: string): value is HttpRouteMethod;
6
- export declare function extractJob(call: CallExpression, sourceFile: SourceFile): ExtractOutput<JobPattern>;
7
- export declare function extractHttpRoute(call: CallExpression, sourceFile: SourceFile): ExtractOutput<HttpRoutePattern>;