@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,454 +0,0 @@
1
- #!/usr/bin/env bun
2
- // tenant-db-options — `createTenantDb(db, tenantId, mode, tracer, meter, signal, grants)` becomes
3
- // `createTenantDb({ db, tenantId, mode, tracer, meter, signal, grants })`.
4
- //
5
- // Usage:
6
- // bun scripts/codemod/tenant-db-options.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
7
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
8
- // while any rewritable or manual site is left; --dry-run only reports.
9
-
10
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
11
- import { dirname, join, relative, resolve } from "node:path";
12
- import { type CallExpression, Node, Project, type SourceFile, SyntaxKind } from "ts-morph";
13
- import { collectSourceFiles } from "./collect-source-files.ts";
14
-
15
- export interface TenantDbOptionsSite {
16
- readonly file: string;
17
- readonly line: number;
18
- readonly description: string;
19
- }
20
-
21
- export interface TenantDbOptionsResult {
22
- readonly output: string;
23
- readonly rewrites: TenantDbOptionsSite[];
24
- readonly manual: TenantDbOptionsSite[];
25
- }
26
-
27
- const FRAMEWORK_PACKAGE = "@cosmicdrift/kumiko-framework";
28
- const FRAMEWORK_SRC_MARKER = "/packages/framework/src/";
29
- const FACTORY_NAME = "createTenantDb";
30
- const OPTION_NAMES = ["db", "tenantId", "mode", "tracer", "meter", "signal", "grants"] as const;
31
- const FIRST_OPTIONAL_INDEX = 2;
32
- const CHEAP_PREFILTER = /createTenantDb/;
33
- const COMMENT_PATTERN = /\/\/[^\n]*|\/\*[\s\S]*?\*\//g;
34
-
35
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
36
- "packages/framework/src/scripts/codemod/tenant-db-options.ts",
37
- "packages/framework/src/__tests__/tenant-db-options-codemod.test.ts",
38
- ];
39
-
40
- function isFrameworkSpecifier(specifier: string, filePath: string): boolean {
41
- if (specifier === FRAMEWORK_PACKAGE || specifier.startsWith(`${FRAMEWORK_PACKAGE}/`)) {
42
- return true;
43
- }
44
- if (!specifier.startsWith(".")) return false;
45
- return resolve(dirname(filePath), specifier).includes(FRAMEWORK_SRC_MARKER);
46
- }
47
-
48
- // Bindings are resolved through the checker's alias symbol, so a parameter or local that shadows
49
- // the imported name is never mistaken for the framework export.
50
- function isFrameworkModuleImportCall(node: Node | undefined, filePath: string): boolean {
51
- const importCall = Node.isAwaitExpression(node) ? node.getExpression() : node;
52
- if (!Node.isCallExpression(importCall)) return false;
53
- if (importCall.getExpression().getKind() !== SyntaxKind.ImportKeyword) return false;
54
- const argument = importCall.getArguments()[0];
55
- return (
56
- argument !== undefined &&
57
- Node.isStringLiteral(argument) &&
58
- isFrameworkSpecifier(argument.getLiteralValue(), filePath)
59
- );
60
- }
61
-
62
- function resolvesToFrameworkExport(identifier: Node, filePath: string): boolean {
63
- const declarations = identifier.getSymbol()?.getDeclarations() ?? [];
64
- return declarations.some((declaration) => {
65
- if (Node.isImportSpecifier(declaration)) {
66
- return (
67
- declaration.getName() === FACTORY_NAME &&
68
- isFrameworkSpecifier(declaration.getImportDeclaration().getModuleSpecifierValue(), filePath)
69
- );
70
- }
71
- if (Node.isBindingElement(declaration)) {
72
- const importedName = declaration.getPropertyNameNode()?.getText() ?? declaration.getName();
73
- const variable = declaration.getFirstAncestorByKind(SyntaxKind.VariableDeclaration);
74
- return (
75
- importedName === FACTORY_NAME &&
76
- isFrameworkModuleImportCall(variable?.getInitializer(), filePath)
77
- );
78
- }
79
- return false;
80
- });
81
- }
82
-
83
- function resolvesToFrameworkNamespace(identifier: Node, filePath: string): boolean {
84
- const declarations = identifier.getSymbol()?.getDeclarations() ?? [];
85
- return declarations.some((declaration) => {
86
- if (Node.isNamespaceImport(declaration)) {
87
- return isFrameworkSpecifier(
88
- declaration
89
- .getFirstAncestorByKindOrThrow(SyntaxKind.ImportDeclaration)
90
- .getModuleSpecifierValue(),
91
- filePath,
92
- );
93
- }
94
- return (
95
- Node.isVariableDeclaration(declaration) &&
96
- isFrameworkModuleImportCall(declaration.getInitializer(), filePath)
97
- );
98
- });
99
- }
100
-
101
- // The symbol lookup is the expensive part; names that cannot be the factory skip it.
102
- function localFactoryNames(sourceFile: SourceFile): ReadonlySet<string> {
103
- const names = new Set<string>([FACTORY_NAME]);
104
- for (const specifier of sourceFile.getDescendantsOfKind(SyntaxKind.ImportSpecifier)) {
105
- if (specifier.getName() === FACTORY_NAME)
106
- names.add(specifier.getAliasNode()?.getText() ?? FACTORY_NAME);
107
- }
108
- for (const element of sourceFile.getDescendantsOfKind(SyntaxKind.BindingElement)) {
109
- const importedName = element.getPropertyNameNode()?.getText() ?? element.getName();
110
- if (importedName === FACTORY_NAME) names.add(element.getName());
111
- }
112
- return names;
113
- }
114
-
115
- function isFactoryReference(node: Node, names: ReadonlySet<string>, filePath: string): boolean {
116
- if (Node.isIdentifier(node)) {
117
- return names.has(node.getText()) && resolvesToFrameworkExport(node, filePath);
118
- }
119
- return (
120
- Node.isPropertyAccessExpression(node) &&
121
- node.getName() === FACTORY_NAME &&
122
- resolvesToFrameworkNamespace(node.getExpression(), filePath)
123
- );
124
- }
125
-
126
- function isCalleeOf(node: Node): boolean {
127
- const parent = node.getParent();
128
- return Node.isCallExpression(parent) && parent.getExpression() === node;
129
- }
130
-
131
- function isObjectFormCall(call: CallExpression): boolean {
132
- const args = call.getArguments();
133
- return args.length === 1 && Node.isObjectLiteralExpression(args[0]);
134
- }
135
-
136
- interface GapComment {
137
- readonly text: string;
138
- // Same line as the preceding argument: stays attached to it.
139
- readonly trailing: boolean;
140
- }
141
-
142
- function commentsOfGap(gap: string): GapComment[] {
143
- const comments: GapComment[] = [];
144
- for (const match of gap.matchAll(COMMENT_PATTERN)) {
145
- const before = gap.slice(0, match.index);
146
- comments.push({ text: match[0], trailing: !before.includes("\n") });
147
- }
148
- return comments;
149
- }
150
-
151
- function isUndefinedLiteral(argument: Node): boolean {
152
- return Node.isIdentifier(argument) && argument.getText() === "undefined";
153
- }
154
-
155
- function propertyText(name: string, argument: Node): string {
156
- return Node.isIdentifier(argument) && argument.getText() === name
157
- ? name
158
- : `${name}: ${argument.getText()}`;
159
- }
160
-
161
- // Text between the parentheses and around each argument holds only commas and comments.
162
- function gapsAround(call: CallExpression, args: readonly Node[]): string[] {
163
- const text = call.getSourceFile().getFullText();
164
- const openParen = call.getFirstChildByKindOrThrow(SyntaxKind.OpenParenToken);
165
- const closeParen = call.getLastChildByKindOrThrow(SyntaxKind.CloseParenToken);
166
- const boundaries = [openParen.getEnd(), ...args.flatMap((a) => [a.getStart(), a.getEnd()])];
167
- boundaries.push(closeParen.getStart());
168
- const gaps: string[] = [];
169
- for (let i = 0; i < boundaries.length; i += 2) {
170
- gaps.push(text.slice(boundaries[i], boundaries[i + 1]));
171
- }
172
- return gaps;
173
- }
174
-
175
- function optionsObjectText(call: CallExpression, args: readonly Node[]): string {
176
- const gaps = gapsAround(call, args).map(commentsOfGap);
177
- const lines: string[] = [];
178
- let lastLineIsProperty = false;
179
- const emitComments = (comments: readonly GapComment[]): void => {
180
- for (const comment of comments) {
181
- if (comment.trailing && lastLineIsProperty) {
182
- lines[lines.length - 1] += ` ${comment.text}`;
183
- } else {
184
- lines.push(comment.text);
185
- lastLineIsProperty = false;
186
- }
187
- }
188
- };
189
- for (const [index, argument] of args.entries()) {
190
- emitComments(gaps[index] ?? []);
191
- const name = OPTION_NAMES[index];
192
- const isDropped = index >= FIRST_OPTIONAL_INDEX && isUndefinedLiteral(argument);
193
- if (name === undefined || isDropped) continue;
194
- lines.push(`${propertyText(name, argument)},`);
195
- lastLineIsProperty = true;
196
- }
197
- emitComments(gaps[args.length] ?? []);
198
- const hasComment = gaps.some((gap) => gap.length > 0);
199
- if (!hasComment) return `{ ${lines.map((line) => line.replace(/,$/, "")).join(", ")} }`;
200
- return `{\n${lines.join("\n")}\n}`;
201
- }
202
-
203
- function unmappableReason(args: readonly Node[]): string | undefined {
204
- if (args.some((argument) => Node.isSpreadElement(argument))) {
205
- return "spread argument, map it to { db, tenantId, ... } by hand";
206
- }
207
- if (args.length > OPTION_NAMES.length) {
208
- return `${args.length} arguments, createTenantDb takes at most ${OPTION_NAMES.length}`;
209
- }
210
- if (args.length < 2) {
211
- return `${args.length} argument(s) that are not an options object literal`;
212
- }
213
- return undefined;
214
- }
215
-
216
- function rewriteCalls(
217
- sourceFile: SourceFile,
218
- names: ReadonlySet<string>,
219
- filePath: string,
220
- result: Sites,
221
- ): void {
222
- const calls = sourceFile
223
- .getDescendantsOfKind(SyntaxKind.CallExpression)
224
- .filter((call) => isFactoryReference(call.getExpression(), names, filePath))
225
- .sort((a, b) => b.getStart() - a.getStart());
226
-
227
- for (const call of calls) {
228
- if (isObjectFormCall(call)) continue;
229
- const line = call.getStartLineNumber();
230
- const args = call.getArguments();
231
- const reason = unmappableReason(args);
232
- if (reason !== undefined) {
233
- result.manual.push({ file: filePath, line, description: `${FACTORY_NAME}(...): ${reason}` });
234
- continue;
235
- }
236
- call.replaceWithText(`${call.getExpression().getText()}(${optionsObjectText(call, args)})`);
237
- result.rewrites.push({
238
- file: filePath,
239
- line,
240
- description: `${FACTORY_NAME}(db, tenantId, ...) -> ${FACTORY_NAME}({ db, tenantId, ... })`,
241
- });
242
- }
243
- }
244
-
245
- function isDeclarationPosition(node: Node): boolean {
246
- const parent = node.getParent();
247
- return (
248
- Node.isImportSpecifier(parent) ||
249
- Node.isExportSpecifier(parent) ||
250
- Node.isTypeQuery(parent) ||
251
- Node.isBindingElement(parent)
252
- );
253
- }
254
-
255
- // A value use cannot be mapped to the options object: the reference may be called anywhere.
256
- function reportValueUses(
257
- sourceFile: SourceFile,
258
- names: ReadonlySet<string>,
259
- filePath: string,
260
- result: Sites,
261
- ): void {
262
- const candidates: Node[] = [
263
- ...sourceFile.getDescendantsOfKind(SyntaxKind.Identifier),
264
- ...sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression),
265
- ];
266
- for (const node of candidates) {
267
- if (isCalleeOf(node) || isDeclarationPosition(node)) continue;
268
- const isShorthand = Node.isShorthandPropertyAssignment(node.getParent());
269
- const matches = isShorthand
270
- ? Node.isIdentifier(node) && names.has(node.getText())
271
- : isFactoryReference(node, names, filePath);
272
- if (!matches) continue;
273
- result.manual.push({
274
- file: filePath,
275
- line: node.getStartLineNumber(),
276
- description: `${FACTORY_NAME} used as a value, wrap the call site and use the options object`,
277
- });
278
- }
279
- }
280
-
281
- type Sites = { rewrites: TenantDbOptionsSite[]; manual: TenantDbOptionsSite[] };
282
-
283
- export function transformTenantDbOptionsSource(
284
- source: string,
285
- filePath = "source.ts",
286
- ): TenantDbOptionsResult {
287
- const result: TenantDbOptionsResult = { output: source, rewrites: [], manual: [] };
288
- if (!CHEAP_PREFILTER.test(source)) return result;
289
- const project = new Project({
290
- useInMemoryFileSystem: true,
291
- skipAddingFilesFromTsConfig: true,
292
- skipFileDependencyResolution: true,
293
- });
294
- const absolutePath = resolve(filePath);
295
- const sourceFile = project.createSourceFile(absolutePath, source);
296
- const names = localFactoryNames(sourceFile);
297
- reportValueUses(sourceFile, names, absolutePath, result);
298
- rewriteCalls(sourceFile, names, absolutePath, result);
299
- const changed = result.rewrites.length > 0;
300
- return { ...result, output: changed ? sourceFile.getFullText() : source };
301
- }
302
-
303
- type Mode = "write" | "dry-run" | "check";
304
-
305
- interface CliOptions {
306
- readonly mode: Mode;
307
- readonly format: boolean;
308
- readonly paths: string[];
309
- }
310
-
311
- class CliError extends Error {}
312
-
313
- function parseArgs(argv: readonly string[]): CliOptions {
314
- let mode: Mode | undefined;
315
- let format = true;
316
- const paths: string[] = [];
317
- const setMode = (next: Mode): void => {
318
- if (mode !== undefined && mode !== next) {
319
- throw new CliError("--check, --dry-run and --write are mutually exclusive");
320
- }
321
- mode = next;
322
- };
323
- for (const arg of argv) {
324
- if (arg === "--check") setMode("check");
325
- else if (arg === "--dry-run") setMode("dry-run");
326
- else if (arg === "--write") setMode("write");
327
- else if (arg === "--no-format") format = false;
328
- else if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
329
- else paths.push(arg);
330
- }
331
- if (paths.length === 0) throw new CliError("at least one target directory is required");
332
- return { mode: mode ?? "write", format, paths };
333
- }
334
-
335
- function isMigratableFile(name: string): boolean {
336
- return /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts");
337
- }
338
-
339
- function isSkippedPath(file: string): boolean {
340
- return (
341
- file.includes("/__tests__/fixtures/") ||
342
- SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix))
343
- );
344
- }
345
-
346
- function findBiomeBinary(startDir: string): string | undefined {
347
- let dir = resolve(startDir);
348
- for (;;) {
349
- const candidate = join(dir, "node_modules", ".bin", "biome");
350
- if (existsSync(candidate)) return candidate;
351
- const parent = dirname(dir);
352
- if (parent === dir) return undefined;
353
- dir = parent;
354
- }
355
- }
356
-
357
- const FORMAT_BATCH_SIZE = 50;
358
-
359
- async function formatWithBiome(files: readonly string[], cwd: string): Promise<void> {
360
- const biome = findBiomeBinary(cwd);
361
- if (biome === undefined) {
362
- console.log(
363
- "[tenant-db-options] biome not found in node_modules/.bin — format and sort imports of the changed files yourself",
364
- );
365
- // skip: formatting is a convenience, the rewrite itself is already on disk
366
- return;
367
- }
368
- for (let i = 0; i < files.length; i += FORMAT_BATCH_SIZE) {
369
- const batch = files.slice(i, i + FORMAT_BATCH_SIZE);
370
- const proc = Bun.spawn({
371
- cmd: [
372
- biome,
373
- "check",
374
- "--write",
375
- "--linter-enabled=false",
376
- "--no-errors-on-unmatched",
377
- ...batch,
378
- ],
379
- cwd,
380
- stdout: "pipe",
381
- stderr: "pipe",
382
- });
383
- const [stderr, exitCode] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
384
- if (exitCode !== 0) {
385
- console.log(
386
- `[tenant-db-options] biome exited ${exitCode}; run it on the changed files yourself\n${stderr.trim()}`,
387
- );
388
- }
389
- }
390
- }
391
-
392
- function displayPath(file: string): string {
393
- const fromCwd = relative(process.cwd(), file);
394
- return fromCwd.startsWith("..") ? file : fromCwd;
395
- }
396
-
397
- interface RunSummary extends Sites {
398
- readonly changedFiles: string[];
399
- }
400
-
401
- function transformFiles(files: readonly string[], mode: Mode): RunSummary {
402
- const summary: RunSummary = { rewrites: [], manual: [], changedFiles: [] };
403
- for (const file of files) {
404
- const before = readFileSync(file, "utf8");
405
- const result = transformTenantDbOptionsSource(before, file);
406
- const shown = displayPath(file);
407
- for (const site of result.rewrites)
408
- console.log(`${shown}:${site.line} rewritten ${site.description}`);
409
- for (const site of result.manual)
410
- console.log(`${shown}:${site.line} manual ${site.description}`);
411
- summary.rewrites.push(...result.rewrites);
412
- summary.manual.push(...result.manual);
413
- if (mode === "write" && result.output !== before) {
414
- writeFileSync(file, result.output);
415
- summary.changedFiles.push(file);
416
- }
417
- }
418
- return summary;
419
- }
420
-
421
- function parseArgsOrExit(argv: readonly string[]): CliOptions {
422
- try {
423
- return parseArgs(argv);
424
- } catch (err) {
425
- if (err instanceof CliError) {
426
- console.error(`[tenant-db-options] ${err.message}`);
427
- process.exit(2);
428
- }
429
- throw err;
430
- }
431
- }
432
-
433
- async function main(): Promise<void> {
434
- const options = parseArgsOrExit(process.argv.slice(2));
435
- const files = collectSourceFiles(options.paths, { isMigratableFile }).filter(
436
- (file) => !isSkippedPath(file),
437
- );
438
- const { rewrites, manual, changedFiles } = transformFiles(files, options.mode);
439
-
440
- console.log(
441
- `\n[tenant-db-options] ${options.mode === "write" ? "rewritten" : "rewritable"}: ${rewrites.length} call(s) in ${new Set(rewrites.map((site) => site.file)).size} file(s); manual: ${manual.length}`,
442
- );
443
-
444
- if (options.mode === "write" && options.format && changedFiles.length > 0) {
445
- await formatWithBiome(changedFiles, resolve(options.paths[0] ?? "."));
446
- }
447
-
448
- const hasOpenSites = rewrites.length + manual.length > 0;
449
- process.exit(options.mode === "check" && hasOpenSites ? 1 : 0);
450
- }
451
-
452
- if (import.meta.main) {
453
- await main();
454
- }
@@ -1,215 +0,0 @@
1
- #!/usr/bin/env bun
2
- // testing-injection — kumiko-testing no longer imports bundled-features or dev-server. The test
3
- // functions that need them are bound in `@cosmicdrift/kumiko-dev-server/testing`:
4
- // @cosmicdrift/kumiko-testing { setupAppTestStack, SetupAppTestStackOptions,
5
- // seedTenant, persistTenantRows }
6
- // @cosmicdrift/kumiko-testing/e2e/seed-route { createE2eSeedRoutes }
7
- // -> @cosmicdrift/kumiko-dev-server/testing
8
- // Names that stay (types like SeededTenant, E2eExtraSeeder, isE2eSeedingEnabled) keep their import.
9
- //
10
- // Usage:
11
- // bun scripts/codemod/testing-injection.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
12
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
13
- // while any rewritable or manual site is left; --dry-run only reports.
14
-
15
- import {
16
- type ExportDeclaration,
17
- type ExportSpecifier,
18
- type ImportDeclaration,
19
- type ImportSpecifier,
20
- Project,
21
- SyntaxKind,
22
- } from "ts-morph";
23
- import {
24
- type CodemodResult,
25
- ensureNamedImport,
26
- runCodemodCli,
27
- type SiteLists,
28
- } from "./codemod-support.ts";
29
-
30
- const TESTING_PACKAGE = "@cosmicdrift/kumiko-testing";
31
- const TARGET_MODULE = "@cosmicdrift/kumiko-dev-server/testing";
32
-
33
- const MOVED_NAMES_BY_MODULE: ReadonlyMap<string, ReadonlySet<string>> = new Map([
34
- [
35
- TESTING_PACKAGE,
36
- new Set(["setupAppTestStack", "SetupAppTestStackOptions", "seedTenant", "persistTenantRows"]),
37
- ],
38
- [`${TESTING_PACKAGE}/e2e/seed-route`, new Set(["createE2eSeedRoutes"])],
39
- ]);
40
-
41
- const CHEAP_PREFILTER = /kumiko-testing/;
42
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
43
- "packages/framework/src/scripts/codemod/testing-injection.ts",
44
- "packages/framework/src/__tests__/testing-injection-codemod.test.ts",
45
- "packages/dev-server/src/testing.ts",
46
- ];
47
-
48
- function movedNamesOf(declaration: ImportDeclaration): ReadonlySet<string> | undefined {
49
- return MOVED_NAMES_BY_MODULE.get(declaration.getModuleSpecifierValue());
50
- }
51
-
52
- function reportNamespaceUses(
53
- declaration: ImportDeclaration,
54
- moved: ReadonlySet<string>,
55
- filePath: string,
56
- result: SiteLists,
57
- ): void {
58
- const namespaceName = declaration.getNamespaceImport()?.getText();
59
- const accesses =
60
- namespaceName === undefined
61
- ? []
62
- : declaration.getSourceFile().getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
63
- for (const access of accesses) {
64
- if (access.getExpression().getText() === namespaceName && moved.has(access.getName())) {
65
- result.manual.push({
66
- file: filePath,
67
- line: access.getStartLineNumber(),
68
- description: `${namespaceName}.${access.getName()}: import it from ${TARGET_MODULE}`,
69
- });
70
- }
71
- }
72
- }
73
-
74
- function reportStarReexport(
75
- declaration: ExportDeclaration,
76
- filePath: string,
77
- result: SiteLists,
78
- ): void {
79
- result.manual.push({
80
- file: filePath,
81
- line: declaration.getStartLineNumber(),
82
- description: `export * from ${declaration.getModuleSpecifierValue()}: re-export the moved names from ${TARGET_MODULE} by hand`,
83
- });
84
- }
85
-
86
- function moveNamedReexports(
87
- declaration: ExportDeclaration,
88
- movedExports: readonly ExportSpecifier[],
89
- filePath: string,
90
- result: SiteLists,
91
- ): void {
92
- const line = declaration.getStartLineNumber();
93
- const snapshots = movedExports.map((named) => ({
94
- name: named.getName(),
95
- alias: named.getAliasNode()?.getText(),
96
- isTypeOnly: named.isTypeOnly(),
97
- }));
98
- for (const named of movedExports) named.remove();
99
- const typeOnlyDeclaration = declaration.isTypeOnly();
100
- if (declaration.getNamedExports().length === 0) declaration.remove();
101
- declaration.getSourceFile().addExportDeclaration({
102
- moduleSpecifier: TARGET_MODULE,
103
- namedExports: snapshots,
104
- isTypeOnly: typeOnlyDeclaration,
105
- });
106
- result.rewrites.push({
107
- file: filePath,
108
- line,
109
- description: `export { ${snapshots.map((snapshot) => snapshot.name).join(", ")} } -> ${TARGET_MODULE}`,
110
- });
111
- }
112
-
113
- function rewriteReexports(
114
- declaration: ExportDeclaration,
115
- moved: ReadonlySet<string>,
116
- filePath: string,
117
- result: SiteLists,
118
- ): void {
119
- const namedExports = declaration.getNamedExports();
120
- const movedExports = namedExports.filter((named) => moved.has(named.getName()));
121
- if (namedExports.length === 0) reportStarReexport(declaration, filePath, result);
122
- else if (movedExports.length > 0) moveNamedReexports(declaration, movedExports, filePath, result);
123
- }
124
-
125
- function moveNamedImports(
126
- declaration: ImportDeclaration,
127
- movedImports: readonly ImportSpecifier[],
128
- filePath: string,
129
- result: SiteLists,
130
- ): void {
131
- const line = declaration.getStartLineNumber();
132
- const typeOnlyDeclaration = declaration.isTypeOnly();
133
- const sourceFile = declaration.getSourceFile();
134
- const names = movedImports.map((named) => named.getName());
135
- // Collected first: removing a specifier invalidates the nodes of its siblings.
136
- const snapshots = movedImports.map((named) => ({
137
- name: named.getName(),
138
- alias: named.getAliasNode()?.getText(),
139
- typeOnly: named.isTypeOnly(),
140
- }));
141
- for (const named of movedImports) named.remove();
142
- if (
143
- declaration.getNamedImports().length === 0 &&
144
- declaration.getNamespaceImport() === undefined &&
145
- declaration.getDefaultImport() === undefined
146
- ) {
147
- declaration.remove();
148
- }
149
- for (const snapshot of snapshots) {
150
- const typeOnly = typeOnlyDeclaration || snapshot.typeOnly;
151
- if (snapshot.alias === undefined) {
152
- ensureNamedImport(sourceFile, TARGET_MODULE, snapshot.name, typeOnly);
153
- } else {
154
- sourceFile.addImportDeclaration({
155
- moduleSpecifier: TARGET_MODULE,
156
- namedImports: [{ name: snapshot.name, alias: snapshot.alias }],
157
- isTypeOnly: typeOnly,
158
- });
159
- }
160
- }
161
- result.rewrites.push({
162
- file: filePath,
163
- line,
164
- description: `${names.join(", ")} -> ${TARGET_MODULE}`,
165
- });
166
- }
167
-
168
- function rewriteImportDeclaration(
169
- declaration: ImportDeclaration,
170
- filePath: string,
171
- result: SiteLists,
172
- ): void {
173
- const moved = movedNamesOf(declaration);
174
- if (moved !== undefined) {
175
- reportNamespaceUses(declaration, moved, filePath, result);
176
- const movedImports = declaration
177
- .getNamedImports()
178
- .filter((named) => moved.has(named.getName()));
179
- if (movedImports.length > 0) moveNamedImports(declaration, movedImports, filePath, result);
180
- }
181
- }
182
-
183
- export function transformTestingInjectionSource(
184
- source: string,
185
- filePath = "source.ts",
186
- ): CodemodResult {
187
- const result: SiteLists = { rewrites: [], manual: [] };
188
- if (!CHEAP_PREFILTER.test(source)) return { output: source, ...result };
189
- const project = new Project({
190
- useInMemoryFileSystem: true,
191
- skipAddingFilesFromTsConfig: true,
192
- skipFileDependencyResolution: true,
193
- });
194
- const sourceFile = project.createSourceFile(filePath, source);
195
- for (const declaration of sourceFile.getImportDeclarations()) {
196
- rewriteImportDeclaration(declaration, filePath, result);
197
- }
198
- for (const declaration of sourceFile.getExportDeclarations()) {
199
- const moved = MOVED_NAMES_BY_MODULE.get(declaration.getModuleSpecifierValue() ?? "");
200
- if (moved !== undefined) rewriteReexports(declaration, moved, filePath, result);
201
- }
202
- const output = result.rewrites.length > 0 ? sourceFile.getFullText() : source;
203
- return { output, ...result };
204
- }
205
-
206
- function isSkippedPath(file: string): boolean {
207
- return SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix));
208
- }
209
-
210
- if (import.meta.main) {
211
- await runCodemodCli(
212
- { name: "testing-injection", transform: transformTestingInjectionSource, isSkippedPath },
213
- process.argv.slice(2),
214
- );
215
- }