@cosmicdrift/kumiko-framework 0.389.0 → 0.390.0

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