@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1

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 (617) hide show
  1. package/AGENTS.md +9 -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/inbound-mail-triage.md +1 -0
  13. package/agents/examples/lane-routing.md +2 -1
  14. package/agents/examples/legal-pages.md +2 -2
  15. package/agents/examples/lifecycle-hooks.md +3 -3
  16. package/agents/examples/managed-config.md +4 -4
  17. package/agents/examples/managed-pages.md +1 -1
  18. package/agents/examples/relations.md +19 -4
  19. package/agents/examples/search.md +4 -4
  20. package/agents/examples/secrets-demo.md +9 -6
  21. package/agents/examples/state-machine.md +2 -2
  22. package/agents/examples/tenant-settings.md +1 -1
  23. package/agents/examples/user-data-rights.md +3 -6
  24. package/agents/examples/workflow-engine.md +53 -47
  25. package/agents/examples.md +4 -4
  26. package/agents/features.md +1 -1
  27. package/dist/api/auth-middleware.js +1 -1
  28. package/dist/api/auth-routes-invite.js +2 -1
  29. package/dist/api/entity-read-access.d.ts +3 -1
  30. package/dist/api/export/export-columns.d.ts +3 -1
  31. package/dist/api/export/export-route.js +3 -2
  32. package/dist/api/export/export-screen.d.ts +2 -1
  33. package/dist/api/extra-route.d.ts +3 -1
  34. package/dist/api/index.d.ts +23 -27
  35. package/dist/api/index.js +13 -15
  36. package/dist/api/jwt.js +1 -1
  37. package/dist/api/observability-middleware.d.ts +1 -1
  38. package/dist/api/observability-middleware.js +2 -1
  39. package/dist/api/request-context-internals.d.ts +31 -0
  40. package/dist/api/request-context-internals.js +11 -0
  41. package/dist/api/request-context-scopes.d.ts +14 -0
  42. package/dist/api/request-context-scopes.js +69 -0
  43. package/dist/api/request-context.d.ts +1 -40
  44. package/dist/api/request-context.js +22 -51
  45. package/dist/api/request-id-middleware.d.ts +1 -1
  46. package/dist/api/route-registrars.d.ts +2 -1
  47. package/dist/api/route-registrars.js +1 -1
  48. package/dist/api/routes.js +7 -3
  49. package/dist/api/server-boot-checks.d.ts +1 -1
  50. package/dist/api/server-boot-checks.js +2 -2
  51. package/dist/api/server-event-dispatcher.d.ts +6 -1
  52. package/dist/api/server-event-dispatcher.js +3 -4
  53. package/dist/api/server-extra-routes.d.ts +1 -1
  54. package/dist/api/server-extra-routes.js +2 -1
  55. package/dist/api/server-middleware.js +3 -1
  56. package/dist/api/server-routes.d.ts +2 -1
  57. package/dist/api/server-wiring.js +6 -4
  58. package/dist/api/server.d.ts +2 -1
  59. package/dist/api/sse-route.d.ts +2 -1
  60. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  61. package/dist/api/tenant-scoped-secrets.js +13 -0
  62. package/dist/api/websocket-route.d.ts +1 -1
  63. package/dist/auth/index.d.ts +0 -1
  64. package/dist/auth/roles.d.ts +0 -5
  65. package/dist/compliance/duration-spec.d.ts +0 -1
  66. package/dist/compliance/duration-spec.js +0 -5
  67. package/dist/compliance/index.d.ts +4 -4
  68. package/dist/compliance/index.js +2 -2
  69. package/dist/compliance/profiles.d.ts +0 -15
  70. package/dist/compliance/profiles.js +0 -23
  71. package/dist/config/index.d.ts +10 -10
  72. package/dist/config/index.js +13 -1
  73. package/dist/config/internals.d.ts +9 -0
  74. package/dist/config/internals.js +1 -0
  75. package/dist/consumer-cli-internals.d.ts +4 -0
  76. package/dist/consumer-cli-internals.js +1 -0
  77. package/dist/consumer-cli.d.ts +1 -4
  78. package/dist/consumer-cli.js +5 -1
  79. package/dist/crypto/event-pii.js +1 -1
  80. package/dist/crypto/index.d.ts +8 -9
  81. package/dist/crypto/index.js +7 -8
  82. package/dist/crypto/pg-kms-adapter.js +6 -1
  83. package/dist/db/apply-entity-event.d.ts +1 -1
  84. package/dist/db/apply-entity-event.js +15 -47
  85. package/dist/db/blind-index-cleanup.js +91 -77
  86. package/dist/db/collect-table-metas.js +1 -1
  87. package/dist/db/compound-types.d.ts +1 -1
  88. package/dist/db/compound-types.js +0 -7
  89. package/dist/db/config-seed.d.ts +2 -1
  90. package/dist/db/config-seed.js +6 -1
  91. package/dist/db/connection.d.ts +3 -1
  92. package/dist/db/connection.js +15 -5
  93. package/dist/db/cross-tenant-reads.d.ts +1 -1
  94. package/dist/db/cross-tenant-reads.js +1 -1
  95. package/dist/db/dialect.d.ts +0 -5
  96. package/dist/db/dialect.js +0 -3
  97. package/dist/db/driver-value-preparation.js +23 -2
  98. package/dist/db/eagerload.d.ts +2 -1
  99. package/dist/db/entity-field-encryption.d.ts +1 -1
  100. package/dist/db/entity-table-meta.d.ts +1 -1
  101. package/dist/db/event-store-executor-context.d.ts +3 -1
  102. package/dist/db/event-store-executor-context.js +4 -3
  103. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  104. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  106. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  107. package/dist/db/event-store-executor-read.js +2 -2
  108. package/dist/db/event-store-executor-write-atomic.js +8 -7
  109. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  110. package/dist/db/event-store-executor-write.js +7 -4
  111. package/dist/db/event-store-executor.d.ts +1 -1
  112. package/dist/db/executor-managed-tables.d.ts +7 -1
  113. package/dist/db/executor-managed-tables.js +11 -2
  114. package/dist/db/index.d.ts +29 -28
  115. package/dist/db/index.js +22 -20
  116. package/dist/db/known-table-names.d.ts +6 -0
  117. package/dist/db/known-table-names.js +21 -0
  118. package/dist/db/list-aggregate-labels.d.ts +1 -1
  119. package/dist/db/located-timestamp.d.ts +1 -1
  120. package/dist/db/located-timestamp.js +0 -5
  121. package/dist/db/migrate-generator.d.ts +17 -1
  122. package/dist/db/migrate-generator.js +50 -20
  123. package/dist/db/migrate-primary-key.d.ts +12 -0
  124. package/dist/db/migrate-primary-key.js +45 -0
  125. package/dist/db/migrate-rls-diff.d.ts +20 -0
  126. package/dist/db/migrate-rls-diff.js +61 -0
  127. package/dist/db/migrate-runner.js +4 -0
  128. package/dist/db/money.d.ts +1 -1
  129. package/dist/db/money.js +1 -1
  130. package/dist/db/parent-ref-clause.d.ts +2 -1
  131. package/dist/db/pg-error.d.ts +2 -0
  132. package/dist/db/pg-error.js +11 -0
  133. package/dist/db/queries/ddl.d.ts +3 -0
  134. package/dist/db/queries/ddl.js +34 -1
  135. package/dist/db/queries/event-store.js +4 -2
  136. package/dist/db/queries/event-tenants.d.ts +2 -0
  137. package/dist/db/queries/event-tenants.js +17 -0
  138. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  139. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  140. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  141. package/dist/db/queries/rls-boot-catalog.js +39 -0
  142. package/dist/db/queries/rls-catalog.d.ts +6 -0
  143. package/dist/db/queries/rls-catalog.js +82 -0
  144. package/dist/db/queries/rls-scope.d.ts +3 -0
  145. package/dist/db/queries/rls-scope.js +17 -0
  146. package/dist/db/queries/rls-shape.d.ts +10 -0
  147. package/dist/db/queries/rls-shape.js +42 -0
  148. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  149. package/dist/db/queries/session-advisory-lock.js +23 -0
  150. package/dist/db/queries/shadow-swap.d.ts +1 -2
  151. package/dist/db/queries/shadow-swap.js +9 -25
  152. package/dist/db/queries/test-stack.d.ts +4 -1
  153. package/dist/db/queries/test-stack.js +84 -2
  154. package/dist/db/query.js +11 -7
  155. package/dist/db/reference-data.d.ts +1 -1
  156. package/dist/db/reference-data.js +6 -1
  157. package/dist/db/render-ddl.d.ts +6 -2
  158. package/dist/db/render-ddl.js +7 -7
  159. package/dist/db/render-rls-ddl.d.ts +35 -0
  160. package/dist/db/render-rls-ddl.js +127 -0
  161. package/dist/db/replay-migration-sql.d.ts +3 -1
  162. package/dist/db/replay-migration-sql.js +22 -5
  163. package/dist/db/replay-rls.d.ts +25 -0
  164. package/dist/db/replay-rls.js +156 -0
  165. package/dist/db/row-level-security-boot-check.d.ts +6 -0
  166. package/dist/db/row-level-security-boot-check.js +86 -0
  167. package/dist/db/row-level-security-connection.d.ts +3 -0
  168. package/dist/db/row-level-security-connection.js +213 -0
  169. package/dist/db/row-level-security-scope.d.ts +33 -0
  170. package/dist/db/row-level-security-scope.js +127 -0
  171. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  172. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  173. package/dist/db/sql-identifier.d.ts +1 -0
  174. package/dist/db/sql-identifier.js +3 -0
  175. package/dist/db/table-builder.d.ts +2 -1
  176. package/dist/db/table-builder.js +1 -1
  177. package/dist/db/table-info.js +1 -1
  178. package/dist/db/table-push.d.ts +11 -2
  179. package/dist/db/table-push.js +15 -2
  180. package/dist/db/tenant-db-runner.d.ts +3 -1
  181. package/dist/db/tenant-db-runner.js +4 -3
  182. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  183. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  184. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  185. package/dist/db/tenant-db-statement-runner.js +48 -0
  186. package/dist/db/tenant-db.d.ts +17 -12
  187. package/dist/db/tenant-db.js +49 -120
  188. package/dist/db/tenant-id-filter.d.ts +3 -0
  189. package/dist/db/tenant-id-filter.js +30 -0
  190. package/dist/db/transaction-serialization.d.ts +6 -0
  191. package/dist/db/transaction-serialization.js +60 -0
  192. package/dist/derivatives/delete-stored-file.js +1 -1
  193. package/dist/derivatives/index.d.ts +2 -5
  194. package/dist/derivatives/index.js +2 -3
  195. package/dist/engine/access.d.ts +2 -1
  196. package/dist/engine/access.js +1 -1
  197. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  198. package/dist/engine/boot-validator/entity-handler.js +1 -1
  199. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  201. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  202. package/dist/engine/boot-validator/nav.d.ts +3 -1
  203. package/dist/engine/boot-validator/nav.js +1 -1
  204. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  205. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  206. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  207. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  209. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  210. package/dist/engine/boot-validator/screens.d.ts +2 -1
  211. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  212. package/dist/engine/bridge-stub.d.ts +5 -2
  213. package/dist/engine/bridge-stub.js +39 -24
  214. package/dist/engine/config-helpers.d.ts +2 -2
  215. package/dist/engine/config-helpers.js +0 -9
  216. package/dist/engine/constants.d.ts +0 -10
  217. package/dist/engine/constants.js +0 -8
  218. package/dist/engine/create-app.js +1 -1
  219. package/dist/engine/define-feature.d.ts +2 -1
  220. package/dist/engine/define-feature.js +1 -2
  221. package/dist/engine/define-handler.d.ts +1 -1
  222. package/dist/engine/define-step.d.ts +0 -1
  223. package/dist/engine/define-step.js +0 -3
  224. package/dist/engine/embedded-derived.d.ts +1 -1
  225. package/dist/engine/entity-handlers.d.ts +2 -1
  226. package/dist/engine/entity-handlers.js +7 -7
  227. package/dist/engine/entity-list-runtime-options.js +3 -1
  228. package/dist/engine/entity-list-searchability.d.ts +2 -1
  229. package/dist/engine/event-def.d.ts +2 -1
  230. package/dist/engine/event-helpers.d.ts +3 -1
  231. package/dist/engine/event-helpers.js +3 -3
  232. package/dist/engine/extension-names.d.ts +2 -8
  233. package/dist/engine/extension-names.js +2 -2
  234. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  235. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  236. package/dist/engine/extensions/user-data.d.ts +0 -8
  237. package/dist/engine/factories.d.ts +2 -1
  238. package/dist/engine/feature-builder-state.d.ts +8 -1
  239. package/dist/engine/feature-changelog.d.ts +1 -1
  240. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  241. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  242. package/dist/engine/feature-manifest.js +1 -1
  243. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  244. package/dist/engine/feature-ui-extensions.js +6 -4
  245. package/dist/engine/field-access.d.ts +2 -1
  246. package/dist/engine/handler-field-references.d.ts +0 -4
  247. package/dist/engine/index.d.ts +57 -54
  248. package/dist/engine/index.js +22 -27
  249. package/dist/engine/instruction-fields.d.ts +1 -1
  250. package/dist/engine/personal-data-fields.d.ts +1 -1
  251. package/dist/engine/qualified-name.d.ts +0 -1
  252. package/dist/engine/read-claim.d.ts +2 -1
  253. package/dist/engine/registry-facade.js +0 -3
  254. package/dist/engine/registry-ingest.d.ts +2 -1
  255. package/dist/engine/registry-ingest.js +1 -2
  256. package/dist/engine/registry-state.d.ts +12 -2
  257. package/dist/engine/registry-state.js +2 -3
  258. package/dist/engine/registry-validate.d.ts +3 -1
  259. package/dist/engine/registry-validate.js +7 -7
  260. package/dist/engine/run-in.d.ts +1 -1
  261. package/dist/engine/run-in.js +0 -1
  262. package/dist/engine/schema-builder.d.ts +1 -1
  263. package/dist/engine/schema-builder.js +1 -1
  264. package/dist/engine/screen-filter-ops.d.ts +2 -1
  265. package/dist/engine/screen-filter-ops.js +0 -5
  266. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  267. package/dist/engine/soft-delete-cleanup.js +4 -4
  268. package/dist/engine/state-machine.js +2 -1
  269. package/dist/engine/steps/_read-source.js +1 -1
  270. package/dist/engine/steps/aggregate-append-event.js +2 -2
  271. package/dist/engine/steps/call-feature.js +2 -2
  272. package/dist/engine/steps/mail-send.js +1 -1
  273. package/dist/engine/steps/retry.js +1 -1
  274. package/dist/engine/steps/wait-for-event.js +1 -1
  275. package/dist/engine/steps/wait.js +1 -1
  276. package/dist/engine/steps/webhook-send.js +1 -1
  277. package/dist/engine/template-variables.d.ts +2 -1
  278. package/dist/engine/transfer-adjacency.d.ts +1 -1
  279. package/dist/engine/types/index.d.ts +8 -31
  280. package/dist/engine/types/index.js +2 -10
  281. package/dist/engine/validation.d.ts +2 -1
  282. package/dist/entrypoint/index.d.ts +7 -35
  283. package/dist/entrypoint/index.js +7 -1
  284. package/dist/entrypoint/internals.d.ts +40 -0
  285. package/dist/entrypoint/internals.js +1 -0
  286. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  287. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  288. package/dist/env/dry-run-internals.d.ts +10 -0
  289. package/dist/env/dry-run-internals.js +1 -0
  290. package/dist/env/dry-run.d.ts +1 -10
  291. package/dist/env/dry-run.js +2 -1
  292. package/dist/env/index.d.ts +1 -85
  293. package/dist/env/index.js +6 -50
  294. package/dist/env/internals.d.ts +87 -0
  295. package/dist/env/internals.js +53 -0
  296. package/dist/errors/classes.js +2 -2
  297. package/dist/errors/index.d.ts +5 -14
  298. package/dist/errors/index.js +4 -9
  299. package/dist/errors/member-resolution.js +1 -1
  300. package/dist/errors/reasons.d.ts +0 -1
  301. package/dist/errors/reasons.js +7 -7
  302. package/dist/errors/serialize.d.ts +0 -18
  303. package/dist/errors/serialize.js +0 -27
  304. package/dist/es-ops/index.d.ts +4 -4
  305. package/dist/es-ops/index.js +2 -2
  306. package/dist/es-ops/operations-schema.d.ts +1 -1
  307. package/dist/es-ops/types.d.ts +4 -5
  308. package/dist/event-store/admin-api-internals.d.ts +14 -0
  309. package/dist/event-store/admin-api-internals.js +1 -0
  310. package/dist/event-store/admin-api.d.ts +1 -14
  311. package/dist/event-store/admin-api.js +11 -6
  312. package/dist/event-store/archive.js +4 -2
  313. package/dist/event-store/errors.js +2 -2
  314. package/dist/event-store/event-store.js +41 -34
  315. package/dist/event-store/events-schema.js +4 -1
  316. package/dist/event-store/index.d.ts +11 -13
  317. package/dist/event-store/index.js +7 -9
  318. package/dist/event-store/rebuild-dead-letter.js +4 -2
  319. package/dist/event-store/snapshot.js +4 -3
  320. package/dist/event-store/stream-scope.d.ts +2 -0
  321. package/dist/event-store/stream-scope.js +6 -0
  322. package/dist/event-store/upcaster-dead-letter.js +4 -2
  323. package/dist/event-store/upcaster.d.ts +2 -1
  324. package/dist/files/action-form-upload.d.ts +2 -1
  325. package/dist/files/action-form-upload.js +1 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  327. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  328. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  329. package/dist/files/bind-pending-file-refs.js +2 -1
  330. package/dist/files/bind-referenced-files.write.js +1 -1
  331. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  332. package/dist/files/create-file-ref-from-bytes.js +3 -3
  333. package/dist/files/create-file-ref.d.ts +3 -2
  334. package/dist/files/create-file-ref.js +2 -2
  335. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  336. package/dist/files/dispose-removed-file-refs.js +1 -1
  337. package/dist/files/feature.js +2 -2
  338. package/dist/files/file-handle.js +1 -1
  339. package/dist/files/file-routes.d.ts +1 -1
  340. package/dist/files/file-routes.js +12 -2
  341. package/dist/files/index.d.ts +11 -13
  342. package/dist/files/index.js +5 -7
  343. package/dist/files/load-save-file-refs.d.ts +2 -1
  344. package/dist/files/load-save-file-refs.js +1 -1
  345. package/dist/files/provider-resolver.d.ts +5 -4
  346. package/dist/files/provider-resolver.js +4 -4
  347. package/dist/files/storage-tracking.js +4 -2
  348. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  349. package/dist/files/sweep-orphaned-uploads.js +1 -1
  350. package/dist/i18n/index.d.ts +2 -8
  351. package/dist/i18n/index.js +1 -1
  352. package/dist/i18n/internals.d.ts +7 -0
  353. package/dist/i18n/internals.js +1 -0
  354. package/dist/i18n/required-surface-keys.d.ts +4 -1
  355. package/dist/internal/row-level-security.d.ts +3 -0
  356. package/dist/internal/row-level-security.js +3 -0
  357. package/dist/internal/stack-support.d.ts +1 -1
  358. package/dist/internal/stack-support.js +1 -1
  359. package/dist/internal/testing.d.ts +1 -0
  360. package/dist/internal/testing.js +9 -5
  361. package/dist/jobs/index.d.ts +1 -1
  362. package/dist/jobs/job-append-event.d.ts +12 -0
  363. package/dist/jobs/job-append-event.js +30 -0
  364. package/dist/jobs/job-runner-context.d.ts +2 -2
  365. package/dist/jobs/job-runner-context.js +46 -16
  366. package/dist/jobs/job-runner-execution.d.ts +1 -1
  367. package/dist/jobs/job-runner-execution.js +6 -4
  368. package/dist/jobs/job-runner-gates.d.ts +1 -1
  369. package/dist/jobs/job-runner-gates.js +0 -1
  370. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  371. package/dist/jobs/job-runner-helpers.js +10 -1
  372. package/dist/jobs/job-runner-scope.d.ts +5 -2
  373. package/dist/jobs/job-runner-types.d.ts +2 -1
  374. package/dist/jobs/job-runner.js +19 -6
  375. package/dist/jobs/max-per-tenant.d.ts +1 -1
  376. package/dist/logging/index.d.ts +1 -2
  377. package/dist/logging/index.js +1 -1
  378. package/dist/logging/pino-logger.js +1 -1
  379. package/dist/logging/utils.d.ts +1 -0
  380. package/dist/logging/utils.js +6 -0
  381. package/dist/migrations/index.d.ts +3 -3
  382. package/dist/migrations/index.js +3 -3
  383. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  384. package/dist/migrations/pending-rebuilds.js +1 -1
  385. package/dist/migrations/pii-event-backfill.js +4 -1
  386. package/dist/observability/escape-hatch-report.d.ts +2 -1
  387. package/dist/observability/index.d.ts +7 -15
  388. package/dist/observability/index.js +4 -12
  389. package/dist/observability/metric-validator.js +1 -1
  390. package/dist/observability/metrics-handle.d.ts +0 -1
  391. package/dist/observability/metrics-handle.js +2 -15
  392. package/dist/observability/recording-tracer.d.ts +1 -2
  393. package/dist/observability/recording-tracer.js +0 -6
  394. package/dist/observability/sensitive-filter.d.ts +0 -2
  395. package/dist/observability/sensitive-filter.js +0 -29
  396. package/dist/pipeline/active-membership.d.ts +2 -1
  397. package/dist/pipeline/active-membership.js +6 -2
  398. package/dist/pipeline/append-event-core.d.ts +2 -1
  399. package/dist/pipeline/append-event-core.js +2 -2
  400. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  401. package/dist/pipeline/attach-outside-transaction.js +13 -0
  402. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.d.ts +2 -1
  404. package/dist/pipeline/cascade-handler.js +3 -2
  405. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  406. package/dist/pipeline/config-accessor-factory.js +1 -1
  407. package/dist/pipeline/context-services.d.ts +56 -0
  408. package/dist/pipeline/context-services.js +73 -0
  409. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  410. package/dist/pipeline/dispatch-batch.js +31 -18
  411. package/dist/pipeline/dispatch-query.js +5 -4
  412. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  413. package/dist/pipeline/dispatch-scope.js +27 -0
  414. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  415. package/dist/pipeline/dispatch-shared.js +75 -198
  416. package/dist/pipeline/dispatch-stream.js +8 -4
  417. package/dist/pipeline/dispatch-write.d.ts +2 -1
  418. package/dist/pipeline/dispatch-write.js +10 -8
  419. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  420. package/dist/pipeline/dispatcher-utils.js +8 -2
  421. package/dist/pipeline/dispatcher.d.ts +3 -2
  422. package/dist/pipeline/dispatcher.js +4 -3
  423. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  424. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  425. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  426. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  427. package/dist/pipeline/event-dispatcher.js +7 -3
  428. package/dist/pipeline/event-retention.js +59 -56
  429. package/dist/pipeline/handler-access-error.js +2 -1
  430. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  431. package/dist/pipeline/handler-context-auth.js +7 -4
  432. package/dist/pipeline/handler-context-config.d.ts +2 -5
  433. package/dist/pipeline/handler-context-config.js +2 -2
  434. package/dist/pipeline/handler-context-db.d.ts +32 -7
  435. package/dist/pipeline/handler-context-db.js +26 -17
  436. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  437. package/dist/pipeline/handler-context-dispatch.js +9 -8
  438. package/dist/pipeline/handler-context-events.d.ts +22 -36
  439. package/dist/pipeline/handler-context-events.js +36 -31
  440. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  441. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  442. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  443. package/dist/pipeline/handler-context-notify.js +1 -1
  444. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  445. package/dist/pipeline/handler-context-observability.js +7 -5
  446. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  447. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  448. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  449. package/dist/pipeline/handler-context-scope.js +18 -20
  450. package/dist/pipeline/index.d.ts +9 -21
  451. package/dist/pipeline/index.js +5 -7
  452. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  453. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  454. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  455. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  456. package/dist/pipeline/member-read-only-transaction.js +11 -3
  457. package/dist/pipeline/member-reader.d.ts +1 -1
  458. package/dist/pipeline/member-reader.js +2 -2
  459. package/dist/pipeline/msp-rebuild.js +5 -3
  460. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  461. package/dist/pipeline/notify-scope.d.ts +2 -1
  462. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  463. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  464. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  465. package/dist/pipeline/projection-rebuild.js +12 -5
  466. package/dist/pipeline/projection-state.d.ts +0 -6
  467. package/dist/pipeline/projection-state.js +0 -5
  468. package/dist/pipeline/projections-runner.d.ts +2 -1
  469. package/dist/pipeline/projections-runner.js +10 -6
  470. package/dist/pipeline/system-hooks.d.ts +3 -1
  471. package/dist/pipeline/system-hooks.js +6 -4
  472. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  473. package/dist/pipeline/system-identity-switch.js +51 -36
  474. package/dist/pipeline/typed-append-event.d.ts +2 -0
  475. package/dist/pipeline/typed-append-event.js +4 -0
  476. package/dist/pipeline/write-origin.js +2 -2
  477. package/dist/pipeline/write-result-masking.d.ts +1 -1
  478. package/dist/random/index.d.ts +1 -2
  479. package/dist/random/index.js +1 -2
  480. package/dist/rate-limit/bucket.d.ts +2 -1
  481. package/dist/rate-limit/middleware.js +2 -1
  482. package/dist/redis/index.d.ts +3 -4
  483. package/dist/redis/index.js +2 -2
  484. package/dist/schema-cli/apply-command.js +5 -2
  485. package/dist/schema-cli/baseline-command.js +7 -2
  486. package/dist/schema-cli/generate-command.js +7 -9
  487. package/dist/schema-cli/shared.d.ts +12 -2
  488. package/dist/schema-cli/shared.js +24 -2
  489. package/dist/schema-cli/status-command.js +8 -2
  490. package/dist/schema-cli/validate-command.js +48 -4
  491. package/dist/schema-cli.d.ts +0 -1
  492. package/dist/search/configure-tenant-index.d.ts +1 -3
  493. package/dist/search/configure-tenant-index.js +0 -4
  494. package/dist/search/index.d.ts +1 -4
  495. package/dist/search/index.js +0 -2
  496. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  497. package/dist/search/meilisearch-adapter-internals.js +9 -0
  498. package/dist/search/meilisearch-adapter.d.ts +1 -8
  499. package/dist/search/meilisearch-adapter.js +6 -7
  500. package/dist/search/meilisearch-peer.d.ts +2 -0
  501. package/dist/search/meilisearch-peer.js +5 -0
  502. package/dist/search/reindex-entity.js +93 -87
  503. package/dist/secrets/index.d.ts +3 -4
  504. package/dist/secrets/index.js +2 -3
  505. package/dist/seeding/index.d.ts +2 -2
  506. package/dist/seeding/index.js +1 -2
  507. package/dist/time/index.d.ts +2 -2
  508. package/dist/time/index.js +1 -1
  509. package/dist/time/tz-context.d.ts +0 -5
  510. package/dist/time/tz-context.js +0 -9
  511. package/dist/ui-types/index.d.ts +8 -11
  512. package/dist/ui-types/index.js +3 -3
  513. package/dist/upgrade-changelog.d.ts +3 -2
  514. package/dist/upgrade-changelog.js +12 -8
  515. package/dist/upgrade-cli-internals.d.ts +8 -0
  516. package/dist/upgrade-cli-internals.js +63 -0
  517. package/dist/upgrade-cli.d.ts +2 -9
  518. package/dist/upgrade-cli.js +28 -70
  519. package/dist/utils/import-optional-peer.d.ts +6 -0
  520. package/dist/utils/import-optional-peer.js +19 -0
  521. package/dist/utils/index.d.ts +1 -4
  522. package/dist/utils/index.js +1 -4
  523. package/package.json +23 -19
  524. package/src/changes.json +236 -0
  525. package/dist/crypto/request-kms-cache.d.ts +0 -8
  526. package/dist/crypto/request-kms-cache.js +0 -21
  527. package/dist/engine/codemod/index.d.ts +0 -2
  528. package/dist/engine/codemod/index.js +0 -1
  529. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  530. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  531. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  532. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  533. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  534. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  535. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  536. package/dist/engine/feature-ast/extractors/events.js +0 -275
  537. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  538. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  539. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  540. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  541. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  542. package/dist/engine/feature-ast/extractors/index.js +0 -13
  543. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  544. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  545. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  546. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  547. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  548. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  549. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  550. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  551. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  552. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  553. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  554. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  555. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  556. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  557. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  558. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  559. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  560. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  561. package/dist/engine/feature-ast/index.d.ts +0 -16
  562. package/dist/engine/feature-ast/index.js +0 -10
  563. package/dist/engine/feature-ast/parse.d.ts +0 -31
  564. package/dist/engine/feature-ast/parse.js +0 -485
  565. package/dist/engine/feature-ast/patch.d.ts +0 -212
  566. package/dist/engine/feature-ast/patch.js +0 -611
  567. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  568. package/dist/engine/feature-ast/patcher.js +0 -281
  569. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  570. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  571. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  572. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  573. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  574. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  575. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  576. package/dist/engine/feature-ast/patterns.js +0 -107
  577. package/dist/engine/feature-ast/render.d.ts +0 -47
  578. package/dist/engine/feature-ast/render.js +0 -666
  579. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  580. package/dist/engine/feature-ast/source-location.js +0 -27
  581. package/dist/engine/pattern-library/index.d.ts +0 -2
  582. package/dist/engine/pattern-library/index.js +0 -3
  583. package/dist/engine/pattern-library/library.d.ts +0 -14
  584. package/dist/engine/pattern-library/library.js +0 -94
  585. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  586. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  587. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  588. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  589. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  590. package/dist/engine/pattern-library/shared-fields.js +0 -88
  591. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  592. package/dist/engine/pattern-library/static-schemas.js +0 -487
  593. package/dist/engine/pattern-library/types.d.ts +0 -158
  594. package/dist/engine/pattern-library/types.js +0 -36
  595. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  596. package/dist/engine/resolve-config-or-param.js +0 -76
  597. package/src/scripts/codemod/README.md +0 -187
  598. package/src/scripts/codemod/codemod-support.ts +0 -334
  599. package/src/scripts/codemod/collect-source-files.ts +0 -48
  600. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  601. package/src/scripts/codemod/db-factory.ts +0 -810
  602. package/src/scripts/codemod/feature-factory.ts +0 -429
  603. package/src/scripts/codemod/feature-layout.ts +0 -424
  604. package/src/scripts/codemod/import-extensions.ts +0 -118
  605. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  606. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  607. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  608. package/src/scripts/codemod/object-form.ts +0 -746
  609. package/src/scripts/codemod/package-merge.ts +0 -299
  610. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  611. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  612. package/src/scripts/codemod/s3-imports.ts +0 -236
  613. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  614. package/src/scripts/codemod/testing-injection.ts +0 -215
  615. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  616. package/src/scripts/codemod/testing-move.ts +0 -542
  617. 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
- }