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