@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,454 +0,0 @@
1
- #!/usr/bin/env bun
2
- // tenant-db-options — `createTenantDb(db, tenantId, mode, tracer, meter, signal, grants)` becomes
3
- // `createTenantDb({ db, tenantId, mode, tracer, meter, signal, grants })`.
4
- //
5
- // Usage:
6
- // bun scripts/codemod/tenant-db-options.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
7
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
8
- // while any rewritable or manual site is left; --dry-run only reports.
9
-
10
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
11
- import { dirname, join, relative, resolve } from "node:path";
12
- import { type CallExpression, Node, Project, type SourceFile, SyntaxKind } from "ts-morph";
13
- import { collectSourceFiles } from "./collect-source-files.ts";
14
-
15
- export interface TenantDbOptionsSite {
16
- readonly file: string;
17
- readonly line: number;
18
- readonly description: string;
19
- }
20
-
21
- export interface TenantDbOptionsResult {
22
- readonly output: string;
23
- readonly rewrites: TenantDbOptionsSite[];
24
- readonly manual: TenantDbOptionsSite[];
25
- }
26
-
27
- const FRAMEWORK_PACKAGE = "@cosmicdrift/kumiko-framework";
28
- const FRAMEWORK_SRC_MARKER = "/packages/framework/src/";
29
- const FACTORY_NAME = "createTenantDb";
30
- const OPTION_NAMES = ["db", "tenantId", "mode", "tracer", "meter", "signal", "grants"] as const;
31
- const FIRST_OPTIONAL_INDEX = 2;
32
- const CHEAP_PREFILTER = /createTenantDb/;
33
- const COMMENT_PATTERN = /\/\/[^\n]*|\/\*[\s\S]*?\*\//g;
34
-
35
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
36
- "packages/framework/src/scripts/codemod/tenant-db-options.ts",
37
- "packages/framework/src/__tests__/tenant-db-options-codemod.test.ts",
38
- ];
39
-
40
- function isFrameworkSpecifier(specifier: string, filePath: string): boolean {
41
- if (specifier === FRAMEWORK_PACKAGE || specifier.startsWith(`${FRAMEWORK_PACKAGE}/`)) {
42
- return true;
43
- }
44
- if (!specifier.startsWith(".")) return false;
45
- return resolve(dirname(filePath), specifier).includes(FRAMEWORK_SRC_MARKER);
46
- }
47
-
48
- // Bindings are resolved through the checker's alias symbol, so a parameter or local that shadows
49
- // the imported name is never mistaken for the framework export.
50
- function isFrameworkModuleImportCall(node: Node | undefined, filePath: string): boolean {
51
- const importCall = Node.isAwaitExpression(node) ? node.getExpression() : node;
52
- if (!Node.isCallExpression(importCall)) return false;
53
- if (importCall.getExpression().getKind() !== SyntaxKind.ImportKeyword) return false;
54
- const argument = importCall.getArguments()[0];
55
- return (
56
- argument !== undefined &&
57
- Node.isStringLiteral(argument) &&
58
- isFrameworkSpecifier(argument.getLiteralValue(), filePath)
59
- );
60
- }
61
-
62
- function resolvesToFrameworkExport(identifier: Node, filePath: string): boolean {
63
- const declarations = identifier.getSymbol()?.getDeclarations() ?? [];
64
- return declarations.some((declaration) => {
65
- if (Node.isImportSpecifier(declaration)) {
66
- return (
67
- declaration.getName() === FACTORY_NAME &&
68
- isFrameworkSpecifier(declaration.getImportDeclaration().getModuleSpecifierValue(), filePath)
69
- );
70
- }
71
- if (Node.isBindingElement(declaration)) {
72
- const importedName = declaration.getPropertyNameNode()?.getText() ?? declaration.getName();
73
- const variable = declaration.getFirstAncestorByKind(SyntaxKind.VariableDeclaration);
74
- return (
75
- importedName === FACTORY_NAME &&
76
- isFrameworkModuleImportCall(variable?.getInitializer(), filePath)
77
- );
78
- }
79
- return false;
80
- });
81
- }
82
-
83
- function resolvesToFrameworkNamespace(identifier: Node, filePath: string): boolean {
84
- const declarations = identifier.getSymbol()?.getDeclarations() ?? [];
85
- return declarations.some((declaration) => {
86
- if (Node.isNamespaceImport(declaration)) {
87
- return isFrameworkSpecifier(
88
- declaration
89
- .getFirstAncestorByKindOrThrow(SyntaxKind.ImportDeclaration)
90
- .getModuleSpecifierValue(),
91
- filePath,
92
- );
93
- }
94
- return (
95
- Node.isVariableDeclaration(declaration) &&
96
- isFrameworkModuleImportCall(declaration.getInitializer(), filePath)
97
- );
98
- });
99
- }
100
-
101
- // The symbol lookup is the expensive part; names that cannot be the factory skip it.
102
- function localFactoryNames(sourceFile: SourceFile): ReadonlySet<string> {
103
- const names = new Set<string>([FACTORY_NAME]);
104
- for (const specifier of sourceFile.getDescendantsOfKind(SyntaxKind.ImportSpecifier)) {
105
- if (specifier.getName() === FACTORY_NAME)
106
- names.add(specifier.getAliasNode()?.getText() ?? FACTORY_NAME);
107
- }
108
- for (const element of sourceFile.getDescendantsOfKind(SyntaxKind.BindingElement)) {
109
- const importedName = element.getPropertyNameNode()?.getText() ?? element.getName();
110
- if (importedName === FACTORY_NAME) names.add(element.getName());
111
- }
112
- return names;
113
- }
114
-
115
- function isFactoryReference(node: Node, names: ReadonlySet<string>, filePath: string): boolean {
116
- if (Node.isIdentifier(node)) {
117
- return names.has(node.getText()) && resolvesToFrameworkExport(node, filePath);
118
- }
119
- return (
120
- Node.isPropertyAccessExpression(node) &&
121
- node.getName() === FACTORY_NAME &&
122
- resolvesToFrameworkNamespace(node.getExpression(), filePath)
123
- );
124
- }
125
-
126
- function isCalleeOf(node: Node): boolean {
127
- const parent = node.getParent();
128
- return Node.isCallExpression(parent) && parent.getExpression() === node;
129
- }
130
-
131
- function isObjectFormCall(call: CallExpression): boolean {
132
- const args = call.getArguments();
133
- return args.length === 1 && Node.isObjectLiteralExpression(args[0]);
134
- }
135
-
136
- interface GapComment {
137
- readonly text: string;
138
- // Same line as the preceding argument: stays attached to it.
139
- readonly trailing: boolean;
140
- }
141
-
142
- function commentsOfGap(gap: string): GapComment[] {
143
- const comments: GapComment[] = [];
144
- for (const match of gap.matchAll(COMMENT_PATTERN)) {
145
- const before = gap.slice(0, match.index);
146
- comments.push({ text: match[0], trailing: !before.includes("\n") });
147
- }
148
- return comments;
149
- }
150
-
151
- function isUndefinedLiteral(argument: Node): boolean {
152
- return Node.isIdentifier(argument) && argument.getText() === "undefined";
153
- }
154
-
155
- function propertyText(name: string, argument: Node): string {
156
- return Node.isIdentifier(argument) && argument.getText() === name
157
- ? name
158
- : `${name}: ${argument.getText()}`;
159
- }
160
-
161
- // Text between the parentheses and around each argument holds only commas and comments.
162
- function gapsAround(call: CallExpression, args: readonly Node[]): string[] {
163
- const text = call.getSourceFile().getFullText();
164
- const openParen = call.getFirstChildByKindOrThrow(SyntaxKind.OpenParenToken);
165
- const closeParen = call.getLastChildByKindOrThrow(SyntaxKind.CloseParenToken);
166
- const boundaries = [openParen.getEnd(), ...args.flatMap((a) => [a.getStart(), a.getEnd()])];
167
- boundaries.push(closeParen.getStart());
168
- const gaps: string[] = [];
169
- for (let i = 0; i < boundaries.length; i += 2) {
170
- gaps.push(text.slice(boundaries[i], boundaries[i + 1]));
171
- }
172
- return gaps;
173
- }
174
-
175
- function optionsObjectText(call: CallExpression, args: readonly Node[]): string {
176
- const gaps = gapsAround(call, args).map(commentsOfGap);
177
- const lines: string[] = [];
178
- let lastLineIsProperty = false;
179
- const emitComments = (comments: readonly GapComment[]): void => {
180
- for (const comment of comments) {
181
- if (comment.trailing && lastLineIsProperty) {
182
- lines[lines.length - 1] += ` ${comment.text}`;
183
- } else {
184
- lines.push(comment.text);
185
- lastLineIsProperty = false;
186
- }
187
- }
188
- };
189
- for (const [index, argument] of args.entries()) {
190
- emitComments(gaps[index] ?? []);
191
- const name = OPTION_NAMES[index];
192
- const isDropped = index >= FIRST_OPTIONAL_INDEX && isUndefinedLiteral(argument);
193
- if (name === undefined || isDropped) continue;
194
- lines.push(`${propertyText(name, argument)},`);
195
- lastLineIsProperty = true;
196
- }
197
- emitComments(gaps[args.length] ?? []);
198
- const hasComment = gaps.some((gap) => gap.length > 0);
199
- if (!hasComment) return `{ ${lines.map((line) => line.replace(/,$/, "")).join(", ")} }`;
200
- return `{\n${lines.join("\n")}\n}`;
201
- }
202
-
203
- function unmappableReason(args: readonly Node[]): string | undefined {
204
- if (args.some((argument) => Node.isSpreadElement(argument))) {
205
- return "spread argument, map it to { db, tenantId, ... } by hand";
206
- }
207
- if (args.length > OPTION_NAMES.length) {
208
- return `${args.length} arguments, createTenantDb takes at most ${OPTION_NAMES.length}`;
209
- }
210
- if (args.length < 2) {
211
- return `${args.length} argument(s) that are not an options object literal`;
212
- }
213
- return undefined;
214
- }
215
-
216
- function rewriteCalls(
217
- sourceFile: SourceFile,
218
- names: ReadonlySet<string>,
219
- filePath: string,
220
- result: Sites,
221
- ): void {
222
- const calls = sourceFile
223
- .getDescendantsOfKind(SyntaxKind.CallExpression)
224
- .filter((call) => isFactoryReference(call.getExpression(), names, filePath))
225
- .sort((a, b) => b.getStart() - a.getStart());
226
-
227
- for (const call of calls) {
228
- if (isObjectFormCall(call)) continue;
229
- const line = call.getStartLineNumber();
230
- const args = call.getArguments();
231
- const reason = unmappableReason(args);
232
- if (reason !== undefined) {
233
- result.manual.push({ file: filePath, line, description: `${FACTORY_NAME}(...): ${reason}` });
234
- continue;
235
- }
236
- call.replaceWithText(`${call.getExpression().getText()}(${optionsObjectText(call, args)})`);
237
- result.rewrites.push({
238
- file: filePath,
239
- line,
240
- description: `${FACTORY_NAME}(db, tenantId, ...) -> ${FACTORY_NAME}({ db, tenantId, ... })`,
241
- });
242
- }
243
- }
244
-
245
- function isDeclarationPosition(node: Node): boolean {
246
- const parent = node.getParent();
247
- return (
248
- Node.isImportSpecifier(parent) ||
249
- Node.isExportSpecifier(parent) ||
250
- Node.isTypeQuery(parent) ||
251
- Node.isBindingElement(parent)
252
- );
253
- }
254
-
255
- // A value use cannot be mapped to the options object: the reference may be called anywhere.
256
- function reportValueUses(
257
- sourceFile: SourceFile,
258
- names: ReadonlySet<string>,
259
- filePath: string,
260
- result: Sites,
261
- ): void {
262
- const candidates: Node[] = [
263
- ...sourceFile.getDescendantsOfKind(SyntaxKind.Identifier),
264
- ...sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression),
265
- ];
266
- for (const node of candidates) {
267
- if (isCalleeOf(node) || isDeclarationPosition(node)) continue;
268
- const isShorthand = Node.isShorthandPropertyAssignment(node.getParent());
269
- const matches = isShorthand
270
- ? Node.isIdentifier(node) && names.has(node.getText())
271
- : isFactoryReference(node, names, filePath);
272
- if (!matches) continue;
273
- result.manual.push({
274
- file: filePath,
275
- line: node.getStartLineNumber(),
276
- description: `${FACTORY_NAME} used as a value, wrap the call site and use the options object`,
277
- });
278
- }
279
- }
280
-
281
- type Sites = { rewrites: TenantDbOptionsSite[]; manual: TenantDbOptionsSite[] };
282
-
283
- export function transformTenantDbOptionsSource(
284
- source: string,
285
- filePath = "source.ts",
286
- ): TenantDbOptionsResult {
287
- const result: TenantDbOptionsResult = { output: source, rewrites: [], manual: [] };
288
- if (!CHEAP_PREFILTER.test(source)) return result;
289
- const project = new Project({
290
- useInMemoryFileSystem: true,
291
- skipAddingFilesFromTsConfig: true,
292
- skipFileDependencyResolution: true,
293
- });
294
- const absolutePath = resolve(filePath);
295
- const sourceFile = project.createSourceFile(absolutePath, source);
296
- const names = localFactoryNames(sourceFile);
297
- reportValueUses(sourceFile, names, absolutePath, result);
298
- rewriteCalls(sourceFile, names, absolutePath, result);
299
- const changed = result.rewrites.length > 0;
300
- return { ...result, output: changed ? sourceFile.getFullText() : source };
301
- }
302
-
303
- type Mode = "write" | "dry-run" | "check";
304
-
305
- interface CliOptions {
306
- readonly mode: Mode;
307
- readonly format: boolean;
308
- readonly paths: string[];
309
- }
310
-
311
- class CliError extends Error {}
312
-
313
- function parseArgs(argv: readonly string[]): CliOptions {
314
- let mode: Mode | undefined;
315
- let format = true;
316
- const paths: string[] = [];
317
- const setMode = (next: Mode): void => {
318
- if (mode !== undefined && mode !== next) {
319
- throw new CliError("--check, --dry-run and --write are mutually exclusive");
320
- }
321
- mode = next;
322
- };
323
- for (const arg of argv) {
324
- if (arg === "--check") setMode("check");
325
- else if (arg === "--dry-run") setMode("dry-run");
326
- else if (arg === "--write") setMode("write");
327
- else if (arg === "--no-format") format = false;
328
- else if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
329
- else paths.push(arg);
330
- }
331
- if (paths.length === 0) throw new CliError("at least one target directory is required");
332
- return { mode: mode ?? "write", format, paths };
333
- }
334
-
335
- function isMigratableFile(name: string): boolean {
336
- return /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts");
337
- }
338
-
339
- function isSkippedPath(file: string): boolean {
340
- return (
341
- file.includes("/__tests__/fixtures/") ||
342
- SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix))
343
- );
344
- }
345
-
346
- function findBiomeBinary(startDir: string): string | undefined {
347
- let dir = resolve(startDir);
348
- for (;;) {
349
- const candidate = join(dir, "node_modules", ".bin", "biome");
350
- if (existsSync(candidate)) return candidate;
351
- const parent = dirname(dir);
352
- if (parent === dir) return undefined;
353
- dir = parent;
354
- }
355
- }
356
-
357
- const FORMAT_BATCH_SIZE = 50;
358
-
359
- async function formatWithBiome(files: readonly string[], cwd: string): Promise<void> {
360
- const biome = findBiomeBinary(cwd);
361
- if (biome === undefined) {
362
- console.log(
363
- "[tenant-db-options] biome not found in node_modules/.bin — format and sort imports of the changed files yourself",
364
- );
365
- // skip: formatting is a convenience, the rewrite itself is already on disk
366
- return;
367
- }
368
- for (let i = 0; i < files.length; i += FORMAT_BATCH_SIZE) {
369
- const batch = files.slice(i, i + FORMAT_BATCH_SIZE);
370
- const proc = Bun.spawn({
371
- cmd: [
372
- biome,
373
- "check",
374
- "--write",
375
- "--linter-enabled=false",
376
- "--no-errors-on-unmatched",
377
- ...batch,
378
- ],
379
- cwd,
380
- stdout: "pipe",
381
- stderr: "pipe",
382
- });
383
- const [stderr, exitCode] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
384
- if (exitCode !== 0) {
385
- console.log(
386
- `[tenant-db-options] biome exited ${exitCode}; run it on the changed files yourself\n${stderr.trim()}`,
387
- );
388
- }
389
- }
390
- }
391
-
392
- function displayPath(file: string): string {
393
- const fromCwd = relative(process.cwd(), file);
394
- return fromCwd.startsWith("..") ? file : fromCwd;
395
- }
396
-
397
- interface RunSummary extends Sites {
398
- readonly changedFiles: string[];
399
- }
400
-
401
- function transformFiles(files: readonly string[], mode: Mode): RunSummary {
402
- const summary: RunSummary = { rewrites: [], manual: [], changedFiles: [] };
403
- for (const file of files) {
404
- const before = readFileSync(file, "utf8");
405
- const result = transformTenantDbOptionsSource(before, file);
406
- const shown = displayPath(file);
407
- for (const site of result.rewrites)
408
- console.log(`${shown}:${site.line} rewritten ${site.description}`);
409
- for (const site of result.manual)
410
- console.log(`${shown}:${site.line} manual ${site.description}`);
411
- summary.rewrites.push(...result.rewrites);
412
- summary.manual.push(...result.manual);
413
- if (mode === "write" && result.output !== before) {
414
- writeFileSync(file, result.output);
415
- summary.changedFiles.push(file);
416
- }
417
- }
418
- return summary;
419
- }
420
-
421
- function parseArgsOrExit(argv: readonly string[]): CliOptions {
422
- try {
423
- return parseArgs(argv);
424
- } catch (err) {
425
- if (err instanceof CliError) {
426
- console.error(`[tenant-db-options] ${err.message}`);
427
- process.exit(2);
428
- }
429
- throw err;
430
- }
431
- }
432
-
433
- async function main(): Promise<void> {
434
- const options = parseArgsOrExit(process.argv.slice(2));
435
- const files = collectSourceFiles(options.paths, { isMigratableFile }).filter(
436
- (file) => !isSkippedPath(file),
437
- );
438
- const { rewrites, manual, changedFiles } = transformFiles(files, options.mode);
439
-
440
- console.log(
441
- `\n[tenant-db-options] ${options.mode === "write" ? "rewritten" : "rewritable"}: ${rewrites.length} call(s) in ${new Set(rewrites.map((site) => site.file)).size} file(s); manual: ${manual.length}`,
442
- );
443
-
444
- if (options.mode === "write" && options.format && changedFiles.length > 0) {
445
- await formatWithBiome(changedFiles, resolve(options.paths[0] ?? "."));
446
- }
447
-
448
- const hasOpenSites = rewrites.length + manual.length > 0;
449
- process.exit(options.mode === "check" && hasOpenSites ? 1 : 0);
450
- }
451
-
452
- if (import.meta.main) {
453
- await main();
454
- }
@@ -1,215 +0,0 @@
1
- #!/usr/bin/env bun
2
- // testing-injection — kumiko-testing no longer imports bundled-features or dev-server. The test
3
- // functions that need them are bound in `@cosmicdrift/kumiko-dev-server/testing`:
4
- // @cosmicdrift/kumiko-testing { setupAppTestStack, SetupAppTestStackOptions,
5
- // seedTenant, persistTenantRows }
6
- // @cosmicdrift/kumiko-testing/e2e/seed-route { createE2eSeedRoutes }
7
- // -> @cosmicdrift/kumiko-dev-server/testing
8
- // Names that stay (types like SeededTenant, E2eExtraSeeder, isE2eSeedingEnabled) keep their import.
9
- //
10
- // Usage:
11
- // bun scripts/codemod/testing-injection.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
12
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
13
- // while any rewritable or manual site is left; --dry-run only reports.
14
-
15
- import {
16
- type ExportDeclaration,
17
- type ExportSpecifier,
18
- type ImportDeclaration,
19
- type ImportSpecifier,
20
- Project,
21
- SyntaxKind,
22
- } from "ts-morph";
23
- import {
24
- type CodemodResult,
25
- ensureNamedImport,
26
- runCodemodCli,
27
- type SiteLists,
28
- } from "./codemod-support.ts";
29
-
30
- const TESTING_PACKAGE = "@cosmicdrift/kumiko-testing";
31
- const TARGET_MODULE = "@cosmicdrift/kumiko-dev-server/testing";
32
-
33
- const MOVED_NAMES_BY_MODULE: ReadonlyMap<string, ReadonlySet<string>> = new Map([
34
- [
35
- TESTING_PACKAGE,
36
- new Set(["setupAppTestStack", "SetupAppTestStackOptions", "seedTenant", "persistTenantRows"]),
37
- ],
38
- [`${TESTING_PACKAGE}/e2e/seed-route`, new Set(["createE2eSeedRoutes"])],
39
- ]);
40
-
41
- const CHEAP_PREFILTER = /kumiko-testing/;
42
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
43
- "packages/framework/src/scripts/codemod/testing-injection.ts",
44
- "packages/framework/src/__tests__/testing-injection-codemod.test.ts",
45
- "packages/dev-server/src/testing.ts",
46
- ];
47
-
48
- function movedNamesOf(declaration: ImportDeclaration): ReadonlySet<string> | undefined {
49
- return MOVED_NAMES_BY_MODULE.get(declaration.getModuleSpecifierValue());
50
- }
51
-
52
- function reportNamespaceUses(
53
- declaration: ImportDeclaration,
54
- moved: ReadonlySet<string>,
55
- filePath: string,
56
- result: SiteLists,
57
- ): void {
58
- const namespaceName = declaration.getNamespaceImport()?.getText();
59
- const accesses =
60
- namespaceName === undefined
61
- ? []
62
- : declaration.getSourceFile().getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
63
- for (const access of accesses) {
64
- if (access.getExpression().getText() === namespaceName && moved.has(access.getName())) {
65
- result.manual.push({
66
- file: filePath,
67
- line: access.getStartLineNumber(),
68
- description: `${namespaceName}.${access.getName()}: import it from ${TARGET_MODULE}`,
69
- });
70
- }
71
- }
72
- }
73
-
74
- function reportStarReexport(
75
- declaration: ExportDeclaration,
76
- filePath: string,
77
- result: SiteLists,
78
- ): void {
79
- result.manual.push({
80
- file: filePath,
81
- line: declaration.getStartLineNumber(),
82
- description: `export * from ${declaration.getModuleSpecifierValue()}: re-export the moved names from ${TARGET_MODULE} by hand`,
83
- });
84
- }
85
-
86
- function moveNamedReexports(
87
- declaration: ExportDeclaration,
88
- movedExports: readonly ExportSpecifier[],
89
- filePath: string,
90
- result: SiteLists,
91
- ): void {
92
- const line = declaration.getStartLineNumber();
93
- const snapshots = movedExports.map((named) => ({
94
- name: named.getName(),
95
- alias: named.getAliasNode()?.getText(),
96
- isTypeOnly: named.isTypeOnly(),
97
- }));
98
- for (const named of movedExports) named.remove();
99
- const typeOnlyDeclaration = declaration.isTypeOnly();
100
- if (declaration.getNamedExports().length === 0) declaration.remove();
101
- declaration.getSourceFile().addExportDeclaration({
102
- moduleSpecifier: TARGET_MODULE,
103
- namedExports: snapshots,
104
- isTypeOnly: typeOnlyDeclaration,
105
- });
106
- result.rewrites.push({
107
- file: filePath,
108
- line,
109
- description: `export { ${snapshots.map((snapshot) => snapshot.name).join(", ")} } -> ${TARGET_MODULE}`,
110
- });
111
- }
112
-
113
- function rewriteReexports(
114
- declaration: ExportDeclaration,
115
- moved: ReadonlySet<string>,
116
- filePath: string,
117
- result: SiteLists,
118
- ): void {
119
- const namedExports = declaration.getNamedExports();
120
- const movedExports = namedExports.filter((named) => moved.has(named.getName()));
121
- if (namedExports.length === 0) reportStarReexport(declaration, filePath, result);
122
- else if (movedExports.length > 0) moveNamedReexports(declaration, movedExports, filePath, result);
123
- }
124
-
125
- function moveNamedImports(
126
- declaration: ImportDeclaration,
127
- movedImports: readonly ImportSpecifier[],
128
- filePath: string,
129
- result: SiteLists,
130
- ): void {
131
- const line = declaration.getStartLineNumber();
132
- const typeOnlyDeclaration = declaration.isTypeOnly();
133
- const sourceFile = declaration.getSourceFile();
134
- const names = movedImports.map((named) => named.getName());
135
- // Collected first: removing a specifier invalidates the nodes of its siblings.
136
- const snapshots = movedImports.map((named) => ({
137
- name: named.getName(),
138
- alias: named.getAliasNode()?.getText(),
139
- typeOnly: named.isTypeOnly(),
140
- }));
141
- for (const named of movedImports) named.remove();
142
- if (
143
- declaration.getNamedImports().length === 0 &&
144
- declaration.getNamespaceImport() === undefined &&
145
- declaration.getDefaultImport() === undefined
146
- ) {
147
- declaration.remove();
148
- }
149
- for (const snapshot of snapshots) {
150
- const typeOnly = typeOnlyDeclaration || snapshot.typeOnly;
151
- if (snapshot.alias === undefined) {
152
- ensureNamedImport(sourceFile, TARGET_MODULE, snapshot.name, typeOnly);
153
- } else {
154
- sourceFile.addImportDeclaration({
155
- moduleSpecifier: TARGET_MODULE,
156
- namedImports: [{ name: snapshot.name, alias: snapshot.alias }],
157
- isTypeOnly: typeOnly,
158
- });
159
- }
160
- }
161
- result.rewrites.push({
162
- file: filePath,
163
- line,
164
- description: `${names.join(", ")} -> ${TARGET_MODULE}`,
165
- });
166
- }
167
-
168
- function rewriteImportDeclaration(
169
- declaration: ImportDeclaration,
170
- filePath: string,
171
- result: SiteLists,
172
- ): void {
173
- const moved = movedNamesOf(declaration);
174
- if (moved !== undefined) {
175
- reportNamespaceUses(declaration, moved, filePath, result);
176
- const movedImports = declaration
177
- .getNamedImports()
178
- .filter((named) => moved.has(named.getName()));
179
- if (movedImports.length > 0) moveNamedImports(declaration, movedImports, filePath, result);
180
- }
181
- }
182
-
183
- export function transformTestingInjectionSource(
184
- source: string,
185
- filePath = "source.ts",
186
- ): CodemodResult {
187
- const result: SiteLists = { rewrites: [], manual: [] };
188
- if (!CHEAP_PREFILTER.test(source)) return { output: source, ...result };
189
- const project = new Project({
190
- useInMemoryFileSystem: true,
191
- skipAddingFilesFromTsConfig: true,
192
- skipFileDependencyResolution: true,
193
- });
194
- const sourceFile = project.createSourceFile(filePath, source);
195
- for (const declaration of sourceFile.getImportDeclarations()) {
196
- rewriteImportDeclaration(declaration, filePath, result);
197
- }
198
- for (const declaration of sourceFile.getExportDeclarations()) {
199
- const moved = MOVED_NAMES_BY_MODULE.get(declaration.getModuleSpecifierValue() ?? "");
200
- if (moved !== undefined) rewriteReexports(declaration, moved, filePath, result);
201
- }
202
- const output = result.rewrites.length > 0 ? sourceFile.getFullText() : source;
203
- return { output, ...result };
204
- }
205
-
206
- function isSkippedPath(file: string): boolean {
207
- return SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix));
208
- }
209
-
210
- if (import.meta.main) {
211
- await runCodemodCli(
212
- { name: "testing-injection", transform: transformTestingInjectionSource, isSkippedPath },
213
- process.argv.slice(2),
214
- );
215
- }