@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,18 +0,0 @@
1
- import type { ConfigAccessor, ConfigKeyHandle, ConfigKeyType, ConfigValue } from "./types/config.ts";
2
- import type { Registry } from "./types/index.ts";
3
- type ResolveCtx = {
4
- readonly config: ConfigAccessor;
5
- readonly registry: Registry;
6
- };
7
- export type ClampInfo = {
8
- readonly key: string;
9
- readonly original: number;
10
- readonly clamped: number;
11
- readonly min?: number;
12
- readonly max?: number;
13
- };
14
- export type ResolveOptions = {
15
- readonly onClamp?: (info: ClampInfo) => void;
16
- };
17
- export declare function resolveConfigOrParam<T extends ConfigKeyType>(ctx: ResolveCtx, handle: ConfigKeyHandle<T>, paramValue: unknown, options?: ResolveOptions): Promise<ConfigValue<T> | undefined>;
18
- export {};
@@ -1,76 +0,0 @@
1
- export async function resolveConfigOrParam(ctx, handle, paramValue, options) {
2
- if (paramValue === undefined || paramValue === null || paramValue === "") {
3
- return ctx.config(handle);
4
- }
5
- const keyDef = ctx.registry.getConfigKey(handle.name);
6
- // skip: key isn't in the registry — unlikely because the caller holds a
7
- // typed handle, but defence-in-depth for hand-built handles.
8
- if (!keyDef)
9
- return ctx.config(handle);
10
- // Explicit opt-in required. A config key without `allowPerRequest: true`
11
- // on its declaration cannot be overridden via a query-param, even if the
12
- // route-handler forwards one. This is a deny-by-default policy: without
13
- // it, a future feature-dev could accidentally route a sensitive key
14
- // (rate-limits, quotas) through a public query-param without noticing.
15
- if (!keyDef.allowPerRequest) {
16
- throw new Error(`resolveConfigOrParam: per-request override not enabled for config key "${handle.name}". Set allowPerRequest: true on the declaration to opt in — or drop the paramValue if the route-handler forwards it by mistake.`);
17
- }
18
- switch (keyDef.type) {
19
- case "number": {
20
- const parsed = typeof paramValue === "number" ? paramValue : Number(paramValue);
21
- if (Number.isNaN(parsed) || !Number.isFinite(parsed)) {
22
- return ctx.config(handle);
23
- }
24
- const clamped = clampToBounds(parsed, keyDef.bounds);
25
- // Fire onClamp only when the value actually moved. No bounds + within
26
- // bounds = silent; crossing a bound = audit event.
27
- if (clamped !== parsed && options?.onClamp) {
28
- const info = {
29
- key: handle.name,
30
- original: parsed,
31
- clamped,
32
- ...(keyDef.bounds?.min !== undefined && { min: keyDef.bounds.min }),
33
- ...(keyDef.bounds?.max !== undefined && { max: keyDef.bounds.max }),
34
- };
35
- options.onClamp(info);
36
- }
37
- return clamped; // @cast-boundary engine-bridge
38
- }
39
- case "boolean": {
40
- if (typeof paramValue === "boolean")
41
- return paramValue; // @cast-boundary engine-bridge
42
- const str = String(paramValue).toLowerCase();
43
- return (str === "true" || str === "1"); // @cast-boundary engine-bridge
44
- }
45
- case "text": {
46
- // Hard-reject any attempt to override a text key via query-param.
47
- // See the module-level comment for why this is strict. App-devs
48
- // that see this error should either (a) remove the paramValue from
49
- // their route — the config value still flows through ctx.config —
50
- // or (b) build their own sanitised parser outside this helper.
51
- throw new Error(`resolveConfigOrParam: per-request override is not allowed for type="text" config key "${handle.name}" — query-params would bypass sanitisation. Remove the paramValue or build a feature-specific sanitiser.`);
52
- }
53
- case "select": {
54
- const str = String(paramValue);
55
- if (keyDef.options?.includes(str))
56
- return str; // @cast-boundary engine-bridge
57
- // Invalid option → fall back to the configured value rather than 400.
58
- // The caller is signalling intent; we honour the constraint instead.
59
- return ctx.config(handle);
60
- }
61
- default: {
62
- const _exhaustive = keyDef.type;
63
- throw new Error(`resolveConfigOrParam: unhandled config key type "${_exhaustive}"`);
64
- }
65
- }
66
- }
67
- function clampToBounds(value, bounds) {
68
- if (!bounds)
69
- return value;
70
- let v = value;
71
- if (bounds.min !== undefined && v < bounds.min)
72
- v = bounds.min;
73
- if (bounds.max !== undefined && v > bounds.max)
74
- v = bounds.max;
75
- return v;
76
- }
@@ -1,187 +0,0 @@
1
- # consumer-facing codemods
2
-
3
- This directory holds the codemod scripts `kumiko upgrade --apply` runs for
4
- consumers of `@cosmicdrift/kumiko-framework`. It ships as part of the
5
- published package (under `src/`), unlike `scripts/codemod/` at the repo
6
- root, which is internal bun-cutover tooling for this repo's own migration
7
- and never gets published.
8
-
9
- `crypto-shredding-testing-move.ts` rewrites the moved
10
- `resetPiiSubjectKmsForTests` import path; it's wired into
11
- `packages/bundled-features/src/crypto-shredding/changes.json`'s `codemod`
12
- field and runs automatically via `kumiko upgrade --apply`.
13
-
14
- ## pii-personal-migration.ts
15
-
16
- Migrates `create*Field(...)` calls from the old flag-based PII API (`pii`,
17
- `userOwned`, `tenantOwned`, `subjectRef`, `allowPlaintext`, `lookupable`,
18
- `searchable`, `sensitive`) to the author-facing `personal`/`find` API
19
- (kumiko-framework#2250). Idempotent — safe to re-run against already
20
- migrated code (no-ops on fields carrying `personal`).
21
-
22
- `createTenantConfig`/`createUserConfig`/etc. are out of scope by
23
- construction (name doesn't match `create*Field`).
24
-
25
- ```bash
26
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/pii-personal-migration.ts <targetDir> [--dry-run]
27
- ```
28
-
29
- Anything it can't map mechanically (two subject flags on one field,
30
- `sensitive` + `lookupable`/`searchable` together, `piiEncrypted` on an
31
- entity field, a raw object literal with subject flags outside a
32
- `create*Field(...)` call) is reported with file:line instead of guessed
33
- at — fix those by hand. The report also lists every field that newly
34
- gains `lookupable` (searchable-only fields resolving to `find: "fuzzy"`)
35
- — each of those needs a `_bidx` column migration, which this script does
36
- not write.
37
-
38
- ## object-form.ts
39
-
40
- Rewrites the positional registrar calls `r.writeHandler(name, schema, handler, options)`,
41
- `r.queryHandler(…)`, `r.entity(name, definition, { table })`, `r.requires("a", "b")` and
42
- `r.hook(type, target, fn, options?)` to their object form, and
43
- `registerEntityCrud(r, name, entity, options?)` to `r.crud(name, entity, options?)`
44
- (the now-unused import is removed). Idempotent — object-form calls are left alone.
45
-
46
- A call is only touched when its receiver is provably a feature registrar: a parameter of
47
- the `defineFeature(name, (r) => …)` callback, or a binding typed `FeatureRegistrar`.
48
- Anything else (`sessions.requires("x")`, `foo.entity(…)`) stays untouched. A call on an
49
- untyped `r`/`registrar` it cannot resolve, a spread argument, too few arguments or
50
- `entity` options other than `{ table }` are reported as `manual` instead of guessed at.
51
-
52
- ```bash
53
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/object-form.ts <dir> [--check | --dry-run | --write] [--no-format]
54
- ```
55
-
56
- Runs automatically via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then
57
- formats the changed files with the Biome binary found in `node_modules/.bin` (`--no-format`
58
- skips that). `--dry-run` only reports; `--check` reports and exits 1 while any rewritable
59
- or manual site is left.
60
-
61
- ## db-factory.ts
62
-
63
- Moves consumers to the single DB connection factory and the relocated query helpers.
64
- `@cosmicdrift/kumiko-framework/bun-db` imports (including `import type`, `export … from` and
65
- `import("…")` types) are repointed to `@cosmicdrift/kumiko-framework/db`, merged into an existing
66
- `/db` import of the same kind. `createDbConnection(url, options)` becomes
67
- `createDbConnection({ url, ...options })`; `createConnection`/`createPgConnection` from the
68
- framework become `createDbConnection` in the object form, and the now-pointless `await` is dropped.
69
- Idempotent. Local functions named `createConnection` are left alone.
70
-
71
- Reported as `manual` instead of guessed at: imports of `createBunDbConnection`,
72
- `bunDbConnectionOptionsFromEnv`, `BunDbConnection`, `BunDbTx`, `BunDbRunner`,
73
- `BunDbConnectionOptions` and `DbPoolHandle` (removed without replacement), uses of `DB_PROVIDER`,
74
- and `createConnection` results that are not awaited directly.
75
-
76
- ```bash
77
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/db-factory.ts <dir> [--check | --dry-run | --write] [--no-format]
78
- ```
79
-
80
- Runs automatically via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then formats the
81
- changed files with Biome. `--check` exits 1 while any rewritable or manual site is left.
82
-
83
- ## tenant-db-options.ts
84
-
85
- Moves `createTenantDb(db, tenantId, mode, tracer, meter, signal, grants)` to the options object
86
- `createTenantDb({ db, tenantId, mode, tracer, meter, signal, grants })`. A call is only touched when
87
- the callee resolves (import, aliased import, namespace import or `await import(…)` destructuring) to
88
- the framework export; a local function with the same name is left alone. Arguments that are the
89
- identifier of the same name become shorthand, literal `undefined` arguments after `tenantId` are
90
- dropped, an explicit `mode` is kept, comments between the arguments are preserved. Idempotent —
91
- calls already passing one object literal are left alone.
92
-
93
- Reported as `manual` instead of guessed at: spread arguments, more than seven arguments, a single
94
- argument that is not an object literal, and `createTenantDb` used as a value (callback, assignment,
95
- `.bind`/`.call`/`.apply`).
96
-
97
- ```bash
98
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/tenant-db-options.ts <dir> [--check | --dry-run | --write] [--no-format]
99
- ```
100
-
101
- Runs automatically via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then formats the
102
- changed files with Biome. `--check` exits 1 while any rewritable or manual site is left.
103
-
104
- ## import-extensions
105
-
106
- Relative imports name the TypeScript source file: `./foo.js` becomes `./foo.ts`, `./Comp.jsx`
107
- becomes `./Comp.tsx`. Covers `import`, `export ... from`, `import type`, `import()` and
108
- `mock.module`. A specifier is rewritten only when the target exists with the new extension next to
109
- the importer; otherwise it is reported as `manual` and left alone.
110
-
111
- The tsconfig that compiles the code needs `allowImportingTsExtensions` and
112
- `rewriteRelativeImportExtensions` (TypeScript 5.7 or newer) first.
113
-
114
- ```bash
115
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/import-extensions.ts <dir> [--check | --dry-run | --write] [--no-format]
116
- ```
117
-
118
- Runs via `bun kumiko-upgrade --apply`. Without a mode flag it writes. `--check` exits 1 while any
119
- rewritable or manual site is left. The `import-extensions` guard (`kumiko check guards`) reports
120
- sites that are still on `.js`.
121
-
122
- ## remove-engine-payload-casts.ts
123
-
124
- `executor.detail()` and `executor.list()` from `createEntityExecutor` / `createEventStoreExecutor`
125
- return the entity's own row type (`EntityRow<E>`), so `row["f"] as T`, `row as T` and
126
- `(await executor.detail(…)) as unknown as T` are usually redundant. The codemod removes such a cast,
127
- and its `@cast-boundary` marker comment when no other cast stays in the statement, only when the
128
- operand derives from an executor read (directly, through `rows[0]`, property access, `??` or a
129
- single-assignment variable) and the type checker says its type is assignable to the cast target. A
130
- file is left untouched if removing the casts would add type errors to it.
131
-
132
- It type-checks against the tsconfig at or above each file, so run it with the new framework version
133
- installed. Reported as `manual` and left alone: casts the row type does not satisfy (for example a
134
- nullable column cast to a non-null type, or `rows[0]` under `noUncheckedIndexedAccess`), and files
135
- without a tsconfig. A call site that still needs a narrower type than the row gives keeps its cast.
136
-
137
- ```bash
138
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/remove-engine-payload-casts.ts <dir> [--check | --dry-run | --write] [--no-format]
139
- ```
140
-
141
- Runs via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then formats the changed files
142
- with Biome. `--check` exits 1 while any rewritable or manual site is left.
143
-
144
- ## package-merge.ts
145
-
146
- Packages folded into another package stay as re-export shims for one wave. The codemod rewrites
147
- imports, re-exports, `import("…")` and `mock.module` specifiers (including subpaths) of the old
148
- package to the new one, and in `package.json` replaces the old dependency with the target package
149
- (same version range, same block, skipped when the block already lists it). The moves are the rows
150
- of `PACKAGE_MERGE_MAPPINGS`: `@cosmicdrift/kumiko-http` to `@cosmicdrift/kumiko-framework/http`,
151
- `@cosmicdrift/kumiko-repo-manifest` to `@cosmicdrift/kumiko-guards/repo-manifest`,
152
- `@cosmicdrift/kumiko-headless` to `@cosmicdrift/kumiko-renderer/headless` (subpaths keep their name),
153
- `@cosmicdrift/kumiko-dispatcher-live` to `@cosmicdrift/kumiko-renderer/live`,
154
- `@cosmicdrift/kumiko-renderer-web` to `@cosmicdrift/kumiko-renderer/web` (so
155
- `@import "@cosmicdrift/kumiko-renderer-web/styles.css"` becomes
156
- `@import "@cosmicdrift/kumiko-renderer/web/styles.css"`).
157
-
158
- `.css` files are covered too: the specifier of `@import`, `@plugin` and `@config` is rewritten like
159
- an import. A `@source` path into `node_modules/<old package>/…` has no mechanical target and is
160
- reported as manual.
161
-
162
- ```bash
163
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/package-merge.ts <dir> [--check | --dry-run | --write] [--no-format]
164
- ```
165
-
166
- Runs via `bun kumiko-upgrade --apply`. Without a mode flag it writes. `--check` exits 1 while any
167
- site is left. Run your package manager's install afterwards to refresh the lockfile.
168
-
169
- ## feature-layout.ts
170
-
171
- Applies the feature layout rule "the runtime of a file follows from its path": everything
172
- under `src/features/<feature>/web/` is client code, the rest of the feature is server or
173
- isomorphic. Every file that carries a runtime-client marker outside `web/` moves to
174
- `<feature>/web/` (sub-structure kept), the relative imports, re-exports, `import()` calls and
175
- `mock.module` strings that point at it or out of it are rewritten, `package.json` export
176
- targets follow, and the marker is dropped. A marker the path already implies (client in
177
- `web/`, test in `__tests__/`) is only removed. Idempotent.
178
-
179
- ```bash
180
- bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/feature-layout.ts <dir> [--check | --dry-run | --write] [--no-format]
181
- ```
182
-
183
- Features are found as `src/features/<feature>/` and `bundled-features/src/<feature>/` below
184
- `<dir>`; `--feature-dir <dir>` names a directory that is itself one feature and
185
- `--features-root <dir>` one whose children are features. A target that already exists in
186
- `web/` and a marker no path rule covers (for example `dev` outside `dev/`) are reported as
187
- `manual` and left alone. `--check` exits 1 while anything is left.
@@ -1,334 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- import { dirname, join, relative, resolve } from "node:path";
3
- import {
4
- type ImportDeclaration,
5
- type ImportSpecifier,
6
- Node,
7
- type SourceFile,
8
- SyntaxKind,
9
- } from "ts-morph";
10
- import { collectSourceFiles } from "./collect-source-files.ts";
11
-
12
- export interface CodemodSite {
13
- readonly file: string;
14
- readonly line: number;
15
- readonly description: string;
16
- }
17
-
18
- export interface CodemodResult {
19
- readonly output: string;
20
- readonly rewrites: CodemodSite[];
21
- readonly manual: CodemodSite[];
22
- }
23
-
24
- export type SiteLists = { rewrites: CodemodSite[]; manual: CodemodSite[] };
25
-
26
- export const SCRIPT_EXTENSION = /\.(js|ts|tsx)$/;
27
-
28
- // A relative specifier below `<root><marker>...` is a module of that package's own source tree.
29
- export function sourceRelativeModule(
30
- specifier: string,
31
- filePath: string,
32
- sourceMarker: string,
33
- ): { readonly root: string; readonly module: string; readonly extension: string } | undefined {
34
- if (!specifier.startsWith(".")) return undefined;
35
- const resolved = resolve(dirname(filePath), specifier);
36
- const extension = SCRIPT_EXTENSION.exec(resolved)?.[0] ?? "";
37
- const stripped = resolved.slice(0, resolved.length - extension.length);
38
- const markerIndex = stripped.lastIndexOf(sourceMarker);
39
- if (markerIndex === -1) return undefined;
40
- return {
41
- root: stripped.slice(0, markerIndex + sourceMarker.length),
42
- module: stripped.slice(markerIndex + sourceMarker.length),
43
- extension,
44
- };
45
- }
46
-
47
- export function relativeSpecifier(
48
- fromFile: string,
49
- root: string,
50
- module: string,
51
- extension: string,
52
- ): string {
53
- const path = relative(dirname(fromFile), join(root, module)).split("\\").join("/");
54
- return `${path.startsWith(".") ? path : `./${path}`}${extension}`;
55
- }
56
-
57
- function stringLiteralOf(node: Node | undefined): Node | undefined {
58
- return node !== undefined && Node.isStringLiteral(node) ? node : undefined;
59
- }
60
-
61
- export interface TextEdit {
62
- readonly start: number;
63
- readonly end: number;
64
- readonly text: string;
65
- }
66
-
67
- export function applyEdits(source: string, edits: readonly TextEdit[]): string {
68
- let output = source;
69
- for (const edit of [...edits].sort((x, y) => y.start - x.start)) {
70
- output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
71
- }
72
- return output;
73
- }
74
-
75
- export function moduleSpecifierLiterals(sourceFile: SourceFile): Node[] {
76
- const literals: Node[] = [];
77
- for (const declaration of [
78
- ...sourceFile.getImportDeclarations(),
79
- ...sourceFile.getExportDeclarations(),
80
- ]) {
81
- const literal = declaration.getModuleSpecifier();
82
- if (literal !== undefined) literals.push(literal);
83
- }
84
- for (const importType of sourceFile.getDescendantsOfKind(SyntaxKind.ImportType)) {
85
- const argument = importType.getArgument();
86
- if (Node.isLiteralTypeNode(argument)) literals.push(argument.getLiteral());
87
- }
88
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
89
- const callee = call.getExpression();
90
- const isModuleLoad =
91
- callee.getKind() === SyntaxKind.ImportKeyword || callee.getText() === "mock.module";
92
- const literal = stringLiteralOf(call.getArguments()[0]);
93
- if (isModuleLoad && literal !== undefined) literals.push(literal);
94
- }
95
- return literals;
96
- }
97
-
98
- export function isPlainNamedImport(declaration: Node): boolean {
99
- return (
100
- Node.isImportDeclaration(declaration) &&
101
- declaration.getNamespaceImport() === undefined &&
102
- declaration.getDefaultImport() === undefined
103
- );
104
- }
105
-
106
- export function hasImportBinding(sourceFile: SourceFile, localName: string): boolean {
107
- return sourceFile
108
- .getImportDeclarations()
109
- .some(
110
- (declaration) =>
111
- declaration.getDefaultImport()?.getText() === localName ||
112
- declaration.getNamespaceImport()?.getText() === localName ||
113
- declaration
114
- .getNamedImports()
115
- .some((named) => (named.getAliasNode()?.getText() ?? named.getName()) === localName),
116
- );
117
- }
118
-
119
- // remove() would drop leading comments with the declaration (e.g. a file-level lint marker that
120
- // has to stay attached to the next statement), so only the declaration's own line goes.
121
- function removeDeclarationLine(
122
- sourceFile: SourceFile,
123
- declaration: { getStart(): number; getEnd(): number },
124
- ): void {
125
- const text = sourceFile.getFullText();
126
- const end = declaration.getEnd();
127
- const lineEnd = text[end] === "\n" ? end + 1 : end;
128
- sourceFile.replaceWithText(text.slice(0, declaration.getStart()) + text.slice(lineEnd));
129
- }
130
-
131
- export function removeNamedImport(
132
- sourceFile: SourceFile,
133
- declaration: ImportDeclaration,
134
- named: ImportSpecifier,
135
- ): void {
136
- if (declaration.getNamedImports().length > 1) {
137
- named.remove();
138
- } else {
139
- removeDeclarationLine(sourceFile, declaration);
140
- }
141
- }
142
-
143
- export function ensureNamedImport(
144
- sourceFile: SourceFile,
145
- specifier: string,
146
- name: string,
147
- isTypeOnly: boolean,
148
- ): void {
149
- const declarations = sourceFile.getImportDeclarations();
150
- const target = declarations.find(
151
- (declaration) =>
152
- declaration.getModuleSpecifierValue() === specifier &&
153
- declaration.isTypeOnly() === isTypeOnly &&
154
- isPlainNamedImport(declaration) &&
155
- declaration.getNamedImports().length > 0,
156
- );
157
- if (target === undefined) {
158
- sourceFile.addImportDeclaration({
159
- moduleSpecifier: specifier,
160
- namedImports: [name],
161
- isTypeOnly,
162
- });
163
- } else if (
164
- !target.getNamedImports().some((named) => named.getName() === name && !named.getAliasNode())
165
- ) {
166
- target.addNamedImport(name);
167
- }
168
- }
169
-
170
- function findBiomeBinary(startDir: string): string | undefined {
171
- let dir = resolve(startDir);
172
- for (;;) {
173
- const candidate = join(dir, "node_modules", ".bin", "biome");
174
- if (existsSync(candidate)) return candidate;
175
- const parent = dirname(dir);
176
- if (parent === dir) return undefined;
177
- dir = parent;
178
- }
179
- }
180
-
181
- const FORMAT_BATCH_SIZE = 50;
182
-
183
- export async function formatWithBiome(
184
- codemodName: string,
185
- files: readonly string[],
186
- cwd: string,
187
- ): Promise<void> {
188
- const biome = findBiomeBinary(cwd);
189
- if (biome === undefined) {
190
- console.log(
191
- `[${codemodName}] biome not found in node_modules/.bin — format and sort imports of the changed files yourself`,
192
- );
193
- // skip: formatting is a convenience, the rewrite itself is already on disk
194
- return;
195
- }
196
- for (let i = 0; i < files.length; i += FORMAT_BATCH_SIZE) {
197
- const batch = files.slice(i, i + FORMAT_BATCH_SIZE);
198
- const proc = Bun.spawn({
199
- cmd: [
200
- biome,
201
- "check",
202
- "--write",
203
- "--linter-enabled=false",
204
- "--no-errors-on-unmatched",
205
- ...batch,
206
- ],
207
- cwd,
208
- stdout: "pipe",
209
- stderr: "pipe",
210
- });
211
- const [stderr, exitCode] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
212
- if (exitCode !== 0) {
213
- console.log(
214
- `[${codemodName}] biome exited ${exitCode}; run it on the changed files yourself\n${stderr.trim()}`,
215
- );
216
- }
217
- }
218
- }
219
-
220
- type Mode = "write" | "dry-run" | "check";
221
-
222
- interface CliOptions {
223
- readonly mode: Mode;
224
- readonly format: boolean;
225
- readonly paths: string[];
226
- }
227
-
228
- class CliError extends Error {}
229
-
230
- function parseArgs(argv: readonly string[]): CliOptions {
231
- let mode: Mode | undefined;
232
- let format = true;
233
- const paths: string[] = [];
234
- const setMode = (next: Mode): void => {
235
- if (mode !== undefined && mode !== next) {
236
- throw new CliError("--check, --dry-run and --write are mutually exclusive");
237
- }
238
- mode = next;
239
- };
240
- for (const arg of argv) {
241
- if (arg === "--check") setMode("check");
242
- else if (arg === "--dry-run") setMode("dry-run");
243
- else if (arg === "--write") setMode("write");
244
- else if (arg === "--no-format") format = false;
245
- else if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
246
- else paths.push(arg);
247
- }
248
- if (paths.length === 0) throw new CliError("at least one target directory is required");
249
- return { mode: mode ?? "write", format, paths };
250
- }
251
-
252
- function isSourceFileName(name: string): boolean {
253
- return /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts");
254
- }
255
-
256
- function displayPath(file: string): string {
257
- const fromCwd = relative(process.cwd(), file);
258
- return fromCwd.startsWith("..") ? file : fromCwd;
259
- }
260
-
261
- export interface CodemodCliConfig {
262
- readonly name: string;
263
- readonly transform: (source: string, filePath: string) => CodemodResult;
264
- readonly isSkippedPath: (file: string) => boolean;
265
- // Exact file names (e.g. package.json) handed to transform next to the .ts/.tsx sources.
266
- readonly extraFileNames?: readonly string[];
267
- // File extensions (e.g. ".css") handed to transform next to the .ts/.tsx sources.
268
- readonly extraExtensions?: readonly string[];
269
- }
270
-
271
- function parseArgsOrExit(codemodName: string, argv: readonly string[]): CliOptions {
272
- try {
273
- return parseArgs(argv);
274
- } catch (err) {
275
- if (err instanceof CliError) {
276
- console.error(`[${codemodName}] ${err.message}`);
277
- process.exit(2);
278
- }
279
- throw err;
280
- }
281
- }
282
-
283
- function transformFiles(
284
- config: CodemodCliConfig,
285
- files: readonly string[],
286
- mode: Mode,
287
- ): { rewrites: CodemodSite[]; manual: CodemodSite[]; changedFiles: string[] } {
288
- const rewrites: CodemodSite[] = [];
289
- const manual: CodemodSite[] = [];
290
- const changedFiles: string[] = [];
291
- for (const file of files) {
292
- const before = readFileSync(file, "utf8");
293
- const result = config.transform(before, file);
294
- const shown = displayPath(file);
295
- for (const site of result.rewrites)
296
- console.log(`${shown}:${site.line} rewritten ${site.description}`);
297
- for (const site of result.manual)
298
- console.log(`${shown}:${site.line} manual ${site.description}`);
299
- rewrites.push(...result.rewrites);
300
- manual.push(...result.manual);
301
- if (mode === "write" && result.output !== before) {
302
- writeFileSync(file, result.output);
303
- changedFiles.push(file);
304
- }
305
- }
306
- return { rewrites, manual, changedFiles };
307
- }
308
-
309
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
310
- // while any rewritable or manual site is left; --dry-run only reports.
311
- export async function runCodemodCli(
312
- config: CodemodCliConfig,
313
- argv: readonly string[],
314
- ): Promise<void> {
315
- const options = parseArgsOrExit(config.name, argv);
316
- const files = collectSourceFiles(options.paths, {
317
- isMigratableFile: (name) =>
318
- isSourceFileName(name) ||
319
- (config.extraFileNames?.includes(name) ?? false) ||
320
- (config.extraExtensions?.some((extension) => name.endsWith(extension)) ?? false),
321
- }).filter((file) => !(file.includes("/__tests__/fixtures/") || config.isSkippedPath(file)));
322
- const { rewrites, manual, changedFiles } = transformFiles(config, files, options.mode);
323
- console.log(
324
- `\n[${config.name}] ${options.mode === "write" ? "rewritten" : "rewritable"}: ${rewrites.length} site(s) in ${new Set(rewrites.map((site) => site.file)).size} file(s); manual: ${manual.length}`,
325
- );
326
- if (options.mode === "write" && options.format && changedFiles.length > 0) {
327
- await formatWithBiome(
328
- config.name,
329
- changedFiles.filter((file) => isSourceFileName(file)),
330
- resolve(options.paths[0] ?? "."),
331
- );
332
- }
333
- process.exit(options.mode === "check" && rewrites.length + manual.length > 0 ? 1 : 0);
334
- }
@@ -1,48 +0,0 @@
1
- import { lstatSync, readdirSync, statSync } from "node:fs";
2
- import { join, resolve } from "node:path";
3
-
4
- const BUILD_AND_VENDOR_DIR_NAMES: readonly string[] = [
5
- "node_modules",
6
- "dist",
7
- "build",
8
- ".next",
9
- ".git",
10
- ];
11
-
12
- export interface CollectSourceFilesOptions {
13
- readonly isMigratableFile: (name: string) => boolean;
14
- readonly extraSkippedDirNames?: readonly string[];
15
- }
16
-
17
- export function collectSourceFiles(
18
- paths: readonly string[],
19
- options: CollectSourceFilesOptions,
20
- ): string[] {
21
- const skippedDirNames = new Set([
22
- ...BUILD_AND_VENDOR_DIR_NAMES,
23
- ...(options.extraSkippedDirNames ?? []),
24
- ]);
25
-
26
- function walkDir(dir: string, out: string[]): void {
27
- for (const name of readdirSync(dir)) {
28
- if (skippedDirNames.has(name)) continue;
29
- const full = join(dir, name);
30
- const stat = lstatSync(full);
31
- // Symlinks can point back at a parent directory (workspace links) and loop forever.
32
- if (stat.isSymbolicLink()) continue;
33
- if (stat.isDirectory()) {
34
- walkDir(full, out);
35
- continue;
36
- }
37
- if (options.isMigratableFile(name)) out.push(full);
38
- }
39
- }
40
-
41
- const files: string[] = [];
42
- for (const p of paths) {
43
- const abs = resolve(p);
44
- if (statSync(abs).isDirectory()) walkDir(abs, files);
45
- else if (options.isMigratableFile(abs)) files.push(abs);
46
- }
47
- return files;
48
- }