@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,401 +0,0 @@
1
- #!/usr/bin/env bun
2
- // migrate-db-raw — rewrites standalone bun-db helper calls that manually pass
3
- // ctx.db.raw to their TenantDb method-form equivalent (db.global(table)... /
4
- // db.selectMany|fetchOne|insertOne(...)) wherever the rewrite is provably
5
- // safe, and reports every remaining ctx.db.raw-ish access for manual review.
6
- //
7
- // Usage:
8
- // bun scripts/codemod/migrate-db-raw.ts [--dry-run] [--global-tables a,b] <path...>
9
-
10
- import { readFileSync, writeFileSync } from "node:fs";
11
- import { Node, Project, type SourceFile, SyntaxKind, VariableDeclarationKind } from "ts-morph";
12
- import { collectSourceFiles } from "./collect-source-files.ts";
13
-
14
- const DEFAULT_GLOBAL_TABLES: ReadonlySet<string> = new Set([
15
- "userTable",
16
- "globalFeatureStateTable",
17
- ]);
18
- const PRUNABLE_FN_NAMES: ReadonlySet<string> = new Set(["selectMany", "fetchOne", "insertOne"]);
19
- const OWN_TENANT_FN_NAMES: ReadonlySet<string> = new Set(["selectMany", "fetchOne", "insertOne"]);
20
- const GLOBAL_TABLE_FN_NAMES: ReadonlySet<string> = new Set(["selectMany", "fetchOne"]);
21
- const TENANT_ID_SOURCES: ReadonlySet<string> = new Set([
22
- "event.user.tenantId",
23
- "query.user.tenantId",
24
- "ctx.user.tenantId",
25
- ]);
26
- const RAW_RECEIVER_IDENTIFIERS: ReadonlySet<string> = new Set([
27
- "db",
28
- "tdb",
29
- "scopedDb",
30
- "outsideTx",
31
- ]);
32
- const MANUAL_TEXT_LIMIT = 100;
33
-
34
- export type RewriteRule = "global-table" | "own-tenant";
35
-
36
- export interface Rewrite {
37
- readonly file: string;
38
- readonly line: number;
39
- readonly rule: RewriteRule;
40
- readonly before: string;
41
- readonly after: string;
42
- }
43
-
44
- export interface ManualSite {
45
- readonly file: string;
46
- readonly line: number;
47
- readonly enclosing: string;
48
- readonly text: string;
49
- }
50
-
51
- export interface MigrateDbRawResult {
52
- readonly output: string;
53
- readonly rewrites: Rewrite[];
54
- readonly manual: ManualSite[];
55
- }
56
-
57
- function isRawOnCtxDb(argExpr: Node): boolean {
58
- return argExpr.getText() === "ctx.db.raw";
59
- }
60
-
61
- function enclosingFunctionScope(node: Node): Node {
62
- return (
63
- node.getFirstAncestor(
64
- (n) =>
65
- Node.isFunctionDeclaration(n) ||
66
- Node.isArrowFunction(n) ||
67
- Node.isFunctionExpression(n) ||
68
- Node.isMethodDeclaration(n),
69
- ) ?? node.getSourceFile()
70
- );
71
- }
72
-
73
- function isConstTenantIdBinding(scope: Node, varName: string): boolean {
74
- return scope.getDescendantsOfKind(SyntaxKind.VariableDeclaration).some((decl) => {
75
- if (decl.getName() !== varName) return false;
76
- const statement = decl.getVariableStatement();
77
- if (!statement || statement.getDeclarationKind() !== VariableDeclarationKind.Const)
78
- return false;
79
- const initializer = decl.getInitializer();
80
- return initializer !== undefined && TENANT_ID_SOURCES.has(initializer.getText());
81
- });
82
- }
83
-
84
- function isValidOwnTenantIdValue(valueNode: Node): boolean {
85
- if (TENANT_ID_SOURCES.has(valueNode.getText())) return true;
86
- if (!Node.isIdentifier(valueNode)) return false;
87
- return isConstTenantIdBinding(enclosingFunctionScope(valueNode), valueNode.getText());
88
- }
89
-
90
- function objectHasValidOwnTenantId(obj: Node): boolean {
91
- if (!Node.isObjectLiteralExpression(obj)) return false;
92
- const props = obj.getProperties();
93
- const tenantIdIndex = props.findIndex(
94
- (prop) =>
95
- (Node.isPropertyAssignment(prop) || Node.isShorthandPropertyAssignment(prop)) &&
96
- prop.getName() === "tenantId",
97
- );
98
- if (tenantIdIndex === -1) return false;
99
- // A later spread can override the literal tenantId at runtime.
100
- if (props.slice(tenantIdIndex + 1).some((prop) => Node.isSpreadAssignment(prop))) return false;
101
- const prop = props[tenantIdIndex];
102
- if (Node.isPropertyAssignment(prop)) {
103
- const init = prop.getInitializer();
104
- return init !== undefined && isValidOwnTenantIdValue(init);
105
- }
106
- if (Node.isShorthandPropertyAssignment(prop)) {
107
- return isConstTenantIdBinding(enclosingFunctionScope(prop), "tenantId");
108
- }
109
- return false;
110
- }
111
-
112
- interface PendingRewrite {
113
- readonly callExpr: Node;
114
- readonly rule: RewriteRule;
115
- readonly before: string;
116
- readonly after: string;
117
- readonly line: number;
118
- }
119
-
120
- // The caller checks `args.length` immediately before every use — the index
121
- // is always in bounds; this replaces a non-null assertion with an explicit
122
- // invariant instead of silencing the compiler.
123
- function nthArg(args: Node[], index: number): Node {
124
- const arg = args[index];
125
- if (!arg) throw new Error(`planRewrite: expected an argument at index ${index}`);
126
- return arg;
127
- }
128
-
129
- function planRewrite(
130
- callExpr: Node,
131
- globalTables: ReadonlySet<string>,
132
- ): PendingRewrite | undefined {
133
- if (!Node.isCallExpression(callExpr)) return undefined;
134
- const calleeExpr = callExpr.getExpression();
135
- if (!Node.isIdentifier(calleeExpr)) return undefined;
136
- const fnName = calleeExpr.getText();
137
- const args = callExpr.getArguments();
138
- if (args.length === 0 || !isRawOnCtxDb(nthArg(args, 0))) return undefined;
139
-
140
- const typeArgs = callExpr.getTypeArguments();
141
- const typeArgsText =
142
- typeArgs.length > 0 ? `<${typeArgs.map((t) => t.getText()).join(", ")}>` : "";
143
-
144
- if (GLOBAL_TABLE_FN_NAMES.has(fnName) && args.length >= 2) {
145
- const tableArg = nthArg(args, 1);
146
- if (Node.isIdentifier(tableArg) && globalTables.has(tableArg.getText())) {
147
- const rest = args.slice(2).map((a) => a.getText());
148
- const after = `ctx.db.global(${tableArg.getText()}).${fnName}${typeArgsText}(${rest.join(", ")})`;
149
- return {
150
- callExpr,
151
- rule: "global-table",
152
- before: callExpr.getText(),
153
- after,
154
- line: callExpr.getStartLineNumber(),
155
- };
156
- }
157
- }
158
-
159
- if (OWN_TENANT_FN_NAMES.has(fnName) && args.length >= 3) {
160
- const objArg = nthArg(args, 2);
161
- if (objectHasValidOwnTenantId(objArg)) {
162
- const rest = [nthArg(args, 1), objArg, ...args.slice(3)].map((a) => a.getText());
163
- const after = `ctx.db.${fnName}${typeArgsText}(${rest.join(", ")})`;
164
- return {
165
- callExpr,
166
- rule: "own-tenant",
167
- before: callExpr.getText(),
168
- after,
169
- line: callExpr.getStartLineNumber(),
170
- };
171
- }
172
- }
173
-
174
- return undefined;
175
- }
176
-
177
- function isTenantDbRawAccess(pae: Node): boolean {
178
- if (!Node.isPropertyAccessExpression(pae)) return false;
179
- if (pae.getName() !== "raw") return false;
180
- const receiver = pae.getExpression();
181
- if (receiver.getText().endsWith(".db")) return true;
182
- if (Node.isIdentifier(receiver) && RAW_RECEIVER_IDENTIFIERS.has(receiver.getText())) return true;
183
- if (
184
- Node.isCallExpression(receiver) &&
185
- receiver.getExpression().getText().startsWith("ctx.systemDb.")
186
- )
187
- return true;
188
- return false;
189
- }
190
-
191
- function enclosingName(node: Node): string {
192
- let current: Node | undefined = node.getParent();
193
- while (current) {
194
- if (Node.isFunctionDeclaration(current)) {
195
- const name = current.getName();
196
- if (name) return name;
197
- }
198
- if (Node.isMethodDeclaration(current)) return current.getName();
199
- if (Node.isPropertyAssignment(current)) return current.getName();
200
- if (Node.isVariableDeclaration(current)) return current.getName();
201
- current = current.getParent();
202
- }
203
- return "<module>";
204
- }
205
-
206
- function truncate(text: string, limit: number): string {
207
- const collapsed = text.replace(/\s+/g, " ").trim();
208
- return collapsed.length > limit ? `${collapsed.slice(0, limit)}…` : collapsed;
209
- }
210
-
211
- function directArgumentCall(pae: Node): Node | undefined {
212
- const parent = pae.getParent();
213
- if (parent && Node.isCallExpression(parent) && parent.getArguments().some((a) => a === pae)) {
214
- return parent;
215
- }
216
- return undefined;
217
- }
218
-
219
- function collectManualSite(pae: Node, fileName: string): ManualSite {
220
- const reportNode = directArgumentCall(pae) ?? pae;
221
- return {
222
- file: fileName,
223
- line: reportNode.getStartLineNumber(),
224
- enclosing: enclosingName(pae),
225
- text: truncate(reportNode.getText(), MANUAL_TEXT_LIMIT),
226
- };
227
- }
228
-
229
- function isPropertyAccessName(id: Node): boolean {
230
- const parent = id.getParent();
231
- return Node.isPropertyAccessExpression(parent) && parent.getNameNode() === id;
232
- }
233
-
234
- function pruneUnusedDbImports(sourceFile: SourceFile): void {
235
- for (const importDecl of sourceFile.getImportDeclarations()) {
236
- for (const spec of [...importDecl.getNamedImports()]) {
237
- if (!PRUNABLE_FN_NAMES.has(spec.getName())) continue;
238
- const localName = spec.getAliasNode()?.getText() ?? spec.getName();
239
- const nameNode = spec.getAliasNode() ?? spec.getNameNode();
240
- const stillUsed = sourceFile
241
- .getDescendantsOfKind(SyntaxKind.Identifier)
242
- .some((id) => id !== nameNode && id.getText() === localName && !isPropertyAccessName(id));
243
- if (!stillUsed) spec.remove();
244
- }
245
- if (
246
- importDecl.getNamedImports().length === 0 &&
247
- !importDecl.getDefaultImport() &&
248
- !importDecl.getNamespaceImport()
249
- ) {
250
- importDecl.remove();
251
- }
252
- }
253
- }
254
-
255
- export function migrateDbRawSource(
256
- source: string,
257
- fileName: string,
258
- opts: { globalTables: ReadonlySet<string> },
259
- ): MigrateDbRawResult {
260
- const project = new Project({ useInMemoryFileSystem: true, skipFileDependencyResolution: true });
261
- const sourceFile = project.createSourceFile(fileName, source);
262
-
263
- const pending: PendingRewrite[] = [];
264
- for (const callExpr of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
265
- const plan = planRewrite(callExpr, opts.globalTables);
266
- if (plan) pending.push(plan);
267
- }
268
-
269
- const rewrites: Rewrite[] = [];
270
- for (const plan of pending) {
271
- if (plan.callExpr.wasForgotten()) continue;
272
- plan.callExpr.replaceWithText(plan.after);
273
- rewrites.push({
274
- file: fileName,
275
- line: plan.line,
276
- rule: plan.rule,
277
- before: plan.before,
278
- after: plan.after,
279
- });
280
- }
281
-
282
- pruneUnusedDbImports(sourceFile);
283
-
284
- const manual: ManualSite[] = [];
285
- for (const pae of sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)) {
286
- if (isTenantDbRawAccess(pae)) manual.push(collectManualSite(pae, fileName));
287
- }
288
-
289
- return { output: sourceFile.getFullText(), rewrites, manual };
290
- }
291
-
292
- class CliError extends Error {}
293
-
294
- interface CliOptions {
295
- readonly dryRun: boolean;
296
- readonly globalTables: ReadonlySet<string>;
297
- readonly paths: string[];
298
- }
299
-
300
- function parseArgs(argv: string[]): CliOptions {
301
- let dryRun = false;
302
- let globalTables: ReadonlySet<string> = DEFAULT_GLOBAL_TABLES;
303
- const paths: string[] = [];
304
-
305
- for (let i = 0; i < argv.length; i++) {
306
- const arg = argv[i];
307
- if (!arg) break;
308
- if (arg === "--dry-run") {
309
- dryRun = true;
310
- continue;
311
- }
312
- if (arg === "--global-tables") {
313
- const value = argv[++i];
314
- if (!value) throw new CliError("--global-tables requires a comma-separated value");
315
- globalTables = new Set(
316
- value
317
- .split(",")
318
- .map((s) => s.trim())
319
- .filter((s) => s.length > 0),
320
- );
321
- continue;
322
- }
323
- if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
324
- paths.push(arg);
325
- }
326
-
327
- if (paths.length === 0) throw new CliError("at least one path is required");
328
- return { dryRun, globalTables, paths };
329
- }
330
-
331
- function isMigratableFile(name: string): boolean {
332
- if (!/\.(ts|tsx)$/.test(name)) return false;
333
- if (name.endsWith(".test.ts") || name.endsWith(".test.tsx")) return false;
334
- return true;
335
- }
336
-
337
- function collectFiles(paths: string[]): string[] {
338
- return collectSourceFiles(paths, {
339
- isMigratableFile,
340
- extraSkippedDirNames: ["__tests__"],
341
- });
342
- }
343
-
344
- async function main(): Promise<void> {
345
- let options: CliOptions;
346
- try {
347
- options = parseArgs(process.argv.slice(2));
348
- } catch (err) {
349
- if (err instanceof CliError) {
350
- console.error(`[migrate-db-raw] ${err.message}`);
351
- process.exit(2);
352
- }
353
- throw err;
354
- }
355
-
356
- const files = collectFiles(options.paths);
357
- const allRewrites: Rewrite[] = [];
358
- const allManual: ManualSite[] = [];
359
- let filesChanged = 0;
360
-
361
- for (const file of files) {
362
- const before = readFileSync(file, "utf8");
363
- const result = migrateDbRawSource(before, file, { globalTables: options.globalTables });
364
- allRewrites.push(...result.rewrites);
365
- allManual.push(...result.manual);
366
-
367
- if (result.rewrites.length === 0) continue;
368
- filesChanged += 1;
369
-
370
- if (options.dryRun) {
371
- console.log(`\n=== ${file} (${result.rewrites.length} rewrite(s)) ===`);
372
- for (const r of result.rewrites) {
373
- console.log(`${file}:${r.line} [${r.rule}]`);
374
- console.log(`- ${r.before}`);
375
- console.log(`+ ${r.after}`);
376
- }
377
- } else {
378
- writeFileSync(file, result.output);
379
- }
380
- }
381
-
382
- const globalCount = allRewrites.filter((r) => r.rule === "global-table").length;
383
- const ownTenantCount = allRewrites.filter((r) => r.rule === "own-tenant").length;
384
- console.log(
385
- `\n[migrate-db-raw] ${options.dryRun ? "would change" : "changed"} ${filesChanged} file(s); ` +
386
- `rewrites: global-table=${globalCount}, own-tenant=${ownTenantCount}`,
387
- );
388
-
389
- if (allManual.length > 0) {
390
- console.log(`\n[migrate-db-raw] manual review needed (${allManual.length}):`);
391
- for (const m of allManual) {
392
- console.log(`${m.file}:${m.line} ${m.enclosing} ${m.text}`);
393
- }
394
- }
395
-
396
- process.exit(0);
397
- }
398
-
399
- if (import.meta.main) {
400
- await main();
401
- }
@@ -1,235 +0,0 @@
1
- #!/usr/bin/env bun
2
- // migrate-open-to-all — rewrites deprecated `openToAll: true` to the required
3
- // `{ reason }` form in test files, and reports every remaining non-test site
4
- // for a human to pick a reason.
5
- //
6
- // Usage:
7
- // bun scripts/codemod/migrate-open-to-all.ts [--dry-run] [--test-reason "<text>"] <path...>
8
-
9
- import { readFileSync, writeFileSync } from "node:fs";
10
- import {
11
- Node,
12
- type ObjectLiteralExpression,
13
- Project,
14
- type PropertyAssignment,
15
- SyntaxKind,
16
- } from "ts-morph";
17
- import { collectSourceFiles } from "./collect-source-files.ts";
18
-
19
- const DEFAULT_TEST_REASON = "test handler callable by any signed-in test user";
20
-
21
- export interface Rewrite {
22
- readonly file: string;
23
- readonly line: number;
24
- readonly before: string;
25
- readonly after: string;
26
- }
27
-
28
- export interface ManualSite {
29
- readonly file: string;
30
- readonly line: number;
31
- readonly handlerName?: string;
32
- readonly description?: string;
33
- }
34
-
35
- export interface MigrateOpenToAllResult {
36
- readonly output: string;
37
- readonly rewrites: Rewrite[];
38
- readonly manual: ManualSite[];
39
- }
40
-
41
- export interface MigrateOpenToAllOptions {
42
- readonly testReason: string;
43
- }
44
-
45
- function isTestFile(fileName: string): boolean {
46
- return /(^|\/)__tests__\//.test(fileName) || /\.test\.(ts|tsx)$/.test(fileName);
47
- }
48
-
49
- function isOpenToAllTrueAssignment(node: Node): node is PropertyAssignment {
50
- if (!Node.isPropertyAssignment(node)) return false;
51
- if (node.getName() !== "openToAll") return false;
52
- return node.getInitializer()?.getKind() === SyntaxKind.TrueKeyword;
53
- }
54
-
55
- function readStringLiteralProperty(obj: ObjectLiteralExpression, name: string): string | undefined {
56
- const prop = obj.getProperty(name);
57
- if (!prop || !Node.isPropertyAssignment(prop)) return undefined;
58
- const init = prop.getInitializer();
59
- return init && Node.isStringLiteral(init) ? init.getLiteralValue() : undefined;
60
- }
61
-
62
- function enclosingObjectLiterals(node: Node): ObjectLiteralExpression[] {
63
- const result: ObjectLiteralExpression[] = [];
64
- let current: Node | undefined = node.getParent();
65
- while (current) {
66
- if (Node.isObjectLiteralExpression(current)) result.push(current);
67
- current = current.getParent();
68
- }
69
- return result;
70
- }
71
-
72
- // Best-effort human-triage hint (not the rewrite's source of truth): derive a handler name/description from the enclosing object literal, or the enclosing call's first string-literal argument for the positional form.
73
- function deriveHandlerContext(assignment: PropertyAssignment): {
74
- readonly handlerName?: string;
75
- readonly description?: string;
76
- } {
77
- let handlerName: string | undefined;
78
- let description: string | undefined;
79
- for (const obj of enclosingObjectLiterals(assignment)) {
80
- if (handlerName === undefined) handlerName = readStringLiteralProperty(obj, "name");
81
- if (description === undefined) description = readStringLiteralProperty(obj, "description");
82
- if (handlerName !== undefined && description !== undefined) break;
83
- }
84
- if (handlerName === undefined) {
85
- const call = assignment.getFirstAncestorByKind(SyntaxKind.CallExpression);
86
- const firstArg = call?.getArguments()[0];
87
- if (firstArg && Node.isStringLiteral(firstArg)) handlerName = firstArg.getLiteralValue();
88
- }
89
- return {
90
- ...(handlerName !== undefined && { handlerName }),
91
- ...(description !== undefined && { description }),
92
- };
93
- }
94
-
95
- export function migrateOpenToAllSource(
96
- source: string,
97
- fileName: string,
98
- opts: MigrateOpenToAllOptions,
99
- ): MigrateOpenToAllResult {
100
- const project = new Project({ useInMemoryFileSystem: true, skipFileDependencyResolution: true });
101
- const sourceFile = project.createSourceFile(fileName, source);
102
- const testFile = isTestFile(fileName);
103
-
104
- const targets = sourceFile
105
- .getDescendantsOfKind(SyntaxKind.PropertyAssignment)
106
- .filter(isOpenToAllTrueAssignment);
107
-
108
- const rewrites: Rewrite[] = [];
109
- const manual: ManualSite[] = [];
110
-
111
- for (const assignment of targets) {
112
- if (assignment.wasForgotten()) continue;
113
- const line = assignment.getStartLineNumber();
114
-
115
- if (testFile) {
116
- const before = assignment.getText();
117
- const after = `openToAll: { reason: ${JSON.stringify(opts.testReason)} }`;
118
- assignment.replaceWithText(after);
119
- rewrites.push({ file: fileName, line, before, after });
120
- continue;
121
- }
122
-
123
- manual.push({ file: fileName, line, ...deriveHandlerContext(assignment) });
124
- }
125
-
126
- return { output: sourceFile.getFullText(), rewrites, manual };
127
- }
128
-
129
- class CliError extends Error {}
130
-
131
- interface CliOptions {
132
- readonly dryRun: boolean;
133
- readonly testReason: string;
134
- readonly paths: string[];
135
- }
136
-
137
- function parseArgs(argv: string[]): CliOptions {
138
- let dryRun = false;
139
- let testReason = DEFAULT_TEST_REASON;
140
- const paths: string[] = [];
141
-
142
- for (let i = 0; i < argv.length; i++) {
143
- const arg = argv[i];
144
- if (!arg) break;
145
- if (arg === "--dry-run") {
146
- dryRun = true;
147
- continue;
148
- }
149
- if (arg === "--test-reason") {
150
- const value = argv[++i];
151
- if (!value) throw new CliError("--test-reason requires a value");
152
- testReason = value;
153
- continue;
154
- }
155
- if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
156
- paths.push(arg);
157
- }
158
-
159
- if (paths.length === 0) throw new CliError("at least one path is required");
160
- return { dryRun, testReason, paths };
161
- }
162
-
163
- function isMigratableFile(name: string): boolean {
164
- return /\.(ts|tsx)$/.test(name);
165
- }
166
-
167
- export function collectFiles(paths: string[]): string[] {
168
- return collectSourceFiles(paths, { isMigratableFile });
169
- }
170
-
171
- // Remaining manual sites still fail boot validation, so upgrade-cli must not
172
- // treat this run as a completed migration.
173
- export function exitCodeForManualSites(manualCount: number): 0 | 1 {
174
- return manualCount > 0 ? 1 : 0;
175
- }
176
-
177
- async function main(): Promise<void> {
178
- let options: CliOptions;
179
- try {
180
- options = parseArgs(process.argv.slice(2));
181
- } catch (err) {
182
- if (err instanceof CliError) {
183
- console.error(`[migrate-open-to-all] ${err.message}`);
184
- process.exit(2);
185
- }
186
- throw err;
187
- }
188
-
189
- const files = collectFiles(options.paths);
190
- const allManual: ManualSite[] = [];
191
- let filesChanged = 0;
192
- let totalRewrites = 0;
193
-
194
- for (const file of files) {
195
- const before = readFileSync(file, "utf8");
196
- if (!before.includes("openToAll")) continue;
197
- const result = migrateOpenToAllSource(before, file, { testReason: options.testReason });
198
- allManual.push(...result.manual);
199
-
200
- if (result.rewrites.length === 0) continue;
201
- filesChanged += 1;
202
- totalRewrites += result.rewrites.length;
203
-
204
- if (options.dryRun) {
205
- console.log(`\n=== ${file} (${result.rewrites.length} rewrite(s)) ===`);
206
- for (const r of result.rewrites) {
207
- console.log(`${file}:${r.line}`);
208
- console.log(`- ${r.before}`);
209
- console.log(`+ ${r.after}`);
210
- }
211
- } else {
212
- writeFileSync(file, result.output);
213
- }
214
- }
215
-
216
- console.log(
217
- `\n[migrate-open-to-all] ${options.dryRun ? "would change" : "changed"} ${filesChanged} file(s); ` +
218
- `rewrites: ${totalRewrites}`,
219
- );
220
-
221
- if (allManual.length > 0) {
222
- console.log(`\n[migrate-open-to-all] manual review needed (${allManual.length}):`);
223
- for (const m of allManual) {
224
- console.log(
225
- `${m.file}:${m.line} ${m.handlerName ?? "<unknown>"} ${m.description ?? "<no description>"}`,
226
- );
227
- }
228
- }
229
-
230
- process.exit(exitCodeForManualSites(allManual.length));
231
- }
232
-
233
- if (import.meta.main) {
234
- await main();
235
- }