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