@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,318 +0,0 @@
1
- #!/usr/bin/env bun
2
- // remove-engine-payload-casts — executor.detail()/list() now return the entity's own row type
3
- // (EntityRow<E>), so casts that used to narrow the untyped Record are redundant. This removes
4
- // `row as T` / `row["f"] as T` / `(await x.detail(...)) as unknown as T` (and the
5
- // `@cast-boundary` marker of that cast) where the operand derives from an executor read AND
6
- // the checker says its type is assignable to T. Casts the row type does not satisfy stay and
7
- // are listed as manual. A file whose rewrite would add type errors is left untouched.
8
- //
9
- // Usage:
10
- // bun scripts/codemod/remove-engine-payload-casts.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
11
- //
12
- // Needs a tsconfig.json at or above the target: the assignability check runs on the real
13
- // program, so the framework version the app compiles against decides the row type.
14
-
15
- import { dirname, resolve } from "node:path";
16
- import { type AsExpression, Node, Project, type SourceFile, SyntaxKind, ts } from "ts-morph";
17
- import { type CodemodResult, runCodemodCli } from "./codemod-support.ts";
18
-
19
- const CAST_MARKER = "@cast-boundary";
20
- const EXECUTOR_TYPES_FILE = "/event-store-executor-types.ts";
21
- const READ_VERBS: ReadonlySet<string> = new Set(["detail", "list"]);
22
- const READ_CALL_PREFILTER = /\.(detail|list)\(/;
23
- const CAST_PREFILTER = /\bas\s/;
24
- const MAX_DERIVATION_DEPTH = 8;
25
- const MAX_TYPE_TEXT_LENGTH = 120;
26
-
27
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
28
- "packages/framework/src/scripts/codemod/remove-engine-payload-casts.ts",
29
- "packages/framework/src/__tests__/remove-engine-payload-casts-codemod.test.ts",
30
- ];
31
-
32
- interface Edit {
33
- readonly start: number;
34
- readonly end: number;
35
- readonly text: string;
36
- }
37
-
38
- function stripWrappers(node: Node): Node {
39
- let current = node;
40
- for (;;) {
41
- if (Node.isParenthesizedExpression(current) || Node.isNonNullExpression(current)) {
42
- current = current.getExpression();
43
- } else if (Node.isAwaitExpression(current)) {
44
- current = current.getExpression();
45
- } else {
46
- return current;
47
- }
48
- }
49
- }
50
-
51
- function isCastTo(node: Node, keyword: SyntaxKind): boolean {
52
- return Node.isAsExpression(node) && node.getTypeNode()?.getKind() === keyword;
53
- }
54
-
55
- function isExecutorReadCall(node: Node): boolean {
56
- if (!Node.isCallExpression(node)) return false;
57
- const callee = node.getExpression();
58
- if (!Node.isPropertyAccessExpression(callee) || !READ_VERBS.has(callee.getName())) return false;
59
- const declarations = callee.getNameNode().getSymbol()?.getDeclarations() ?? [];
60
- return declarations.some((declaration) =>
61
- declaration.getSourceFile().getFilePath().endsWith(EXECUTOR_TYPES_FILE),
62
- );
63
- }
64
-
65
- // Follows property/element access, `??` / `||` and single-assignment variables back to an
66
- // executor read. Anything else (parameters, callbacks, reassigned lets) is not recognised.
67
- function derivesFromExecutorRead(node: Node, depth = 0): boolean {
68
- if (depth > MAX_DERIVATION_DEPTH) return false;
69
- const current = stripWrappers(node);
70
- if (Node.isCallExpression(current)) return isExecutorReadCall(current);
71
- if (Node.isPropertyAccessExpression(current) || Node.isElementAccessExpression(current)) {
72
- return derivesFromExecutorRead(current.getExpression(), depth + 1);
73
- }
74
- if (Node.isBinaryExpression(current)) {
75
- const operator = current.getOperatorToken().getKind();
76
- return (
77
- (operator === SyntaxKind.QuestionQuestionToken || operator === SyntaxKind.BarBarToken) &&
78
- derivesFromExecutorRead(current.getLeft(), depth + 1)
79
- );
80
- }
81
- if (Node.isIdentifier(current)) {
82
- const declarations = current.getDefinitionNodes();
83
- const declaration = declarations.length === 1 ? declarations[0] : undefined;
84
- if (declaration === undefined || !Node.isVariableDeclaration(declaration)) return false;
85
- const initializer = declaration.getInitializer();
86
- return initializer !== undefined && derivesFromExecutorRead(initializer, depth + 1);
87
- }
88
- return false;
89
- }
90
-
91
- function innermostOperand(cast: AsExpression): Node {
92
- let operand = cast.getExpression();
93
- while (isCastTo(stripParenthesesOnly(operand), SyntaxKind.UnknownKeyword)) {
94
- const inner = stripParenthesesOnly(operand);
95
- if (!Node.isAsExpression(inner)) break;
96
- operand = inner.getExpression();
97
- }
98
- return operand;
99
- }
100
-
101
- function stripParenthesesOnly(node: Node): Node {
102
- let current = node;
103
- while (Node.isParenthesizedExpression(current)) current = current.getExpression();
104
- return current;
105
- }
106
-
107
- function enclosingStatement(node: Node): Node | undefined {
108
- return node.getFirstAncestor((ancestor) => {
109
- const parent = ancestor.getParent();
110
- return (
111
- parent !== undefined &&
112
- (Node.isBlock(parent) ||
113
- Node.isSourceFile(parent) ||
114
- Node.isModuleBlock(parent) ||
115
- Node.isCaseClause(parent) ||
116
- Node.isDefaultClause(parent))
117
- );
118
- });
119
- }
120
-
121
- function isRemovableCastKind(cast: AsExpression): boolean {
122
- return !isCastTo(cast, SyntaxKind.ConstKeyword);
123
- }
124
-
125
- function remainingCasts(statement: Node, removed: ReadonlySet<Node>): number {
126
- return statement
127
- .getDescendantsOfKind(SyntaxKind.AsExpression)
128
- .filter((candidate) => isRemovableCastKind(candidate) && !removed.has(candidate)).length;
129
- }
130
-
131
- function lineEnd(text: string, from: number): number {
132
- const newline = text.indexOf("\n", from);
133
- return newline === -1 ? text.length : newline;
134
- }
135
-
136
- // The marker sits as trailing line comment of the cast's line or of the statement's last line,
137
- // or as its own comment line(s) directly above the statement.
138
- function markerEdits(source: string, statement: Node, cast: AsExpression): Edit[] {
139
- const edits: Edit[] = [];
140
- for (const from of new Set([cast.getEnd(), statement.getEnd()])) {
141
- const end = lineEnd(source, from);
142
- const rest = source.slice(from, end);
143
- const commentStart = rest.indexOf("//");
144
- if (commentStart === -1 || !rest.slice(commentStart).includes(CAST_MARKER)) continue;
145
- const start = from + commentStart;
146
- const spaces = /[ \t]*$/.exec(source.slice(0, start))?.[0].length ?? 0;
147
- edits.push({ start: start - spaces, end, text: "" });
148
- }
149
- for (const range of statement.getLeadingCommentRanges()) {
150
- if (!range.getText().includes(CAST_MARKER)) continue;
151
- const start = source.lastIndexOf("\n", range.getPos() - 1) + 1;
152
- const end = source[range.getEnd()] === "\n" ? range.getEnd() + 1 : range.getEnd();
153
- edits.push({ start, end, text: "" });
154
- }
155
- return edits;
156
- }
157
-
158
- function shortTypeText(text: string): string {
159
- const oneLine = text.replace(/\s+/g, " ");
160
- return oneLine.length <= MAX_TYPE_TEXT_LENGTH
161
- ? oneLine
162
- : `${oneLine.slice(0, MAX_TYPE_TEXT_LENGTH)}...`;
163
- }
164
-
165
- function applyEdits(source: string, edits: readonly Edit[]): string {
166
- const unique = new Map<number, Edit>();
167
- for (const edit of edits) unique.set(edit.start, edit);
168
- let output = source;
169
- for (const edit of [...unique.values()].sort((a, b) => b.start - a.start)) {
170
- output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
171
- }
172
- return output;
173
- }
174
-
175
- function diagnosticCount(sourceFile: SourceFile): number {
176
- return sourceFile.getProject().getProgram().getSemanticDiagnostics(sourceFile).length;
177
- }
178
-
179
- function addsTypeErrors(sourceFile: SourceFile, source: string, output: string): boolean {
180
- const errorsBefore = diagnosticCount(sourceFile);
181
- sourceFile.replaceWithText(output);
182
- const errorsAfter = diagnosticCount(sourceFile);
183
- sourceFile.replaceWithText(source);
184
- return errorsAfter > errorsBefore;
185
- }
186
-
187
- function markerEditsForTouched(
188
- source: string,
189
- touchedStatements: ReadonlyMap<Node, readonly AsExpression[]>,
190
- removed: ReadonlySet<Node>,
191
- ): Edit[] {
192
- const edits: Edit[] = [];
193
- for (const [statement, casts] of touchedStatements) {
194
- const [first] = casts;
195
- if (first !== undefined && remainingCasts(statement, removed) === 0) {
196
- edits.push(...markerEdits(source, statement, first));
197
- }
198
- }
199
- return edits;
200
- }
201
-
202
- function skippedForTypeErrors(
203
- source: string,
204
- rewrites: CodemodResult["rewrites"],
205
- manual: CodemodResult["rewrites"],
206
- ): CodemodResult {
207
- return {
208
- output: source,
209
- rewrites: [],
210
- manual: [
211
- ...manual,
212
- ...rewrites.map((site) => ({
213
- ...site,
214
- description: `${site.description} — skipped: removing it adds type errors in this file`,
215
- })),
216
- ],
217
- };
218
- }
219
-
220
- export function transformEnginePayloadCastsFile(
221
- sourceFile: SourceFile,
222
- filePath: string,
223
- ): CodemodResult {
224
- const source = sourceFile.getFullText();
225
- const result: CodemodResult = { output: source, rewrites: [], manual: [] };
226
- const rewrites = [...result.rewrites];
227
- const manual = [...result.manual];
228
- const edits: Edit[] = [];
229
- const removed = new Set<Node>();
230
- const touchedStatements = new Map<Node, AsExpression[]>();
231
-
232
- for (const cast of sourceFile.getDescendantsOfKind(SyntaxKind.AsExpression)) {
233
- const typeNode = cast.getTypeNode();
234
- if (typeNode === undefined || !isRemovableCastKind(cast)) continue;
235
- if (isCastTo(cast, SyntaxKind.UnknownKeyword)) continue;
236
- const operand = innermostOperand(cast);
237
- if (!derivesFromExecutorRead(operand)) continue;
238
- const line = cast.getStartLineNumber();
239
- const operandType = operand.getType();
240
- if (!operandType.isAssignableTo(typeNode.getType())) {
241
- manual.push({
242
- file: filePath,
243
- line,
244
- description: `cast to ${shortTypeText(typeNode.getText())} kept: ${shortTypeText(operandType.getText(cast))} is not assignable to it`,
245
- });
246
- continue;
247
- }
248
- edits.push({ start: cast.getStart(), end: cast.getEnd(), text: operand.getText() });
249
- removed.add(cast);
250
- // The inner `as unknown` of a double cast disappears with the outer cast.
251
- for (const inner of cast.getDescendantsOfKind(SyntaxKind.AsExpression)) removed.add(inner);
252
- const statement = enclosingStatement(cast);
253
- if (statement !== undefined) {
254
- touchedStatements.set(statement, [...(touchedStatements.get(statement) ?? []), cast]);
255
- }
256
- rewrites.push({
257
- file: filePath,
258
- line,
259
- description: `removed cast to ${shortTypeText(typeNode.getText())}, the executor row type already satisfies it`,
260
- });
261
- }
262
-
263
- edits.push(...markerEditsForTouched(source, touchedStatements, removed));
264
-
265
- if (edits.length === 0) return { output: source, rewrites, manual };
266
-
267
- const output = applyEdits(source, edits);
268
- if (addsTypeErrors(sourceFile, source, output)) {
269
- return skippedForTypeErrors(source, rewrites, manual);
270
- }
271
- return { output, rewrites, manual };
272
- }
273
-
274
- const projectsByTsconfig = new Map<string, Project>();
275
-
276
- function projectFor(filePath: string): Project | undefined {
277
- const tsconfig = ts.findConfigFile(dirname(resolve(filePath)), ts.sys.fileExists);
278
- if (tsconfig === undefined) return undefined;
279
- const cached = projectsByTsconfig.get(tsconfig);
280
- if (cached !== undefined) return cached;
281
- const project = new Project({ tsConfigFilePath: tsconfig, skipAddingFilesFromTsConfig: true });
282
- projectsByTsconfig.set(tsconfig, project);
283
- return project;
284
- }
285
-
286
- // `project` decides which program answers the assignability question; without one the tsconfig
287
- // next to the file is used. A file without any tsconfig is reported as manual, not guessed at.
288
- export function transformEnginePayloadCastsSource(
289
- source: string,
290
- filePath = "source.ts",
291
- project?: Project,
292
- ): CodemodResult {
293
- const unchanged: CodemodResult = { output: source, rewrites: [], manual: [] };
294
- if (!READ_CALL_PREFILTER.test(source) || !CAST_PREFILTER.test(source)) return unchanged;
295
- const absolutePath = resolve(filePath);
296
- const program = project ?? projectFor(absolutePath);
297
- if (program === undefined) {
298
- return {
299
- ...unchanged,
300
- manual: [
301
- { file: filePath, line: 1, description: "no tsconfig.json found, cannot type-check" },
302
- ],
303
- };
304
- }
305
- const sourceFile = program.createSourceFile(absolutePath, source, { overwrite: true });
306
- return transformEnginePayloadCastsFile(sourceFile, filePath);
307
- }
308
-
309
- if (import.meta.main) {
310
- await runCodemodCli(
311
- {
312
- name: "remove-engine-payload-casts",
313
- transform: (source, filePath) => transformEnginePayloadCastsSource(source, filePath),
314
- isSkippedPath: (file) => SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix)),
315
- },
316
- process.argv.slice(2),
317
- );
318
- }
@@ -1,236 +0,0 @@
1
- #!/usr/bin/env bun
2
- // s3-imports — the S3 file providers merged into one `file-provider-s3` subpath:
3
- // .../files-provider-s3 -> .../file-provider-s3/lib
4
- // fileProviderS3EnvFeature (.../file-provider-s3-env) -> createFileProviderS3Feature({ fromEnv: true })
5
- // `fileProviderS3Feature` -> `createFileProviderS3Feature()` is feature-factory.ts's job; the two
6
- // codemods leave the same result in either order.
7
- //
8
- // Usage:
9
- // bun scripts/codemod/s3-imports.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
10
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
11
- // while any rewritable or manual site is left; --dry-run only reports.
12
-
13
- import { type ImportDeclaration, Node, Project, type SourceFile } from "ts-morph";
14
- import {
15
- applyEdits,
16
- type CodemodResult,
17
- type CodemodSite,
18
- ensureNamedImport,
19
- hasImportBinding,
20
- moduleSpecifierLiterals,
21
- relativeSpecifier,
22
- removeNamedImport,
23
- runCodemodCli,
24
- type SiteLists,
25
- sourceRelativeModule,
26
- type TextEdit,
27
- } from "./codemod-support.ts";
28
-
29
- const BUNDLED_PACKAGE = "@cosmicdrift/kumiko-bundled-features";
30
- const BUNDLED_SRC_MARKER = "/packages/bundled-features/src/";
31
- const OLD_LIB_FOLDER = "files-provider-s3";
32
- const NEW_LIB_MODULE = "file-provider-s3/lib";
33
- const ENV_FOLDER = "file-provider-s3-env";
34
- const MERGED_FOLDER = "file-provider-s3";
35
- const ENV_CONSTANT = "fileProviderS3EnvFeature";
36
- const MERGED_FACTORY = "createFileProviderS3Feature";
37
- const ENV_CALL = `${MERGED_FACTORY}({ fromEnv: true })`;
38
-
39
- const CHEAP_PREFILTER = /files-provider-s3|fileProviderS3EnvFeature/;
40
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
41
- "packages/bundled-features/src/files-provider-s3/index.ts",
42
- "packages/bundled-features/src/file-provider-s3-env/index.ts",
43
- "packages/framework/src/scripts/codemod/s3-imports.ts",
44
- "packages/framework/src/__tests__/s3-imports-codemod.test.ts",
45
- ];
46
-
47
- function newLibSpecifier(specifier: string, filePath: string): string | undefined {
48
- if (specifier === `${BUNDLED_PACKAGE}/${OLD_LIB_FOLDER}`) {
49
- return `${BUNDLED_PACKAGE}/${NEW_LIB_MODULE}`;
50
- }
51
- const relativeModule = sourceRelativeModule(specifier, filePath, BUNDLED_SRC_MARKER);
52
- if (relativeModule === undefined) return undefined;
53
- const { root, module, extension } = relativeModule;
54
- if (module !== OLD_LIB_FOLDER && !module.startsWith(`${OLD_LIB_FOLDER}/`)) return undefined;
55
- return relativeSpecifier(
56
- filePath,
57
- root,
58
- `${NEW_LIB_MODULE}${module.slice(OLD_LIB_FOLDER.length)}`,
59
- extension,
60
- );
61
- }
62
-
63
- function envModuleReplacement(specifier: string, filePath: string): string | undefined {
64
- if (specifier === `${BUNDLED_PACKAGE}/${ENV_FOLDER}`) {
65
- return `${BUNDLED_PACKAGE}/${MERGED_FOLDER}`;
66
- }
67
- const relativeModule = sourceRelativeModule(specifier, filePath, BUNDLED_SRC_MARKER);
68
- if (relativeModule === undefined) return undefined;
69
- const { root, module, extension } = relativeModule;
70
- if (module !== ENV_FOLDER && !/^file-provider-s3-env\/(index|feature)$/.test(module)) {
71
- return undefined;
72
- }
73
- return relativeSpecifier(
74
- filePath,
75
- root,
76
- `${MERGED_FOLDER}${module.slice(ENV_FOLDER.length)}`,
77
- extension,
78
- );
79
- }
80
-
81
- function site(file: string, node: Node, description: string): CodemodSite {
82
- return { file, line: node.getStartLineNumber(), description };
83
- }
84
-
85
- function rewriteLibSpecifiers(
86
- sourceFile: SourceFile,
87
- source: string,
88
- filePath: string,
89
- result: SiteLists,
90
- ): string {
91
- const edits: TextEdit[] = [];
92
- for (const literal of moduleSpecifierLiterals(sourceFile)) {
93
- if (!Node.isStringLiteral(literal)) continue;
94
- const current = literal.getLiteralValue();
95
- const next = newLibSpecifier(current, filePath);
96
- if (next === undefined) continue;
97
- result.rewrites.push(site(filePath, literal, `${current} -> ${next}`));
98
- edits.push({ start: literal.getStart(), end: literal.getEnd(), text: JSON.stringify(next) });
99
- }
100
- return applyEdits(source, edits);
101
- }
102
-
103
- function envFactoryEdit(reference: Node): TextEdit | "manual-type" | "manual-export" {
104
- const parent = reference.getParent();
105
- if (Node.isTypeQuery(parent)) return "manual-type";
106
- if (Node.isExportSpecifier(parent)) return "manual-export";
107
- const text = Node.isShorthandPropertyAssignment(parent)
108
- ? `${ENV_CONSTANT}: ${ENV_CALL}`
109
- : ENV_CALL;
110
- return { start: reference.getStart(), end: reference.getEnd(), text };
111
- }
112
-
113
- interface EnvImportTarget {
114
- readonly specifier: string;
115
- readonly isTypeOnly: boolean;
116
- }
117
-
118
- // Collects the call-site edits of one import declaration. Returns false when a site can only be
119
- // fixed by hand, so the import is left untouched too.
120
- function planEnvDeclaration(
121
- declaration: ImportDeclaration,
122
- filePath: string,
123
- edits: TextEdit[],
124
- result: SiteLists,
125
- ): boolean {
126
- const named = declaration.getNamedImports().find((n) => n.getName() === ENV_CONSTANT);
127
- if (named === undefined) return false;
128
- const nameNode = named.getNameNode();
129
- if (named.getAliasNode() !== undefined || !Node.isIdentifier(nameNode)) {
130
- result.manual.push(
131
- site(filePath, named, `${ENV_CONSTANT} imported under an alias: call ${ENV_CALL} by hand`),
132
- );
133
- return false;
134
- }
135
- const references = nameNode
136
- .findReferencesAsNodes()
137
- .filter((reference) => reference.getFirstAncestor((a) => a === declaration) === undefined);
138
- const planned = references.map((reference) => ({ reference, edit: envFactoryEdit(reference) }));
139
- const blocked = planned.filter(({ edit }) => typeof edit === "string");
140
- for (const { reference, edit } of blocked) {
141
- result.manual.push(
142
- site(
143
- filePath,
144
- reference,
145
- edit === "manual-type"
146
- ? `typeof ${ENV_CONSTANT}: use the return type of ${MERGED_FACTORY} by hand`
147
- : `${ENV_CONSTANT} is exported from this module: export ${MERGED_FACTORY} as well`,
148
- ),
149
- );
150
- }
151
- if (blocked.length > 0) return false;
152
- for (const { reference, edit } of planned) {
153
- if (typeof edit === "string") continue;
154
- edits.push(edit);
155
- result.rewrites.push(site(filePath, reference, `${ENV_CONSTANT} -> ${ENV_CALL}`));
156
- }
157
- return true;
158
- }
159
-
160
- function rewriteEnvFeature(source: string, filePath: string, result: SiteLists): string {
161
- const project = new Project({
162
- useInMemoryFileSystem: true,
163
- skipAddingFilesFromTsConfig: true,
164
- skipFileDependencyResolution: true,
165
- });
166
- const sourceFile = project.createSourceFile(filePath, source);
167
- const edits: TextEdit[] = [];
168
- const targetSpecifiers: EnvImportTarget[] = [];
169
- for (const declaration of sourceFile.getImportDeclarations()) {
170
- const replacement = envModuleReplacement(declaration.getModuleSpecifierValue(), filePath);
171
- if (replacement === undefined) continue;
172
- if (!planEnvDeclaration(declaration, filePath, edits, result)) continue;
173
- targetSpecifiers.push({ specifier: replacement, isTypeOnly: declaration.isTypeOnly() });
174
- }
175
- if (targetSpecifiers.length === 0) return source;
176
-
177
- const next = project.createSourceFile(`${filePath}.rewritten.ts`, applyEdits(source, edits));
178
- for (const { specifier, isTypeOnly } of targetSpecifiers) {
179
- const declaration = next
180
- .getImportDeclarations()
181
- .find((d) => d.getNamedImports().some((n) => n.getName() === ENV_CONSTANT));
182
- const named = declaration?.getNamedImports().find((n) => n.getName() === ENV_CONSTANT);
183
- if (declaration === undefined || named === undefined) continue;
184
- result.rewrites.push(
185
- site(filePath, named, `import ${ENV_CONSTANT} -> ${MERGED_FACTORY} from ${specifier}`),
186
- );
187
- removeNamedImport(next, declaration, named);
188
- if (!hasImportBinding(next, MERGED_FACTORY)) {
189
- ensureNamedImport(next, specifier, MERGED_FACTORY, isTypeOnly);
190
- }
191
- }
192
- return next.getFullText();
193
- }
194
-
195
- function reportEnvReexports(sourceFile: SourceFile, filePath: string, result: SiteLists): void {
196
- for (const declaration of sourceFile.getExportDeclarations()) {
197
- const specifier = declaration.getModuleSpecifierValue();
198
- if (specifier === undefined || envModuleReplacement(specifier, filePath) === undefined)
199
- continue;
200
- if (declaration.getNamedExports().some((e) => e.getName() === ENV_CONSTANT)) {
201
- result.manual.push(
202
- site(
203
- filePath,
204
- declaration,
205
- `${ENV_CONSTANT} re-exported from ${specifier}: re-export ${MERGED_FACTORY}`,
206
- ),
207
- );
208
- }
209
- }
210
- }
211
-
212
- export function transformS3ImportsSource(source: string, filePath = "source.ts"): CodemodResult {
213
- const result: SiteLists = { rewrites: [], manual: [] };
214
- if (!CHEAP_PREFILTER.test(source)) return { output: source, ...result };
215
- const project = new Project({
216
- useInMemoryFileSystem: true,
217
- skipAddingFilesFromTsConfig: true,
218
- skipFileDependencyResolution: true,
219
- });
220
- const sourceFile = project.createSourceFile(filePath, source);
221
- reportEnvReexports(sourceFile, filePath, result);
222
- const libRewritten = rewriteLibSpecifiers(sourceFile, source, filePath, result);
223
- const output = rewriteEnvFeature(libRewritten, filePath, result);
224
- return { output, ...result };
225
- }
226
-
227
- function isSkippedPath(file: string): boolean {
228
- return SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix));
229
- }
230
-
231
- if (import.meta.main) {
232
- await runCodemodCli(
233
- { name: "s3-imports", transform: transformS3ImportsSource, isSkippedPath },
234
- process.argv.slice(2),
235
- );
236
- }