@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,161 +0,0 @@
1
- import { dirname, relative, resolve } from "node:path";
2
-
3
- export type OldModule =
4
- | "stack"
5
- | "stack-test-users"
6
- | "stack-other"
7
- | "testing"
8
- | "testing-handler-context"
9
- | "testing-real-providers"
10
- | "testing-e2e-generator"
11
- | "testing-other";
12
-
13
- export type MoveTargetId =
14
- | "testing-stack"
15
- | "testing-helpers"
16
- | "testing-real-providers"
17
- | "testing-e2e-generator"
18
- | "framework-seeding"
19
- | "framework-engine";
20
-
21
- interface MoveTarget {
22
- readonly packageSpecifier: string;
23
- readonly sourcePath: string;
24
- readonly owner: "framework" | "testing";
25
- }
26
-
27
- const FRAMEWORK_PACKAGE = "@cosmicdrift/kumiko-framework";
28
- const TESTING_PACKAGE = "@cosmicdrift/kumiko-testing";
29
-
30
- const TARGETS: Readonly<Record<MoveTargetId, MoveTarget>> = {
31
- "testing-stack": {
32
- packageSpecifier: `${TESTING_PACKAGE}/stack`,
33
- sourcePath: "packages/testing/src/stack/index",
34
- owner: "testing",
35
- },
36
- "testing-helpers": {
37
- packageSpecifier: `${TESTING_PACKAGE}/helpers`,
38
- sourcePath: "packages/testing/src/helpers/index",
39
- owner: "testing",
40
- },
41
- "testing-real-providers": {
42
- packageSpecifier: `${TESTING_PACKAGE}/helpers/real-providers`,
43
- sourcePath: "packages/testing/src/helpers/real-providers",
44
- owner: "testing",
45
- },
46
- "testing-e2e-generator": {
47
- packageSpecifier: `${TESTING_PACKAGE}/helpers/e2e-generator`,
48
- sourcePath: "packages/testing/src/helpers/e2e-generator",
49
- owner: "testing",
50
- },
51
- "framework-seeding": {
52
- packageSpecifier: `${FRAMEWORK_PACKAGE}/seeding`,
53
- sourcePath: "packages/framework/src/seeding/seed-users",
54
- owner: "framework",
55
- },
56
- "framework-engine": {
57
- packageSpecifier: `${FRAMEWORK_PACKAGE}/engine`,
58
- sourcePath: "packages/framework/src/engine/bridge-stub",
59
- owner: "framework",
60
- },
61
- };
62
-
63
- const SEEDING_NAMES: ReadonlySet<string> = new Set([
64
- "TestUsers",
65
- "testTenantId",
66
- "testUserId",
67
- "createTestUser",
68
- ]);
69
- const BRIDGE_STUB_NAME = "bridgeStub";
70
-
71
- const PACKAGE_SPECIFIER_MODULES: Readonly<Record<string, OldModule>> = {
72
- [`${FRAMEWORK_PACKAGE}/stack`]: "stack",
73
- [`${FRAMEWORK_PACKAGE}/testing`]: "testing",
74
- [`${FRAMEWORK_PACKAGE}/testing/handler-context`]: "testing-handler-context",
75
- [`${FRAMEWORK_PACKAGE}/testing/real-providers`]: "testing-real-providers",
76
- [`${FRAMEWORK_PACKAGE}/testing/e2e-generator`]: "testing-e2e-generator",
77
- };
78
-
79
- const FRAMEWORK_SOURCE_DIRS = /\/packages\/framework\/src\/(stack|testing)(?:\/([^/]+))?$/;
80
- const SCRIPT_EXTENSION = /\.(?:js|ts|tsx)$/;
81
-
82
- export function classifyPackageSpecifier(specifier: string): OldModule | undefined {
83
- return PACKAGE_SPECIFIER_MODULES[specifier];
84
- }
85
-
86
- function oldTestingModule(file: string | undefined): OldModule {
87
- if (file === "handler-context") return "testing-handler-context";
88
- if (file === "real-providers") return "testing-real-providers";
89
- if (file === "e2e-generator") return "testing-e2e-generator";
90
- return file === undefined ? "testing" : "testing-other";
91
- }
92
-
93
- function oldStackModule(file: string | undefined): OldModule {
94
- if (file === "test-users") return "stack-test-users";
95
- return file === undefined ? "stack" : "stack-other";
96
- }
97
-
98
- // Path-based on purpose: the old directories no longer exist after the move, so the
99
- // specifier cannot be resolved against the file system.
100
- export function classifyRelativeSpecifier(
101
- specifier: string,
102
- importingFile: string,
103
- ): OldModule | undefined {
104
- const resolved = resolve(dirname(importingFile), specifier)
105
- .replace(SCRIPT_EXTENSION, "")
106
- .replace(/\/index$/, "");
107
- const match = FRAMEWORK_SOURCE_DIRS.exec(resolved);
108
- const directory = match?.[1];
109
- if (directory === undefined) return undefined;
110
- const file = match?.[2];
111
- return directory === "stack" ? oldStackModule(file) : oldTestingModule(file);
112
- }
113
-
114
- export function hasSplitNames(old: OldModule): boolean {
115
- return old === "stack" || old === "testing";
116
- }
117
-
118
- export function targetForName(old: OldModule, name: string): MoveTargetId {
119
- switch (old) {
120
- case "stack":
121
- return SEEDING_NAMES.has(name) ? "framework-seeding" : "testing-stack";
122
- case "stack-test-users":
123
- return "framework-seeding";
124
- case "stack-other":
125
- return "testing-stack";
126
- case "testing":
127
- return name === BRIDGE_STUB_NAME ? "framework-engine" : "testing-helpers";
128
- case "testing-handler-context":
129
- return "framework-engine";
130
- case "testing-real-providers":
131
- return "testing-real-providers";
132
- case "testing-e2e-generator":
133
- return "testing-e2e-generator";
134
- case "testing-other":
135
- return "testing-helpers";
136
- }
137
- }
138
-
139
- export function mainTarget(old: OldModule): MoveTargetId {
140
- return targetForName(old, "");
141
- }
142
-
143
- const SOURCE_ROOT_MARKERS = {
144
- framework: "/packages/framework/src/",
145
- testing: "/packages/testing/src/",
146
- } as const;
147
-
148
- function repoRootOf(importingFile: string, owner: MoveTarget["owner"]): string | undefined {
149
- const index = importingFile.indexOf(SOURCE_ROOT_MARKERS[owner]);
150
- return index === -1 ? undefined : importingFile.slice(0, index);
151
- }
152
-
153
- // Files inside the package that owns the target import it relatively, everyone else
154
- // goes through the package specifier.
155
- export function moduleSpecifierFor(target: MoveTargetId, importingFile: string): string {
156
- const { owner, sourcePath, packageSpecifier } = TARGETS[target];
157
- const root = repoRootOf(importingFile, owner);
158
- if (root === undefined) return packageSpecifier;
159
- const relativePath = relative(dirname(importingFile), resolve(root, sourcePath));
160
- return `${relativePath.startsWith(".") ? relativePath : `./${relativePath}`}.js`;
161
- }
@@ -1,542 +0,0 @@
1
- #!/usr/bin/env bun
2
- // testing-move — repoints imports of the former framework test subpaths to their new homes:
3
- // `@cosmicdrift/kumiko-framework/{stack,testing,testing/*}` moved into `@cosmicdrift/kumiko-testing`,
4
- // while `TestUsers` & co. moved to `/seeding` and `bridgeStub` to `/engine` (production code uses them).
5
- //
6
- // Usage:
7
- // bun scripts/codemod/testing-move.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
8
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
9
- // while any rewritable or manual site is left; --dry-run only reports.
10
-
11
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
12
- import { dirname, join, relative, resolve } from "node:path";
13
- import {
14
- type ExportDeclaration,
15
- type ImportDeclaration,
16
- type ImportTypeNode,
17
- Node,
18
- Project,
19
- type SourceFile,
20
- SyntaxKind,
21
- } from "ts-morph";
22
- import { collectSourceFiles } from "./collect-source-files.ts";
23
- import {
24
- classifyPackageSpecifier,
25
- classifyRelativeSpecifier,
26
- hasSplitNames,
27
- type MoveTargetId,
28
- mainTarget,
29
- moduleSpecifierFor,
30
- type OldModule,
31
- targetForName,
32
- } from "./testing-move-targets.ts";
33
-
34
- export interface TestingMoveSite {
35
- readonly file: string;
36
- readonly line: number;
37
- readonly description: string;
38
- }
39
-
40
- export interface TestingMoveResult {
41
- readonly output: string;
42
- readonly rewrites: TestingMoveSite[];
43
- readonly manual: TestingMoveSite[];
44
- }
45
-
46
- interface NamedElement {
47
- readonly name: string;
48
- readonly alias: string | undefined;
49
- readonly isTypeOnly: boolean;
50
- }
51
-
52
- type NamedDeclaration = ImportDeclaration | ExportDeclaration;
53
-
54
- const CHEAP_PREFILTER = /\b(stack|testing)\b/;
55
- const SHIM_PATH_SUFFIXES: readonly string[] = [
56
- "packages/framework/src/stack/index.ts",
57
- "packages/framework/src/testing/index.ts",
58
- "packages/framework/src/testing/handler-context.ts",
59
- "packages/framework/src/testing/real-providers.ts",
60
- "packages/framework/src/testing/e2e-generator.ts",
61
- ];
62
-
63
- function oldModuleOf(specifier: string, filePath: string): OldModule | undefined {
64
- return specifier.startsWith(".")
65
- ? classifyRelativeSpecifier(specifier, filePath)
66
- : classifyPackageSpecifier(specifier);
67
- }
68
-
69
- function groupByTarget(
70
- old: OldModule,
71
- elements: readonly NamedElement[],
72
- ): Map<MoveTargetId, NamedElement[]> {
73
- const groups = new Map<MoveTargetId, NamedElement[]>();
74
- for (const element of elements) {
75
- const target = targetForName(old, element.name);
76
- groups.set(target, [...(groups.get(target) ?? []), element]);
77
- }
78
- return groups;
79
- }
80
-
81
- function elementsOf(declaration: NamedDeclaration): NamedElement[] {
82
- const specifiers = Node.isImportDeclaration(declaration)
83
- ? declaration.getNamedImports()
84
- : declaration.getNamedExports();
85
- return specifiers.map((specifier) => ({
86
- name: specifier.getName(),
87
- alias: specifier.getAliasNode()?.getText(),
88
- isTypeOnly: specifier.isTypeOnly(),
89
- }));
90
- }
91
-
92
- function toStructure(element: NamedElement): { name: string; alias?: string; isTypeOnly: boolean } {
93
- return element.alias === undefined
94
- ? { name: element.name, isTypeOnly: element.isTypeOnly }
95
- : { name: element.name, alias: element.alias, isTypeOnly: element.isTypeOnly };
96
- }
97
-
98
- function elementText(element: NamedElement): string {
99
- const alias = element.alias === undefined ? "" : ` as ${element.alias}`;
100
- return `${element.isTypeOnly ? "type " : ""}${element.name}${alias}`;
101
- }
102
-
103
- function declarationText(
104
- original: NamedDeclaration,
105
- specifier: string,
106
- elements: readonly NamedElement[],
107
- ): string {
108
- const keyword = Node.isImportDeclaration(original) ? "import" : "export";
109
- const typeOnly = original.isTypeOnly() ? " type" : "";
110
- return `${keyword}${typeOnly} { ${elements.map(elementText).join(", ")} } from "${specifier}";`;
111
- }
112
-
113
- function hasElement(existing: readonly NamedElement[], element: NamedElement): boolean {
114
- return existing.some(
115
- (candidate) => candidate.name === element.name && candidate.alias === element.alias,
116
- );
117
- }
118
-
119
- function isMergeTarget(candidate: NamedDeclaration, original: NamedDeclaration): boolean {
120
- if (candidate === original || candidate.isTypeOnly() !== original.isTypeOnly()) return false;
121
- if (Node.isImportDeclaration(candidate)) {
122
- return (
123
- candidate.getNamespaceImport() === undefined && candidate.getDefaultImport() === undefined
124
- );
125
- }
126
- return !candidate.isNamespaceExport() && candidate.getNamedExports().length > 0;
127
- }
128
-
129
- function findMergeTarget(
130
- sourceFile: SourceFile,
131
- original: NamedDeclaration,
132
- specifier: string,
133
- ): NamedDeclaration | undefined {
134
- const sameKind: readonly NamedDeclaration[] = Node.isImportDeclaration(original)
135
- ? sourceFile.getImportDeclarations()
136
- : sourceFile.getExportDeclarations();
137
- return sameKind.find(
138
- (candidate) =>
139
- candidate.getModuleSpecifierValue() === specifier && isMergeTarget(candidate, original),
140
- );
141
- }
142
-
143
- function mergeInto(target: NamedDeclaration, elements: readonly NamedElement[]): void {
144
- const present = elementsOf(target);
145
- for (const element of elements) {
146
- if (hasElement(present, element)) continue;
147
- if (Node.isImportDeclaration(target)) target.addNamedImport(toStructure(element));
148
- else target.addNamedExport(toStructure(element));
149
- }
150
- }
151
-
152
- function repointDeclaration(
153
- sourceFile: SourceFile,
154
- declaration: NamedDeclaration,
155
- old: OldModule,
156
- filePath: string,
157
- ): MoveTargetId[] {
158
- const groups = groupByTarget(old, elementsOf(declaration));
159
- const replacementLines: string[] = [];
160
- for (const [target, elements] of groups) {
161
- const specifier = moduleSpecifierFor(target, filePath);
162
- const mergeTarget = findMergeTarget(sourceFile, declaration, specifier);
163
- if (mergeTarget === undefined)
164
- replacementLines.push(declarationText(declaration, specifier, elements));
165
- else mergeInto(mergeTarget, elements);
166
- }
167
- // replaceWithText keeps the blank lines around the declaration, remove() would eat them.
168
- declaration.replaceWithText(replacementLines.join("\n"));
169
- return [...groups.keys()];
170
- }
171
-
172
- function isWholeModuleReference(declaration: NamedDeclaration): boolean {
173
- if (Node.isImportDeclaration(declaration)) {
174
- return (
175
- declaration.getNamespaceImport() !== undefined ||
176
- declaration.getDefaultImport() !== undefined ||
177
- declaration.getNamedImports().length === 0
178
- );
179
- }
180
- return declaration.isNamespaceExport() || declaration.getNamedExports().length === 0;
181
- }
182
-
183
- function usesSplitName(
184
- sourceFile: SourceFile,
185
- declaration: NamedDeclaration,
186
- old: OldModule,
187
- ): boolean {
188
- const namespaceName = Node.isImportDeclaration(declaration)
189
- ? declaration.getNamespaceImport()?.getText()
190
- : undefined;
191
- if (
192
- Node.isImportDeclaration(declaration) &&
193
- declaration.getDefaultImport() === undefined &&
194
- namespaceName === undefined
195
- ) {
196
- return false; // side-effect import: nothing is used, so any package of the old module serves
197
- }
198
- if (namespaceName === undefined) return true;
199
- return sourceFile
200
- .getDescendantsOfKind(SyntaxKind.Identifier)
201
- .some((identifier) => namespaceUseNeedsSplit(identifier, namespaceName, old));
202
- }
203
-
204
- // Conservative: any use other than `ns.name` / `ns.name` in a type position (destructuring,
205
- // passing the namespace on, typeof) cannot be attributed to one target package.
206
- function namespaceUseNeedsSplit(identifier: Node, namespaceName: string, old: OldModule): boolean {
207
- if (identifier.getText() !== namespaceName) return false;
208
- if (identifier.getFirstAncestorByKind(SyntaxKind.ImportDeclaration) !== undefined) return false;
209
- const parent = identifier.getParent();
210
- if (Node.isPropertyAccessExpression(parent)) {
211
- if (parent.getNameNode() === identifier) return false;
212
- return targetForName(old, parent.getName()) !== mainTarget(old);
213
- }
214
- if (Node.isQualifiedName(parent)) {
215
- if (parent.getRight() === identifier) return false;
216
- return targetForName(old, parent.getRight().getText()) !== mainTarget(old);
217
- }
218
- return true;
219
- }
220
-
221
- function repointWholeModule(
222
- sourceFile: SourceFile,
223
- declaration: NamedDeclaration,
224
- old: OldModule,
225
- filePath: string,
226
- ): MoveTargetId | undefined {
227
- if (hasSplitNames(old) && usesSplitName(sourceFile, declaration, old)) return undefined;
228
- const target = mainTarget(old);
229
- declaration.setModuleSpecifier(moduleSpecifierFor(target, filePath));
230
- return target;
231
- }
232
-
233
- function rewriteDeclarations(
234
- sourceFile: SourceFile,
235
- filePath: string,
236
- result: { rewrites: TestingMoveSite[]; manual: TestingMoveSite[] },
237
- ): void {
238
- const declarations: NamedDeclaration[] = [
239
- ...sourceFile.getImportDeclarations(),
240
- ...sourceFile.getExportDeclarations(),
241
- ];
242
- // Lines are read up front: replacing an earlier declaration shifts everything below it.
243
- const linesBefore = new Map(
244
- declarations.map((declaration) => [declaration, declaration.getStartLineNumber()]),
245
- );
246
- for (const declaration of declarations) {
247
- const specifier = declaration.getModuleSpecifierValue();
248
- const old = specifier === undefined ? undefined : oldModuleOf(specifier, filePath);
249
- if (specifier === undefined || old === undefined) continue;
250
- const site = { file: filePath, line: linesBefore.get(declaration) ?? 0 };
251
- if (!isWholeModuleReference(declaration)) {
252
- const targets = repointDeclaration(sourceFile, declaration, old, filePath);
253
- result.rewrites.push({ ...site, description: `${specifier} -> ${targets.join(", ")}` });
254
- continue;
255
- }
256
- const target = repointWholeModule(sourceFile, declaration, old, filePath);
257
- if (target !== undefined) {
258
- result.rewrites.push({ ...site, description: `${specifier} -> ${target}` });
259
- } else {
260
- result.manual.push({
261
- ...site,
262
- description: `${specifier}: namespace or default import that uses names which moved to different packages`,
263
- });
264
- }
265
- }
266
- }
267
-
268
- function stringLiteralOf(node: Node | undefined): string | undefined {
269
- return node !== undefined && Node.isStringLiteral(node) ? node.getLiteralValue() : undefined;
270
- }
271
-
272
- function importTypeSpecifier(node: ImportTypeNode): string | undefined {
273
- const argument = node.getArgument();
274
- return Node.isLiteralTypeNode(argument) ? stringLiteralOf(argument.getLiteral()) : undefined;
275
- }
276
-
277
- function destructuredNames(call: Node): string[] | undefined {
278
- const awaited = call.getParentIfKind(SyntaxKind.AwaitExpression);
279
- const declaration = (awaited ?? call).getParentIfKind(SyntaxKind.VariableDeclaration);
280
- const pattern = declaration?.getNameNode();
281
- if (pattern === undefined || !Node.isObjectBindingPattern(pattern)) return undefined;
282
- return pattern
283
- .getElements()
284
- .map((element) => element.getPropertyNameNode()?.getText() ?? element.getName());
285
- }
286
-
287
- function singleTargetFor(
288
- old: OldModule,
289
- names: readonly string[] | undefined,
290
- ): MoveTargetId | undefined {
291
- if (names === undefined) return hasSplitNames(old) ? undefined : mainTarget(old);
292
- const targets = new Set(names.map((name) => targetForName(old, name)));
293
- return targets.size === 1 ? [...targets][0] : undefined;
294
- }
295
-
296
- function isModuleMockCall(call: Node): boolean {
297
- return Node.isCallExpression(call) && call.getExpression().getText() === "mock.module";
298
- }
299
-
300
- function isDynamicImportCall(call: Node): boolean {
301
- return Node.isCallExpression(call) && call.getExpression().getKind() === SyntaxKind.ImportKeyword;
302
- }
303
-
304
- interface SpecifierSite {
305
- readonly specifier: string;
306
- readonly line: number;
307
- readonly names: readonly string[] | undefined;
308
- readonly replace: (next: string) => void;
309
- }
310
-
311
- function importTypeSites(sourceFile: SourceFile): SpecifierSite[] {
312
- const sites: SpecifierSite[] = [];
313
- for (const node of sourceFile.getDescendantsOfKind(SyntaxKind.ImportType)) {
314
- const specifier = importTypeSpecifier(node);
315
- if (specifier === undefined) continue;
316
- const qualifier = node.getQualifier()?.getText().split(".")[0];
317
- sites.push({
318
- specifier,
319
- line: node.getStartLineNumber(),
320
- names: qualifier === undefined ? undefined : [qualifier],
321
- replace: (next) => node.setArgument(next),
322
- });
323
- }
324
- return sites;
325
- }
326
-
327
- function callSites(sourceFile: SourceFile): SpecifierSite[] {
328
- const sites: SpecifierSite[] = [];
329
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
330
- if (!isDynamicImportCall(call) && !isModuleMockCall(call)) continue;
331
- const argument = call.getArguments()[0];
332
- const specifier = stringLiteralOf(argument);
333
- if (argument === undefined || specifier === undefined) continue;
334
- sites.push({
335
- specifier,
336
- line: call.getStartLineNumber(),
337
- // mock.module replaces a whole module, so it never splits by name.
338
- names: isModuleMockCall(call) ? [] : destructuredNames(call),
339
- replace: (next) => argument.replaceWithText(JSON.stringify(next)),
340
- });
341
- }
342
- return sites;
343
- }
344
-
345
- function rewriteDynamicSites(
346
- sourceFile: SourceFile,
347
- filePath: string,
348
- result: { rewrites: TestingMoveSite[]; manual: TestingMoveSite[] },
349
- ): void {
350
- for (const site of [...importTypeSites(sourceFile), ...callSites(sourceFile)]) {
351
- const old = oldModuleOf(site.specifier, filePath);
352
- if (old === undefined) continue;
353
- const names = site.names?.length === 0 ? undefined : site.names;
354
- const target = site.names?.length === 0 ? mainTarget(old) : singleTargetFor(old, names);
355
- if (target === undefined) {
356
- result.manual.push({
357
- file: filePath,
358
- line: site.line,
359
- description: `${site.specifier}: dynamic import whose names moved to different packages`,
360
- });
361
- continue;
362
- }
363
- site.replace(moduleSpecifierFor(target, filePath));
364
- result.rewrites.push({
365
- file: filePath,
366
- line: site.line,
367
- description: `${site.specifier} -> ${target}`,
368
- });
369
- }
370
- }
371
-
372
- export function transformTestingMoveSource(
373
- source: string,
374
- filePath = "source.ts",
375
- ): TestingMoveResult {
376
- const result: TestingMoveResult = { output: source, rewrites: [], manual: [] };
377
- if (!CHEAP_PREFILTER.test(source)) return result;
378
- const project = new Project({
379
- useInMemoryFileSystem: true,
380
- skipAddingFilesFromTsConfig: true,
381
- skipFileDependencyResolution: true,
382
- });
383
- const sourceFile = project.createSourceFile(resolve(filePath), source);
384
- rewriteDeclarations(sourceFile, resolve(filePath), result);
385
- rewriteDynamicSites(sourceFile, resolve(filePath), result);
386
- return { ...result, output: result.rewrites.length > 0 ? sourceFile.getFullText() : source };
387
- }
388
-
389
- type Mode = "write" | "dry-run" | "check";
390
-
391
- interface CliOptions {
392
- readonly mode: Mode;
393
- readonly format: boolean;
394
- readonly paths: string[];
395
- }
396
-
397
- class CliError extends Error {}
398
-
399
- function parseArgs(argv: readonly string[]): CliOptions {
400
- let mode: Mode | undefined;
401
- let format = true;
402
- const paths: string[] = [];
403
- const setMode = (next: Mode): void => {
404
- if (mode !== undefined && mode !== next) {
405
- throw new CliError("--check, --dry-run and --write are mutually exclusive");
406
- }
407
- mode = next;
408
- };
409
- for (const arg of argv) {
410
- if (arg === "--check") setMode("check");
411
- else if (arg === "--dry-run") setMode("dry-run");
412
- else if (arg === "--write") setMode("write");
413
- else if (arg === "--no-format") format = false;
414
- else if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
415
- else paths.push(arg);
416
- }
417
- if (paths.length === 0) throw new CliError("at least one target directory is required");
418
- return { mode: mode ?? "write", format, paths };
419
- }
420
-
421
- function isMigratableFile(name: string): boolean {
422
- return /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts");
423
- }
424
-
425
- function isSkippedPath(file: string): boolean {
426
- return (
427
- file.includes("/__tests__/fixtures/") ||
428
- SHIM_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix))
429
- );
430
- }
431
-
432
- function findBiomeBinary(startDir: string): string | undefined {
433
- let dir = resolve(startDir);
434
- for (;;) {
435
- const candidate = join(dir, "node_modules", ".bin", "biome");
436
- if (existsSync(candidate)) return candidate;
437
- const parent = dirname(dir);
438
- if (parent === dir) return undefined;
439
- dir = parent;
440
- }
441
- }
442
-
443
- const FORMAT_BATCH_SIZE = 50;
444
-
445
- async function formatWithBiome(files: readonly string[], cwd: string): Promise<void> {
446
- const biome = findBiomeBinary(cwd);
447
- if (biome === undefined) {
448
- console.log(
449
- "[testing-move] biome not found in node_modules/.bin — format and sort imports of the changed files yourself",
450
- );
451
- // skip: formatting is a convenience, the rewrite itself is already on disk
452
- return;
453
- }
454
- for (let i = 0; i < files.length; i += FORMAT_BATCH_SIZE) {
455
- const batch = files.slice(i, i + FORMAT_BATCH_SIZE);
456
- const proc = Bun.spawn({
457
- cmd: [
458
- biome,
459
- "check",
460
- "--write",
461
- "--linter-enabled=false",
462
- "--no-errors-on-unmatched",
463
- ...batch,
464
- ],
465
- cwd,
466
- stdout: "pipe",
467
- stderr: "pipe",
468
- });
469
- const [stderr, exitCode] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
470
- if (exitCode !== 0) {
471
- console.log(
472
- `[testing-move] biome exited ${exitCode}; run it on the changed files yourself\n${stderr.trim()}`,
473
- );
474
- }
475
- }
476
- }
477
-
478
- function displayPath(file: string): string {
479
- const fromCwd = relative(process.cwd(), file);
480
- return fromCwd.startsWith("..") ? file : fromCwd;
481
- }
482
-
483
- interface RunSummary {
484
- readonly rewrites: TestingMoveSite[];
485
- readonly manual: TestingMoveSite[];
486
- readonly changedFiles: string[];
487
- }
488
-
489
- function transformFiles(files: readonly string[], mode: Mode): RunSummary {
490
- const summary: RunSummary = { rewrites: [], manual: [], changedFiles: [] };
491
- for (const file of files) {
492
- const before = readFileSync(file, "utf8");
493
- const result = transformTestingMoveSource(before, file);
494
- const shown = displayPath(file);
495
- for (const site of result.rewrites)
496
- console.log(`${shown}:${site.line} rewritten ${site.description}`);
497
- for (const site of result.manual)
498
- console.log(`${shown}:${site.line} manual ${site.description}`);
499
- summary.rewrites.push(...result.rewrites);
500
- summary.manual.push(...result.manual);
501
- if (mode === "write" && result.output !== before) {
502
- writeFileSync(file, result.output);
503
- summary.changedFiles.push(file);
504
- }
505
- }
506
- return summary;
507
- }
508
-
509
- function parseArgsOrExit(argv: readonly string[]): CliOptions {
510
- try {
511
- return parseArgs(argv);
512
- } catch (err) {
513
- if (err instanceof CliError) {
514
- console.error(`[testing-move] ${err.message}`);
515
- process.exit(2);
516
- }
517
- throw err;
518
- }
519
- }
520
-
521
- async function main(): Promise<void> {
522
- const options = parseArgsOrExit(process.argv.slice(2));
523
- const files = collectSourceFiles(options.paths, { isMigratableFile }).filter(
524
- (file) => !isSkippedPath(file),
525
- );
526
- const { rewrites, manual, changedFiles } = transformFiles(files, options.mode);
527
-
528
- console.log(
529
- `\n[testing-move] ${options.mode === "write" ? "rewritten" : "rewritable"}: ${rewrites.length} in ${new Set(rewrites.map((site) => site.file)).size} file(s); manual: ${manual.length}`,
530
- );
531
-
532
- if (options.mode === "write" && options.format && changedFiles.length > 0) {
533
- await formatWithBiome(changedFiles, resolve(options.paths[0] ?? "."));
534
- }
535
-
536
- const hasOpenSites = rewrites.length + manual.length > 0;
537
- process.exit(options.mode === "check" && hasOpenSites ? 1 : 0);
538
- }
539
-
540
- if (import.meta.main) {
541
- await main();
542
- }