@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/AGENTS.md +9 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/inbound-mail-triage.md +1 -0
  13. package/agents/examples/lane-routing.md +2 -1
  14. package/agents/examples/legal-pages.md +2 -2
  15. package/agents/examples/lifecycle-hooks.md +3 -3
  16. package/agents/examples/managed-config.md +4 -4
  17. package/agents/examples/managed-pages.md +1 -1
  18. package/agents/examples/relations.md +19 -4
  19. package/agents/examples/search.md +4 -4
  20. package/agents/examples/secrets-demo.md +9 -6
  21. package/agents/examples/state-machine.md +2 -2
  22. package/agents/examples/tenant-settings.md +1 -1
  23. package/agents/examples/user-data-rights.md +3 -6
  24. package/agents/examples/workflow-engine.md +53 -47
  25. package/agents/examples.md +4 -4
  26. package/agents/features.md +1 -1
  27. package/dist/api/auth-middleware.js +1 -1
  28. package/dist/api/auth-routes-invite.js +2 -1
  29. package/dist/api/entity-read-access.d.ts +3 -1
  30. package/dist/api/export/export-columns.d.ts +3 -1
  31. package/dist/api/export/export-route.js +3 -2
  32. package/dist/api/export/export-screen.d.ts +2 -1
  33. package/dist/api/extra-route.d.ts +3 -1
  34. package/dist/api/index.d.ts +23 -27
  35. package/dist/api/index.js +13 -15
  36. package/dist/api/jwt.js +1 -1
  37. package/dist/api/observability-middleware.d.ts +1 -1
  38. package/dist/api/observability-middleware.js +2 -1
  39. package/dist/api/request-context-internals.d.ts +31 -0
  40. package/dist/api/request-context-internals.js +11 -0
  41. package/dist/api/request-context-scopes.d.ts +14 -0
  42. package/dist/api/request-context-scopes.js +69 -0
  43. package/dist/api/request-context.d.ts +1 -40
  44. package/dist/api/request-context.js +22 -51
  45. package/dist/api/request-id-middleware.d.ts +1 -1
  46. package/dist/api/route-registrars.d.ts +2 -1
  47. package/dist/api/route-registrars.js +1 -1
  48. package/dist/api/routes.js +7 -3
  49. package/dist/api/server-boot-checks.d.ts +1 -1
  50. package/dist/api/server-boot-checks.js +2 -2
  51. package/dist/api/server-event-dispatcher.d.ts +6 -1
  52. package/dist/api/server-event-dispatcher.js +3 -4
  53. package/dist/api/server-extra-routes.d.ts +1 -1
  54. package/dist/api/server-extra-routes.js +2 -1
  55. package/dist/api/server-middleware.js +3 -1
  56. package/dist/api/server-routes.d.ts +2 -1
  57. package/dist/api/server-wiring.js +6 -4
  58. package/dist/api/server.d.ts +2 -1
  59. package/dist/api/sse-route.d.ts +2 -1
  60. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  61. package/dist/api/tenant-scoped-secrets.js +13 -0
  62. package/dist/api/websocket-route.d.ts +1 -1
  63. package/dist/auth/index.d.ts +0 -1
  64. package/dist/auth/roles.d.ts +0 -5
  65. package/dist/compliance/duration-spec.d.ts +0 -1
  66. package/dist/compliance/duration-spec.js +0 -5
  67. package/dist/compliance/index.d.ts +4 -4
  68. package/dist/compliance/index.js +2 -2
  69. package/dist/compliance/profiles.d.ts +0 -15
  70. package/dist/compliance/profiles.js +0 -23
  71. package/dist/config/index.d.ts +10 -10
  72. package/dist/config/index.js +13 -1
  73. package/dist/config/internals.d.ts +9 -0
  74. package/dist/config/internals.js +1 -0
  75. package/dist/consumer-cli-internals.d.ts +4 -0
  76. package/dist/consumer-cli-internals.js +1 -0
  77. package/dist/consumer-cli.d.ts +1 -4
  78. package/dist/consumer-cli.js +5 -1
  79. package/dist/crypto/event-pii.js +1 -1
  80. package/dist/crypto/index.d.ts +8 -9
  81. package/dist/crypto/index.js +7 -8
  82. package/dist/crypto/pg-kms-adapter.js +6 -1
  83. package/dist/db/apply-entity-event.d.ts +1 -1
  84. package/dist/db/apply-entity-event.js +15 -47
  85. package/dist/db/blind-index-cleanup.js +91 -77
  86. package/dist/db/collect-table-metas.js +1 -1
  87. package/dist/db/compound-types.d.ts +1 -1
  88. package/dist/db/compound-types.js +0 -7
  89. package/dist/db/config-seed.d.ts +2 -1
  90. package/dist/db/config-seed.js +6 -1
  91. package/dist/db/connection.d.ts +3 -1
  92. package/dist/db/connection.js +15 -5
  93. package/dist/db/cross-tenant-reads.d.ts +1 -1
  94. package/dist/db/cross-tenant-reads.js +1 -1
  95. package/dist/db/dialect.d.ts +0 -5
  96. package/dist/db/dialect.js +0 -3
  97. package/dist/db/driver-value-preparation.js +23 -2
  98. package/dist/db/eagerload.d.ts +2 -1
  99. package/dist/db/entity-field-encryption.d.ts +1 -1
  100. package/dist/db/entity-table-meta.d.ts +1 -1
  101. package/dist/db/event-store-executor-context.d.ts +3 -1
  102. package/dist/db/event-store-executor-context.js +4 -3
  103. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  104. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  106. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  107. package/dist/db/event-store-executor-read.js +2 -2
  108. package/dist/db/event-store-executor-write-atomic.js +8 -7
  109. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  110. package/dist/db/event-store-executor-write.js +7 -4
  111. package/dist/db/event-store-executor.d.ts +1 -1
  112. package/dist/db/executor-managed-tables.d.ts +7 -1
  113. package/dist/db/executor-managed-tables.js +11 -2
  114. package/dist/db/index.d.ts +29 -28
  115. package/dist/db/index.js +22 -20
  116. package/dist/db/known-table-names.d.ts +6 -0
  117. package/dist/db/known-table-names.js +21 -0
  118. package/dist/db/list-aggregate-labels.d.ts +1 -1
  119. package/dist/db/located-timestamp.d.ts +1 -1
  120. package/dist/db/located-timestamp.js +0 -5
  121. package/dist/db/migrate-generator.d.ts +17 -1
  122. package/dist/db/migrate-generator.js +50 -20
  123. package/dist/db/migrate-primary-key.d.ts +12 -0
  124. package/dist/db/migrate-primary-key.js +45 -0
  125. package/dist/db/migrate-rls-diff.d.ts +20 -0
  126. package/dist/db/migrate-rls-diff.js +61 -0
  127. package/dist/db/migrate-runner.js +4 -0
  128. package/dist/db/money.d.ts +1 -1
  129. package/dist/db/money.js +1 -1
  130. package/dist/db/parent-ref-clause.d.ts +2 -1
  131. package/dist/db/pg-error.d.ts +2 -0
  132. package/dist/db/pg-error.js +11 -0
  133. package/dist/db/queries/ddl.d.ts +3 -0
  134. package/dist/db/queries/ddl.js +34 -1
  135. package/dist/db/queries/event-store.js +4 -2
  136. package/dist/db/queries/event-tenants.d.ts +2 -0
  137. package/dist/db/queries/event-tenants.js +17 -0
  138. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  139. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  140. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  141. package/dist/db/queries/rls-boot-catalog.js +39 -0
  142. package/dist/db/queries/rls-catalog.d.ts +6 -0
  143. package/dist/db/queries/rls-catalog.js +82 -0
  144. package/dist/db/queries/rls-scope.d.ts +3 -0
  145. package/dist/db/queries/rls-scope.js +17 -0
  146. package/dist/db/queries/rls-shape.d.ts +10 -0
  147. package/dist/db/queries/rls-shape.js +42 -0
  148. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  149. package/dist/db/queries/session-advisory-lock.js +23 -0
  150. package/dist/db/queries/shadow-swap.d.ts +1 -2
  151. package/dist/db/queries/shadow-swap.js +9 -25
  152. package/dist/db/queries/test-stack.d.ts +4 -1
  153. package/dist/db/queries/test-stack.js +84 -2
  154. package/dist/db/query.js +11 -7
  155. package/dist/db/reference-data.d.ts +1 -1
  156. package/dist/db/reference-data.js +6 -1
  157. package/dist/db/render-ddl.d.ts +6 -2
  158. package/dist/db/render-ddl.js +7 -7
  159. package/dist/db/render-rls-ddl.d.ts +35 -0
  160. package/dist/db/render-rls-ddl.js +127 -0
  161. package/dist/db/replay-migration-sql.d.ts +3 -1
  162. package/dist/db/replay-migration-sql.js +22 -5
  163. package/dist/db/replay-rls.d.ts +25 -0
  164. package/dist/db/replay-rls.js +156 -0
  165. package/dist/db/row-level-security-boot-check.d.ts +6 -0
  166. package/dist/db/row-level-security-boot-check.js +86 -0
  167. package/dist/db/row-level-security-connection.d.ts +3 -0
  168. package/dist/db/row-level-security-connection.js +213 -0
  169. package/dist/db/row-level-security-scope.d.ts +33 -0
  170. package/dist/db/row-level-security-scope.js +127 -0
  171. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  172. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  173. package/dist/db/sql-identifier.d.ts +1 -0
  174. package/dist/db/sql-identifier.js +3 -0
  175. package/dist/db/table-builder.d.ts +2 -1
  176. package/dist/db/table-builder.js +1 -1
  177. package/dist/db/table-info.js +1 -1
  178. package/dist/db/table-push.d.ts +11 -2
  179. package/dist/db/table-push.js +15 -2
  180. package/dist/db/tenant-db-runner.d.ts +3 -1
  181. package/dist/db/tenant-db-runner.js +4 -3
  182. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  183. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  184. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  185. package/dist/db/tenant-db-statement-runner.js +48 -0
  186. package/dist/db/tenant-db.d.ts +17 -12
  187. package/dist/db/tenant-db.js +49 -120
  188. package/dist/db/tenant-id-filter.d.ts +3 -0
  189. package/dist/db/tenant-id-filter.js +30 -0
  190. package/dist/db/transaction-serialization.d.ts +6 -0
  191. package/dist/db/transaction-serialization.js +60 -0
  192. package/dist/derivatives/delete-stored-file.js +1 -1
  193. package/dist/derivatives/index.d.ts +2 -5
  194. package/dist/derivatives/index.js +2 -3
  195. package/dist/engine/access.d.ts +2 -1
  196. package/dist/engine/access.js +1 -1
  197. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  198. package/dist/engine/boot-validator/entity-handler.js +1 -1
  199. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  201. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  202. package/dist/engine/boot-validator/nav.d.ts +3 -1
  203. package/dist/engine/boot-validator/nav.js +1 -1
  204. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  205. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  206. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  207. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  209. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  210. package/dist/engine/boot-validator/screens.d.ts +2 -1
  211. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  212. package/dist/engine/bridge-stub.d.ts +5 -2
  213. package/dist/engine/bridge-stub.js +39 -24
  214. package/dist/engine/config-helpers.d.ts +2 -2
  215. package/dist/engine/config-helpers.js +0 -9
  216. package/dist/engine/constants.d.ts +0 -10
  217. package/dist/engine/constants.js +0 -8
  218. package/dist/engine/create-app.js +1 -1
  219. package/dist/engine/define-feature.d.ts +2 -1
  220. package/dist/engine/define-feature.js +1 -2
  221. package/dist/engine/define-handler.d.ts +1 -1
  222. package/dist/engine/define-step.d.ts +0 -1
  223. package/dist/engine/define-step.js +0 -3
  224. package/dist/engine/embedded-derived.d.ts +1 -1
  225. package/dist/engine/entity-handlers.d.ts +2 -1
  226. package/dist/engine/entity-handlers.js +7 -7
  227. package/dist/engine/entity-list-runtime-options.js +3 -1
  228. package/dist/engine/entity-list-searchability.d.ts +2 -1
  229. package/dist/engine/event-def.d.ts +2 -1
  230. package/dist/engine/event-helpers.d.ts +3 -1
  231. package/dist/engine/event-helpers.js +3 -3
  232. package/dist/engine/extension-names.d.ts +2 -8
  233. package/dist/engine/extension-names.js +2 -2
  234. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  235. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  236. package/dist/engine/extensions/user-data.d.ts +0 -8
  237. package/dist/engine/factories.d.ts +2 -1
  238. package/dist/engine/feature-builder-state.d.ts +8 -1
  239. package/dist/engine/feature-changelog.d.ts +1 -1
  240. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  241. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  242. package/dist/engine/feature-manifest.js +1 -1
  243. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  244. package/dist/engine/feature-ui-extensions.js +6 -4
  245. package/dist/engine/field-access.d.ts +2 -1
  246. package/dist/engine/handler-field-references.d.ts +0 -4
  247. package/dist/engine/index.d.ts +57 -54
  248. package/dist/engine/index.js +22 -27
  249. package/dist/engine/instruction-fields.d.ts +1 -1
  250. package/dist/engine/personal-data-fields.d.ts +1 -1
  251. package/dist/engine/qualified-name.d.ts +0 -1
  252. package/dist/engine/read-claim.d.ts +2 -1
  253. package/dist/engine/registry-facade.js +0 -3
  254. package/dist/engine/registry-ingest.d.ts +2 -1
  255. package/dist/engine/registry-ingest.js +1 -2
  256. package/dist/engine/registry-state.d.ts +12 -2
  257. package/dist/engine/registry-state.js +2 -3
  258. package/dist/engine/registry-validate.d.ts +3 -1
  259. package/dist/engine/registry-validate.js +7 -7
  260. package/dist/engine/run-in.d.ts +1 -1
  261. package/dist/engine/run-in.js +0 -1
  262. package/dist/engine/schema-builder.d.ts +1 -1
  263. package/dist/engine/schema-builder.js +1 -1
  264. package/dist/engine/screen-filter-ops.d.ts +2 -1
  265. package/dist/engine/screen-filter-ops.js +0 -5
  266. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  267. package/dist/engine/soft-delete-cleanup.js +4 -4
  268. package/dist/engine/state-machine.js +2 -1
  269. package/dist/engine/steps/_read-source.js +1 -1
  270. package/dist/engine/steps/aggregate-append-event.js +2 -2
  271. package/dist/engine/steps/call-feature.js +2 -2
  272. package/dist/engine/steps/mail-send.js +1 -1
  273. package/dist/engine/steps/retry.js +1 -1
  274. package/dist/engine/steps/wait-for-event.js +1 -1
  275. package/dist/engine/steps/wait.js +1 -1
  276. package/dist/engine/steps/webhook-send.js +1 -1
  277. package/dist/engine/template-variables.d.ts +2 -1
  278. package/dist/engine/transfer-adjacency.d.ts +1 -1
  279. package/dist/engine/types/index.d.ts +8 -31
  280. package/dist/engine/types/index.js +2 -10
  281. package/dist/engine/validation.d.ts +2 -1
  282. package/dist/entrypoint/index.d.ts +7 -35
  283. package/dist/entrypoint/index.js +7 -1
  284. package/dist/entrypoint/internals.d.ts +40 -0
  285. package/dist/entrypoint/internals.js +1 -0
  286. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  287. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  288. package/dist/env/dry-run-internals.d.ts +10 -0
  289. package/dist/env/dry-run-internals.js +1 -0
  290. package/dist/env/dry-run.d.ts +1 -10
  291. package/dist/env/dry-run.js +2 -1
  292. package/dist/env/index.d.ts +1 -85
  293. package/dist/env/index.js +6 -50
  294. package/dist/env/internals.d.ts +87 -0
  295. package/dist/env/internals.js +53 -0
  296. package/dist/errors/classes.js +2 -2
  297. package/dist/errors/index.d.ts +5 -14
  298. package/dist/errors/index.js +4 -9
  299. package/dist/errors/member-resolution.js +1 -1
  300. package/dist/errors/reasons.d.ts +0 -1
  301. package/dist/errors/reasons.js +7 -7
  302. package/dist/errors/serialize.d.ts +0 -18
  303. package/dist/errors/serialize.js +0 -27
  304. package/dist/es-ops/index.d.ts +4 -4
  305. package/dist/es-ops/index.js +2 -2
  306. package/dist/es-ops/operations-schema.d.ts +1 -1
  307. package/dist/es-ops/types.d.ts +4 -5
  308. package/dist/event-store/admin-api-internals.d.ts +14 -0
  309. package/dist/event-store/admin-api-internals.js +1 -0
  310. package/dist/event-store/admin-api.d.ts +1 -14
  311. package/dist/event-store/admin-api.js +11 -6
  312. package/dist/event-store/archive.js +4 -2
  313. package/dist/event-store/errors.js +2 -2
  314. package/dist/event-store/event-store.js +41 -34
  315. package/dist/event-store/events-schema.js +4 -1
  316. package/dist/event-store/index.d.ts +11 -13
  317. package/dist/event-store/index.js +7 -9
  318. package/dist/event-store/rebuild-dead-letter.js +4 -2
  319. package/dist/event-store/snapshot.js +4 -3
  320. package/dist/event-store/stream-scope.d.ts +2 -0
  321. package/dist/event-store/stream-scope.js +6 -0
  322. package/dist/event-store/upcaster-dead-letter.js +4 -2
  323. package/dist/event-store/upcaster.d.ts +2 -1
  324. package/dist/files/action-form-upload.d.ts +2 -1
  325. package/dist/files/action-form-upload.js +1 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  327. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  328. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  329. package/dist/files/bind-pending-file-refs.js +2 -1
  330. package/dist/files/bind-referenced-files.write.js +1 -1
  331. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  332. package/dist/files/create-file-ref-from-bytes.js +3 -3
  333. package/dist/files/create-file-ref.d.ts +3 -2
  334. package/dist/files/create-file-ref.js +2 -2
  335. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  336. package/dist/files/dispose-removed-file-refs.js +1 -1
  337. package/dist/files/feature.js +2 -2
  338. package/dist/files/file-handle.js +1 -1
  339. package/dist/files/file-routes.d.ts +1 -1
  340. package/dist/files/file-routes.js +12 -2
  341. package/dist/files/index.d.ts +11 -13
  342. package/dist/files/index.js +5 -7
  343. package/dist/files/load-save-file-refs.d.ts +2 -1
  344. package/dist/files/load-save-file-refs.js +1 -1
  345. package/dist/files/provider-resolver.d.ts +5 -4
  346. package/dist/files/provider-resolver.js +4 -4
  347. package/dist/files/storage-tracking.js +4 -2
  348. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  349. package/dist/files/sweep-orphaned-uploads.js +1 -1
  350. package/dist/i18n/index.d.ts +2 -8
  351. package/dist/i18n/index.js +1 -1
  352. package/dist/i18n/internals.d.ts +7 -0
  353. package/dist/i18n/internals.js +1 -0
  354. package/dist/i18n/required-surface-keys.d.ts +4 -1
  355. package/dist/internal/row-level-security.d.ts +3 -0
  356. package/dist/internal/row-level-security.js +3 -0
  357. package/dist/internal/stack-support.d.ts +1 -1
  358. package/dist/internal/stack-support.js +1 -1
  359. package/dist/internal/testing.d.ts +1 -0
  360. package/dist/internal/testing.js +9 -5
  361. package/dist/jobs/index.d.ts +1 -1
  362. package/dist/jobs/job-append-event.d.ts +12 -0
  363. package/dist/jobs/job-append-event.js +30 -0
  364. package/dist/jobs/job-runner-context.d.ts +2 -2
  365. package/dist/jobs/job-runner-context.js +46 -16
  366. package/dist/jobs/job-runner-execution.d.ts +1 -1
  367. package/dist/jobs/job-runner-execution.js +6 -4
  368. package/dist/jobs/job-runner-gates.d.ts +1 -1
  369. package/dist/jobs/job-runner-gates.js +0 -1
  370. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  371. package/dist/jobs/job-runner-helpers.js +10 -1
  372. package/dist/jobs/job-runner-scope.d.ts +5 -2
  373. package/dist/jobs/job-runner-types.d.ts +2 -1
  374. package/dist/jobs/job-runner.js +19 -6
  375. package/dist/jobs/max-per-tenant.d.ts +1 -1
  376. package/dist/logging/index.d.ts +1 -2
  377. package/dist/logging/index.js +1 -1
  378. package/dist/logging/pino-logger.js +1 -1
  379. package/dist/logging/utils.d.ts +1 -0
  380. package/dist/logging/utils.js +6 -0
  381. package/dist/migrations/index.d.ts +3 -3
  382. package/dist/migrations/index.js +3 -3
  383. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  384. package/dist/migrations/pending-rebuilds.js +1 -1
  385. package/dist/migrations/pii-event-backfill.js +4 -1
  386. package/dist/observability/escape-hatch-report.d.ts +2 -1
  387. package/dist/observability/index.d.ts +7 -15
  388. package/dist/observability/index.js +4 -12
  389. package/dist/observability/metric-validator.js +1 -1
  390. package/dist/observability/metrics-handle.d.ts +0 -1
  391. package/dist/observability/metrics-handle.js +2 -15
  392. package/dist/observability/recording-tracer.d.ts +1 -2
  393. package/dist/observability/recording-tracer.js +0 -6
  394. package/dist/observability/sensitive-filter.d.ts +0 -2
  395. package/dist/observability/sensitive-filter.js +0 -29
  396. package/dist/pipeline/active-membership.d.ts +2 -1
  397. package/dist/pipeline/active-membership.js +6 -2
  398. package/dist/pipeline/append-event-core.d.ts +2 -1
  399. package/dist/pipeline/append-event-core.js +2 -2
  400. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  401. package/dist/pipeline/attach-outside-transaction.js +13 -0
  402. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.d.ts +2 -1
  404. package/dist/pipeline/cascade-handler.js +3 -2
  405. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  406. package/dist/pipeline/config-accessor-factory.js +1 -1
  407. package/dist/pipeline/context-services.d.ts +56 -0
  408. package/dist/pipeline/context-services.js +73 -0
  409. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  410. package/dist/pipeline/dispatch-batch.js +31 -18
  411. package/dist/pipeline/dispatch-query.js +5 -4
  412. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  413. package/dist/pipeline/dispatch-scope.js +27 -0
  414. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  415. package/dist/pipeline/dispatch-shared.js +75 -198
  416. package/dist/pipeline/dispatch-stream.js +8 -4
  417. package/dist/pipeline/dispatch-write.d.ts +2 -1
  418. package/dist/pipeline/dispatch-write.js +10 -8
  419. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  420. package/dist/pipeline/dispatcher-utils.js +8 -2
  421. package/dist/pipeline/dispatcher.d.ts +3 -2
  422. package/dist/pipeline/dispatcher.js +4 -3
  423. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  424. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  425. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  426. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  427. package/dist/pipeline/event-dispatcher.js +7 -3
  428. package/dist/pipeline/event-retention.js +59 -56
  429. package/dist/pipeline/handler-access-error.js +2 -1
  430. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  431. package/dist/pipeline/handler-context-auth.js +7 -4
  432. package/dist/pipeline/handler-context-config.d.ts +2 -5
  433. package/dist/pipeline/handler-context-config.js +2 -2
  434. package/dist/pipeline/handler-context-db.d.ts +32 -7
  435. package/dist/pipeline/handler-context-db.js +26 -17
  436. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  437. package/dist/pipeline/handler-context-dispatch.js +9 -8
  438. package/dist/pipeline/handler-context-events.d.ts +22 -36
  439. package/dist/pipeline/handler-context-events.js +36 -31
  440. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  441. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  442. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  443. package/dist/pipeline/handler-context-notify.js +1 -1
  444. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  445. package/dist/pipeline/handler-context-observability.js +7 -5
  446. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  447. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  448. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  449. package/dist/pipeline/handler-context-scope.js +18 -20
  450. package/dist/pipeline/index.d.ts +9 -21
  451. package/dist/pipeline/index.js +5 -7
  452. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  453. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  454. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  455. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  456. package/dist/pipeline/member-read-only-transaction.js +11 -3
  457. package/dist/pipeline/member-reader.d.ts +1 -1
  458. package/dist/pipeline/member-reader.js +2 -2
  459. package/dist/pipeline/msp-rebuild.js +5 -3
  460. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  461. package/dist/pipeline/notify-scope.d.ts +2 -1
  462. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  463. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  464. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  465. package/dist/pipeline/projection-rebuild.js +12 -5
  466. package/dist/pipeline/projection-state.d.ts +0 -6
  467. package/dist/pipeline/projection-state.js +0 -5
  468. package/dist/pipeline/projections-runner.d.ts +2 -1
  469. package/dist/pipeline/projections-runner.js +10 -6
  470. package/dist/pipeline/system-hooks.d.ts +3 -1
  471. package/dist/pipeline/system-hooks.js +6 -4
  472. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  473. package/dist/pipeline/system-identity-switch.js +51 -36
  474. package/dist/pipeline/typed-append-event.d.ts +2 -0
  475. package/dist/pipeline/typed-append-event.js +4 -0
  476. package/dist/pipeline/write-origin.js +2 -2
  477. package/dist/pipeline/write-result-masking.d.ts +1 -1
  478. package/dist/random/index.d.ts +1 -2
  479. package/dist/random/index.js +1 -2
  480. package/dist/rate-limit/bucket.d.ts +2 -1
  481. package/dist/rate-limit/middleware.js +2 -1
  482. package/dist/redis/index.d.ts +3 -4
  483. package/dist/redis/index.js +2 -2
  484. package/dist/schema-cli/apply-command.js +5 -2
  485. package/dist/schema-cli/baseline-command.js +7 -2
  486. package/dist/schema-cli/generate-command.js +7 -9
  487. package/dist/schema-cli/shared.d.ts +12 -2
  488. package/dist/schema-cli/shared.js +24 -2
  489. package/dist/schema-cli/status-command.js +8 -2
  490. package/dist/schema-cli/validate-command.js +48 -4
  491. package/dist/schema-cli.d.ts +0 -1
  492. package/dist/search/configure-tenant-index.d.ts +1 -3
  493. package/dist/search/configure-tenant-index.js +0 -4
  494. package/dist/search/index.d.ts +1 -4
  495. package/dist/search/index.js +0 -2
  496. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  497. package/dist/search/meilisearch-adapter-internals.js +9 -0
  498. package/dist/search/meilisearch-adapter.d.ts +1 -8
  499. package/dist/search/meilisearch-adapter.js +6 -7
  500. package/dist/search/meilisearch-peer.d.ts +2 -0
  501. package/dist/search/meilisearch-peer.js +5 -0
  502. package/dist/search/reindex-entity.js +93 -87
  503. package/dist/secrets/index.d.ts +3 -4
  504. package/dist/secrets/index.js +2 -3
  505. package/dist/seeding/index.d.ts +2 -2
  506. package/dist/seeding/index.js +1 -2
  507. package/dist/time/index.d.ts +2 -2
  508. package/dist/time/index.js +1 -1
  509. package/dist/time/tz-context.d.ts +0 -5
  510. package/dist/time/tz-context.js +0 -9
  511. package/dist/ui-types/index.d.ts +8 -11
  512. package/dist/ui-types/index.js +3 -3
  513. package/dist/upgrade-changelog.d.ts +3 -2
  514. package/dist/upgrade-changelog.js +12 -8
  515. package/dist/upgrade-cli-internals.d.ts +8 -0
  516. package/dist/upgrade-cli-internals.js +63 -0
  517. package/dist/upgrade-cli.d.ts +2 -9
  518. package/dist/upgrade-cli.js +28 -70
  519. package/dist/utils/import-optional-peer.d.ts +6 -0
  520. package/dist/utils/import-optional-peer.js +19 -0
  521. package/dist/utils/index.d.ts +1 -4
  522. package/dist/utils/index.js +1 -4
  523. package/package.json +23 -19
  524. package/src/changes.json +236 -0
  525. package/dist/crypto/request-kms-cache.d.ts +0 -8
  526. package/dist/crypto/request-kms-cache.js +0 -21
  527. package/dist/engine/codemod/index.d.ts +0 -2
  528. package/dist/engine/codemod/index.js +0 -1
  529. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  530. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  531. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  532. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  533. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  534. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  535. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  536. package/dist/engine/feature-ast/extractors/events.js +0 -275
  537. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  538. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  539. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  540. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  541. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  542. package/dist/engine/feature-ast/extractors/index.js +0 -13
  543. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  544. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  545. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  546. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  547. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  548. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  549. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  550. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  551. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  552. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  553. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  554. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  555. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  556. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  557. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  558. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  559. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  560. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  561. package/dist/engine/feature-ast/index.d.ts +0 -16
  562. package/dist/engine/feature-ast/index.js +0 -10
  563. package/dist/engine/feature-ast/parse.d.ts +0 -31
  564. package/dist/engine/feature-ast/parse.js +0 -485
  565. package/dist/engine/feature-ast/patch.d.ts +0 -212
  566. package/dist/engine/feature-ast/patch.js +0 -611
  567. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  568. package/dist/engine/feature-ast/patcher.js +0 -281
  569. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  570. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  571. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  572. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  573. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  574. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  575. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  576. package/dist/engine/feature-ast/patterns.js +0 -107
  577. package/dist/engine/feature-ast/render.d.ts +0 -47
  578. package/dist/engine/feature-ast/render.js +0 -666
  579. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  580. package/dist/engine/feature-ast/source-location.js +0 -27
  581. package/dist/engine/pattern-library/index.d.ts +0 -2
  582. package/dist/engine/pattern-library/index.js +0 -3
  583. package/dist/engine/pattern-library/library.d.ts +0 -14
  584. package/dist/engine/pattern-library/library.js +0 -94
  585. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  586. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  587. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  588. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  589. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  590. package/dist/engine/pattern-library/shared-fields.js +0 -88
  591. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  592. package/dist/engine/pattern-library/static-schemas.js +0 -487
  593. package/dist/engine/pattern-library/types.d.ts +0 -158
  594. package/dist/engine/pattern-library/types.js +0 -36
  595. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  596. package/dist/engine/resolve-config-or-param.js +0 -76
  597. package/src/scripts/codemod/README.md +0 -187
  598. package/src/scripts/codemod/codemod-support.ts +0 -334
  599. package/src/scripts/codemod/collect-source-files.ts +0 -48
  600. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  601. package/src/scripts/codemod/db-factory.ts +0 -810
  602. package/src/scripts/codemod/feature-factory.ts +0 -429
  603. package/src/scripts/codemod/feature-layout.ts +0 -424
  604. package/src/scripts/codemod/import-extensions.ts +0 -118
  605. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  606. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  607. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  608. package/src/scripts/codemod/object-form.ts +0 -746
  609. package/src/scripts/codemod/package-merge.ts +0 -299
  610. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  611. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  612. package/src/scripts/codemod/s3-imports.ts +0 -236
  613. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  614. package/src/scripts/codemod/testing-injection.ts +0 -215
  615. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  616. package/src/scripts/codemod/testing-move.ts +0 -542
  617. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -1,810 +0,0 @@
1
- #!/usr/bin/env bun
2
- // db-factory — `createDbConnection({ url, ... })` is the only DB connection factory and the query
3
- // helpers moved from `@cosmicdrift/kumiko-framework/bun-db` into `@cosmicdrift/kumiko-framework/db`.
4
- //
5
- // Usage:
6
- // bun scripts/codemod/db-factory.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 {
13
- type CallExpression,
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
-
24
- export interface DbFactorySite {
25
- readonly file: string;
26
- readonly line: number;
27
- readonly kind: "import" | "call";
28
- readonly description: string;
29
- }
30
-
31
- export interface DbFactoryResult {
32
- readonly output: string;
33
- readonly rewrites: DbFactorySite[];
34
- readonly manual: DbFactorySite[];
35
- }
36
-
37
- interface NamedElement {
38
- readonly name: string;
39
- readonly alias: string | undefined;
40
- readonly isTypeOnly: boolean;
41
- }
42
-
43
- type NamedDeclaration = ImportDeclaration | ExportDeclaration;
44
- type SiteLists = { rewrites: DbFactorySite[]; manual: DbFactorySite[] };
45
-
46
- const FRAMEWORK_PACKAGE = "@cosmicdrift/kumiko-framework";
47
- const FRAMEWORK_SRC_MARKER = "/packages/framework/src/";
48
- const FACTORY_NAME = "createDbConnection";
49
- const RENAMED_FACTORY_NAMES: ReadonlySet<string> = new Set([
50
- "createConnection",
51
- "createPgConnection",
52
- ]);
53
- const REMOVED_NAMES: ReadonlySet<string> = new Set([
54
- "createBunDbConnection",
55
- "bunDbConnectionOptionsFromEnv",
56
- "BunDbConnection",
57
- "BunDbTx",
58
- "BunDbRunner",
59
- "BunDbConnectionOptions",
60
- "DbPoolHandle",
61
- ]);
62
- const REMOVED_ENV_NAME = "DB_PROVIDER";
63
-
64
- const CHEAP_PREFILTER =
65
- /bun-db|query-api|createConnection|createPgConnection|createDbConnection|DB_PROVIDER|BunDb|bunDbConnection|DbPoolHandle|db\/api|postgres-provider/;
66
- const SKIPPED_PATH_SUFFIXES: readonly string[] = [
67
- "packages/framework/src/db/bun-db-deprecated.ts",
68
- "packages/framework/src/scripts/codemod/db-factory.ts",
69
- "packages/framework/src/__tests__/db-factory-codemod.test.ts",
70
- ];
71
-
72
- // Relative framework module (extension stripped, below packages/framework/src) -> new module.
73
- const MOVED_FRAMEWORK_MODULES: Readonly<Record<string, string>> = {
74
- "bun-db": "db/query",
75
- "bun-db/index": "db/query",
76
- "bun-db/query": "db/query",
77
- "db/query-api": "db/query",
78
- "db/api": "db/connection",
79
- "db/postgres-provider": "db/connection",
80
- };
81
-
82
- const SCRIPT_EXTENSION = /\.(js|ts|tsx)$/;
83
-
84
- function frameworkRelativeModule(
85
- specifier: string,
86
- filePath: string,
87
- ): { readonly root: string; readonly module: string } | undefined {
88
- if (!specifier.startsWith(".")) return undefined;
89
- const resolved = resolve(dirname(filePath), specifier).replace(SCRIPT_EXTENSION, "");
90
- const markerIndex = resolved.lastIndexOf(FRAMEWORK_SRC_MARKER);
91
- if (markerIndex === -1) return undefined;
92
- return {
93
- root: resolved.slice(0, markerIndex + FRAMEWORK_SRC_MARKER.length),
94
- module: resolved.slice(markerIndex + FRAMEWORK_SRC_MARKER.length),
95
- };
96
- }
97
-
98
- function isFrameworkSpecifier(specifier: string, filePath: string): boolean {
99
- return (
100
- specifier === FRAMEWORK_PACKAGE ||
101
- specifier.startsWith(`${FRAMEWORK_PACKAGE}/`) ||
102
- frameworkRelativeModule(specifier, filePath) !== undefined
103
- );
104
- }
105
-
106
- function relativeSpecifier(
107
- fromFile: string,
108
- root: string,
109
- module: string,
110
- extension: string,
111
- ): string {
112
- const path = relative(dirname(fromFile), join(root, module)).split("\\").join("/");
113
- return `${path.startsWith(".") ? path : `./${path}`}${extension}`;
114
- }
115
-
116
- function newSpecifierFor(specifier: string, filePath: string): string | undefined {
117
- if (specifier === `${FRAMEWORK_PACKAGE}/bun-db`) return `${FRAMEWORK_PACKAGE}/db`;
118
- const framework = frameworkRelativeModule(specifier, filePath);
119
- const target = framework === undefined ? undefined : MOVED_FRAMEWORK_MODULES[framework.module];
120
- if (framework === undefined || target === undefined) return undefined;
121
- return relativeSpecifier(
122
- filePath,
123
- framework.root,
124
- target,
125
- SCRIPT_EXTENSION.exec(specifier)?.[0] ?? "",
126
- );
127
- }
128
-
129
- function elementsOf(declaration: NamedDeclaration): NamedElement[] {
130
- const specifiers = Node.isImportDeclaration(declaration)
131
- ? declaration.getNamedImports()
132
- : declaration.getNamedExports();
133
- return specifiers.map((specifier) => ({
134
- name: specifier.getName(),
135
- alias: specifier.getAliasNode()?.getText(),
136
- isTypeOnly: specifier.isTypeOnly(),
137
- }));
138
- }
139
-
140
- function elementText(element: NamedElement): string {
141
- const alias = element.alias === undefined ? "" : ` as ${element.alias}`;
142
- return `${element.isTypeOnly ? "type " : ""}${element.name}${alias}`;
143
- }
144
-
145
- function declarationText(
146
- original: NamedDeclaration,
147
- specifier: string,
148
- elements: readonly NamedElement[],
149
- ): string {
150
- const keyword = Node.isImportDeclaration(original) ? "import" : "export";
151
- const typeOnly = original.isTypeOnly() ? " type" : "";
152
- return `${keyword}${typeOnly} { ${elements.map(elementText).join(", ")} } from "${specifier}";`;
153
- }
154
-
155
- function sameElement(a: NamedElement, b: NamedElement): boolean {
156
- return a.name === b.name && a.alias === b.alias;
157
- }
158
-
159
- function isMergeTarget(candidate: NamedDeclaration, original: NamedDeclaration): boolean {
160
- if (candidate === original || candidate.isTypeOnly() !== original.isTypeOnly()) return false;
161
- if (Node.isImportDeclaration(candidate)) {
162
- return (
163
- candidate.getNamespaceImport() === undefined && candidate.getDefaultImport() === undefined
164
- );
165
- }
166
- return !candidate.isNamespaceExport() && candidate.getNamedExports().length > 0;
167
- }
168
-
169
- function findMergeTarget(
170
- sourceFile: SourceFile,
171
- original: NamedDeclaration,
172
- specifier: string,
173
- ): NamedDeclaration | undefined {
174
- const sameKind: readonly NamedDeclaration[] = Node.isImportDeclaration(original)
175
- ? sourceFile.getImportDeclarations()
176
- : sourceFile.getExportDeclarations();
177
- return sameKind.find(
178
- (candidate) =>
179
- candidate.getModuleSpecifierValue() === specifier && isMergeTarget(candidate, original),
180
- );
181
- }
182
-
183
- function mergeInto(target: NamedDeclaration, elements: readonly NamedElement[]): void {
184
- const present = elementsOf(target);
185
- for (const element of elements) {
186
- if (present.some((existing) => sameElement(existing, element))) continue;
187
- const structure =
188
- element.alias === undefined
189
- ? { name: element.name, isTypeOnly: element.isTypeOnly }
190
- : { name: element.name, alias: element.alias, isTypeOnly: element.isTypeOnly };
191
- if (Node.isImportDeclaration(target)) target.addNamedImport(structure);
192
- else target.addNamedExport(structure);
193
- }
194
- }
195
-
196
- function isWholeModuleReference(declaration: NamedDeclaration): boolean {
197
- if (Node.isImportDeclaration(declaration)) {
198
- return (
199
- declaration.getNamespaceImport() !== undefined || declaration.getDefaultImport() !== undefined
200
- );
201
- }
202
- return declaration.isNamespaceExport() || declaration.getNamedExports().length === 0;
203
- }
204
-
205
- function hasFactoryBinding(sourceFile: SourceFile): boolean {
206
- return sourceFile
207
- .getImportDeclarations()
208
- .some((declaration) =>
209
- declaration
210
- .getNamedImports()
211
- .some((named) => (named.getAliasNode()?.getText() ?? named.getName()) === FACTORY_NAME),
212
- );
213
- }
214
-
215
- function isRenamedFactoryElement(element: NamedElement): boolean {
216
- return RENAMED_FACTORY_NAMES.has(element.name);
217
- }
218
-
219
- function isUnaliasedRenamedFactory(element: NamedElement | undefined): boolean {
220
- return element !== undefined && element.alias === undefined && isRenamedFactoryElement(element);
221
- }
222
-
223
- function renameFactoryElement(element: NamedElement): NamedElement {
224
- return isRenamedFactoryElement(element) ? { ...element, name: FACTORY_NAME } : element;
225
- }
226
-
227
- function removedNameSite(
228
- element: NamedElement,
229
- specifier: string,
230
- filePath: string,
231
- line: number,
232
- ): DbFactorySite {
233
- return {
234
- file: filePath,
235
- line,
236
- kind: "import",
237
- description: `${element.name} from ${specifier}: removed without replacement`,
238
- };
239
- }
240
-
241
- function reexportedFactorySite(
242
- element: NamedElement,
243
- specifier: string,
244
- filePath: string,
245
- line: number,
246
- ): DbFactorySite {
247
- return {
248
- file: filePath,
249
- line,
250
- kind: "import",
251
- description: `${element.name} re-exported from ${specifier}: the factory is now sync, re-export ${FACTORY_NAME}`,
252
- };
253
- }
254
-
255
- // A duplicate createDbConnection binding would not compile; the call sites use the existing one.
256
- function renamedWithoutDuplicates(
257
- moved: readonly NamedElement[],
258
- alreadyBound: boolean,
259
- ): NamedElement[] {
260
- return moved
261
- .filter((element) => !(alreadyBound && isUnaliasedRenamedFactory(element)))
262
- .map(renameFactoryElement)
263
- .filter(
264
- (element, index, all) => all.findIndex((other) => sameElement(other, element)) === index,
265
- );
266
- }
267
-
268
- // remove() would drop the leading comments with the declaration (e.g. a file-level lint marker
269
- // that has to stay attached to the next statement), so only the declaration's own line goes.
270
- function declarationLineRange(
271
- sourceFile: SourceFile,
272
- declaration: NamedDeclaration,
273
- ): [number, number] {
274
- const end = declaration.getEnd();
275
- return [declaration.getStart(), sourceFile.getFullText()[end] === "\n" ? end + 1 : end];
276
- }
277
-
278
- function removeDeclarationLine(sourceFile: SourceFile, declaration: NamedDeclaration): void {
279
- sourceFile.replaceText(declarationLineRange(sourceFile, declaration), "");
280
- }
281
-
282
- function replaceDeclaration(
283
- sourceFile: SourceFile,
284
- declaration: NamedDeclaration,
285
- parts: {
286
- readonly specifier: string;
287
- readonly nextSpecifier: string;
288
- readonly kept: readonly NamedElement[];
289
- readonly moved: readonly NamedElement[];
290
- },
291
- ): void {
292
- const { specifier, nextSpecifier, kept, moved } = parts;
293
- const mergeTarget =
294
- nextSpecifier === specifier
295
- ? undefined
296
- : findMergeTarget(sourceFile, declaration, nextSpecifier);
297
- const replacementLines: string[] = [];
298
- if (kept.length > 0) replacementLines.push(declarationText(declaration, specifier, kept));
299
- if (moved.length > 0 && mergeTarget === undefined) {
300
- replacementLines.push(declarationText(declaration, nextSpecifier, moved));
301
- }
302
- if (
303
- moved.length > 0 &&
304
- mergeTarget !== undefined &&
305
- replacementLines.length === 0 &&
306
- mergeTarget.getStart() > declaration.getStart()
307
- ) {
308
- // ts-morph cannot cut a declaration that sits before a node it just grew ("children
309
- // left over"), so the file text is rebuilt once and every node is re-parsed.
310
- const present = elementsOf(mergeTarget);
311
- const merged = [
312
- ...present,
313
- ...moved.filter((element) => !present.some((existing) => sameElement(existing, element))),
314
- ];
315
- const text = sourceFile.getFullText();
316
- const [removedStart, removedEnd] = declarationLineRange(sourceFile, declaration);
317
- sourceFile.replaceWithText(
318
- text.slice(0, removedStart) +
319
- text.slice(removedEnd, mergeTarget.getStart()) +
320
- declarationText(mergeTarget, nextSpecifier, merged) +
321
- text.slice(mergeTarget.getEnd()),
322
- );
323
- } else {
324
- if (moved.length > 0 && mergeTarget !== undefined) mergeInto(mergeTarget, moved);
325
- if (replacementLines.length === 0) {
326
- removeDeclarationLine(sourceFile, declaration);
327
- } else {
328
- // replaceWithText keeps the blank lines around the declaration, remove() would eat them.
329
- declaration.replaceWithText(replacementLines.join("\n"));
330
- }
331
- }
332
- }
333
-
334
- function describeRewrite(specifier: string, nextSpecifier: string): string {
335
- return nextSpecifier === specifier
336
- ? `${specifier}: ${[...RENAMED_FACTORY_NAMES].join("/")} -> ${FACTORY_NAME}`
337
- : `${specifier} -> ${nextSpecifier}`;
338
- }
339
-
340
- function rewriteNamedDeclaration(
341
- sourceFile: SourceFile,
342
- declaration: NamedDeclaration,
343
- filePath: string,
344
- line: number,
345
- result: SiteLists,
346
- ): void {
347
- const specifier = declaration.getModuleSpecifierValue();
348
- if (specifier === undefined || !isFrameworkSpecifier(specifier, filePath)) {
349
- // skip: not a framework module, nothing moved there
350
- return;
351
- }
352
- const nextSpecifier = newSpecifierFor(specifier, filePath) ?? specifier;
353
- const site = { file: filePath, line, kind: "import" } as const;
354
-
355
- if (isWholeModuleReference(declaration)) {
356
- if (nextSpecifier !== specifier) {
357
- declaration.setModuleSpecifier(nextSpecifier);
358
- result.rewrites.push({ ...site, description: describeRewrite(specifier, nextSpecifier) });
359
- }
360
- // skip: whole-module references carry no names to rename or split
361
- return;
362
- }
363
-
364
- const isImport = Node.isImportDeclaration(declaration);
365
- const elements = elementsOf(declaration);
366
- const kept = elements.filter((element) => REMOVED_NAMES.has(element.name));
367
- const moved = elements.filter((element) => !REMOVED_NAMES.has(element.name));
368
- for (const element of kept) {
369
- result.manual.push(removedNameSite(element, specifier, filePath, line));
370
- }
371
- if (!isImport) {
372
- for (const element of moved.filter(isRenamedFactoryElement)) {
373
- result.manual.push(reexportedFactorySite(element, specifier, filePath, line));
374
- }
375
- }
376
- const renamesFactory = isImport && moved.some(isRenamedFactoryElement);
377
- if (moved.length === 0 || (nextSpecifier === specifier && !renamesFactory)) {
378
- // skip: nothing to move or rename in this declaration
379
- return;
380
- }
381
-
382
- const movedElements = isImport
383
- ? renamedWithoutDuplicates(moved, hasFactoryBinding(sourceFile))
384
- : moved;
385
- replaceDeclaration(sourceFile, declaration, {
386
- specifier,
387
- nextSpecifier,
388
- kept,
389
- moved: movedElements,
390
- });
391
- result.rewrites.push({ ...site, description: describeRewrite(specifier, nextSpecifier) });
392
- }
393
-
394
- function namedDeclarationsOf(sourceFile: SourceFile): NamedDeclaration[] {
395
- return [...sourceFile.getImportDeclarations(), ...sourceFile.getExportDeclarations()];
396
- }
397
-
398
- function rewriteDeclarations(sourceFile: SourceFile, filePath: string, result: SiteLists): void {
399
- // Lines are read up front: replacing an earlier declaration shifts everything below it.
400
- const linesBefore = namedDeclarationsOf(sourceFile).map((declaration) =>
401
- declaration.getStartLineNumber(),
402
- );
403
- // removeDeclarationLine edits the raw text, after which ts-morph forgets every later node,
404
- // so the declarations are fetched again for each step instead of iterating a stale list.
405
- let position = 0;
406
- for (const line of linesBefore) {
407
- const declarations = namedDeclarationsOf(sourceFile);
408
- const declaration = declarations[position];
409
- if (declaration === undefined) {
410
- // skip: an earlier merge removed the remaining declarations, nothing is left to rewrite
411
- return;
412
- }
413
- rewriteNamedDeclaration(sourceFile, declaration, filePath, line, result);
414
- // A split adds a declaration and a merge removes one; both shift the next position.
415
- position += 1 + namedDeclarationsOf(sourceFile).length - declarations.length;
416
- }
417
- }
418
-
419
- function stringLiteralOf(node: Node | undefined): string | undefined {
420
- return node !== undefined && Node.isStringLiteral(node) ? node.getLiteralValue() : undefined;
421
- }
422
-
423
- function importTypeSpecifier(node: ImportTypeNode): string | undefined {
424
- const argument = node.getArgument();
425
- return Node.isLiteralTypeNode(argument) ? stringLiteralOf(argument.getLiteral()) : undefined;
426
- }
427
-
428
- function isModuleMockCall(call: Node): boolean {
429
- return Node.isCallExpression(call) && call.getExpression().getText() === "mock.module";
430
- }
431
-
432
- function isDynamicImportCall(call: Node): boolean {
433
- return Node.isCallExpression(call) && call.getExpression().getKind() === SyntaxKind.ImportKeyword;
434
- }
435
-
436
- function rewriteDynamicSites(sourceFile: SourceFile, filePath: string, result: SiteLists): void {
437
- const sites: { specifier: string; line: number; replace: (next: string) => void }[] = [];
438
- for (const node of sourceFile.getDescendantsOfKind(SyntaxKind.ImportType)) {
439
- const specifier = importTypeSpecifier(node);
440
- if (specifier === undefined) continue;
441
- sites.push({
442
- specifier,
443
- line: node.getStartLineNumber(),
444
- replace: (next) => node.setArgument(next),
445
- });
446
- }
447
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
448
- if (!isDynamicImportCall(call) && !isModuleMockCall(call)) continue;
449
- const argument = call.getArguments()[0];
450
- const specifier = stringLiteralOf(argument);
451
- if (argument === undefined || specifier === undefined) continue;
452
- sites.push({
453
- specifier,
454
- line: call.getStartLineNumber(),
455
- replace: (next) => argument.replaceWithText(JSON.stringify(next)),
456
- });
457
- }
458
- for (const site of sites) {
459
- const next = newSpecifierFor(site.specifier, filePath);
460
- if (next === undefined) continue;
461
- site.replace(next);
462
- result.rewrites.push({
463
- file: filePath,
464
- line: site.line,
465
- kind: "import",
466
- description: `${site.specifier} -> ${next}`,
467
- });
468
- }
469
- }
470
-
471
- interface FactoryBinding {
472
- readonly importedName: string;
473
- readonly isAliased: boolean;
474
- }
475
-
476
- function factoryBindings(sourceFile: SourceFile, filePath: string): Map<string, FactoryBinding> {
477
- const bindings = new Map<string, FactoryBinding>();
478
- for (const declaration of sourceFile.getImportDeclarations()) {
479
- if (!isFrameworkSpecifier(declaration.getModuleSpecifierValue(), filePath)) continue;
480
- for (const named of declaration.getNamedImports()) {
481
- const importedName = named.getName();
482
- if (importedName !== FACTORY_NAME && !RENAMED_FACTORY_NAMES.has(importedName)) continue;
483
- const alias = named.getAliasNode()?.getText();
484
- bindings.set(alias ?? importedName, { importedName, isAliased: alias !== undefined });
485
- }
486
- }
487
- addDynamicImportBindings(sourceFile, filePath, bindings);
488
- return bindings;
489
- }
490
-
491
- // `const { createDbConnection } = await import("@cosmicdrift/kumiko-framework/db")`
492
- function addDynamicImportBindings(
493
- sourceFile: SourceFile,
494
- filePath: string,
495
- bindings: Map<string, FactoryBinding>,
496
- ): void {
497
- for (const declaration of sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration)) {
498
- const pattern = declaration.getNameNode();
499
- const initializer = declaration.getInitializer();
500
- const importCall = Node.isAwaitExpression(initializer)
501
- ? initializer.getExpression()
502
- : initializer;
503
- if (!Node.isObjectBindingPattern(pattern) || !Node.isCallExpression(importCall)) continue;
504
- if (!isDynamicImportCall(importCall)) continue;
505
- const specifier = stringLiteralOf(importCall.getArguments()[0]);
506
- if (specifier === undefined || !isFrameworkSpecifier(specifier, filePath)) continue;
507
- for (const element of pattern.getElements()) {
508
- const importedName = element.getPropertyNameNode()?.getText() ?? element.getName();
509
- if (importedName !== FACTORY_NAME) continue;
510
- bindings.set(element.getName(), {
511
- importedName,
512
- isAliased: element.getName() !== importedName,
513
- });
514
- }
515
- }
516
- }
517
-
518
- function urlProperty(urlArgument: Node): string {
519
- return Node.isIdentifier(urlArgument) && urlArgument.getText() === "url"
520
- ? "url"
521
- : `url: ${urlArgument.getText()}`;
522
- }
523
-
524
- function objectBodyText(literal: Node): string {
525
- const text = literal.getText().trim();
526
- return text.slice(1, -1).trim().replace(/,$/, "");
527
- }
528
-
529
- function spreadableText(expression: Node): string {
530
- const isSelfDelimiting =
531
- Node.isIdentifier(expression) ||
532
- Node.isCallExpression(expression) ||
533
- Node.isPropertyAccessExpression(expression) ||
534
- Node.isElementAccessExpression(expression) ||
535
- Node.isParenthesizedExpression(expression);
536
- return isSelfDelimiting ? expression.getText() : `(${expression.getText()})`;
537
- }
538
-
539
- function optionsObjectText(args: readonly Node[]): string | undefined {
540
- const [urlArgument, optionsArgument] = args;
541
- if (urlArgument === undefined || args.length > 2) return undefined;
542
- if (args.some((argument) => Node.isSpreadElement(argument))) return undefined;
543
- const url = urlProperty(urlArgument);
544
- if (optionsArgument === undefined) return `{ ${url} }`;
545
- if (Node.isObjectLiteralExpression(optionsArgument)) {
546
- const body = objectBodyText(optionsArgument);
547
- if (body === "") return `{ ${url} }`;
548
- // A line comment in the body would swallow a closing brace on the same line.
549
- return body.includes("\n") || body.includes("//")
550
- ? `{ ${url},\n${body}\n}`
551
- : `{ ${url}, ${body} }`;
552
- }
553
- return `{ ${url}, ...${spreadableText(optionsArgument)} }`;
554
- }
555
-
556
- function isObjectFormCall(call: CallExpression): boolean {
557
- const args = call.getArguments();
558
- return args.length === 1 && Node.isObjectLiteralExpression(args[0]);
559
- }
560
-
561
- function rewriteFactoryCalls(sourceFile: SourceFile, filePath: string, result: SiteLists): void {
562
- const bindings = factoryBindings(sourceFile, filePath);
563
- if (bindings.size === 0) {
564
- // skip: file imports no factory from the framework
565
- return;
566
- }
567
- const calls = sourceFile
568
- .getDescendantsOfKind(SyntaxKind.CallExpression)
569
- .filter((call) => {
570
- const callee = call.getExpression();
571
- return Node.isIdentifier(callee) && bindings.has(callee.getText());
572
- })
573
- .sort((a, b) => b.getStart() - a.getStart());
574
-
575
- for (const call of calls) {
576
- const callee = call.getExpression();
577
- const calleeName = callee.getText();
578
- const binding = bindings.get(calleeName);
579
- if (binding === undefined) continue;
580
- const isLegacyName = RENAMED_FACTORY_NAMES.has(binding.importedName);
581
- if (!isLegacyName && isObjectFormCall(call)) continue;
582
- const line = call.getStartLineNumber();
583
- const args = call.getArguments();
584
- const objectText = optionsObjectText(args);
585
- if (objectText === undefined) {
586
- result.manual.push({
587
- file: filePath,
588
- line,
589
- kind: "call",
590
- description: `${calleeName}(...): cannot map ${args.length} argument(s) to { url, ... }`,
591
- });
592
- continue;
593
- }
594
- const awaited = call.getParentIfKind(SyntaxKind.AwaitExpression);
595
- if (isLegacyName && awaited === undefined) {
596
- result.manual.push({
597
- file: filePath,
598
- line,
599
- kind: "call",
600
- description: `${calleeName}(...) was async and is not awaited directly; ${FACTORY_NAME} is sync`,
601
- });
602
- continue;
603
- }
604
- const calleeText = isLegacyName && !binding.isAliased ? FACTORY_NAME : calleeName;
605
- const newCallText = `${calleeText}(${objectText})`;
606
- (isLegacyName && awaited !== undefined ? awaited : call).replaceWithText(newCallText);
607
- result.rewrites.push({
608
- file: filePath,
609
- line,
610
- kind: "call",
611
- description: `${calleeName}(url, options) -> ${FACTORY_NAME}({ url, ... })`,
612
- });
613
- }
614
- }
615
-
616
- function reportRemovedProviderEnv(
617
- sourceFile: SourceFile,
618
- filePath: string,
619
- result: SiteLists,
620
- ): void {
621
- const report = (node: Node): void => {
622
- result.manual.push({
623
- file: filePath,
624
- line: node.getStartLineNumber(),
625
- kind: "call",
626
- description: `${REMOVED_ENV_NAME}: DB_PROVIDER is gone, Bun.SQL is the only driver`,
627
- });
628
- };
629
- for (const literal of sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral)) {
630
- if (literal.getLiteralValue() === REMOVED_ENV_NAME) report(literal);
631
- }
632
- for (const access of sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression)) {
633
- if (access.getName() === REMOVED_ENV_NAME) report(access);
634
- }
635
- }
636
-
637
- export function transformDbFactorySource(source: string, filePath = "source.ts"): DbFactoryResult {
638
- const result: DbFactoryResult = { output: source, rewrites: [], manual: [] };
639
- if (!CHEAP_PREFILTER.test(source)) return result;
640
- const project = new Project({
641
- useInMemoryFileSystem: true,
642
- skipAddingFilesFromTsConfig: true,
643
- skipFileDependencyResolution: true,
644
- });
645
- const absolutePath = resolve(filePath);
646
- const sourceFile = project.createSourceFile(absolutePath, source);
647
- reportRemovedProviderEnv(sourceFile, absolutePath, result);
648
- rewriteFactoryCalls(sourceFile, absolutePath, result);
649
- rewriteDeclarations(sourceFile, absolutePath, result);
650
- rewriteDynamicSites(sourceFile, absolutePath, result);
651
- const changed = result.rewrites.length > 0;
652
- return { ...result, output: changed ? sourceFile.getFullText() : source };
653
- }
654
-
655
- type Mode = "write" | "dry-run" | "check";
656
-
657
- interface CliOptions {
658
- readonly mode: Mode;
659
- readonly format: boolean;
660
- readonly paths: string[];
661
- }
662
-
663
- class CliError extends Error {}
664
-
665
- function parseArgs(argv: readonly string[]): CliOptions {
666
- let mode: Mode | undefined;
667
- let format = true;
668
- const paths: string[] = [];
669
- const setMode = (next: Mode): void => {
670
- if (mode !== undefined && mode !== next) {
671
- throw new CliError("--check, --dry-run and --write are mutually exclusive");
672
- }
673
- mode = next;
674
- };
675
- for (const arg of argv) {
676
- if (arg === "--check") setMode("check");
677
- else if (arg === "--dry-run") setMode("dry-run");
678
- else if (arg === "--write") setMode("write");
679
- else if (arg === "--no-format") format = false;
680
- else if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
681
- else paths.push(arg);
682
- }
683
- if (paths.length === 0) throw new CliError("at least one target directory is required");
684
- return { mode: mode ?? "write", format, paths };
685
- }
686
-
687
- function isMigratableFile(name: string): boolean {
688
- return /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts");
689
- }
690
-
691
- function isSkippedPath(file: string): boolean {
692
- return (
693
- file.includes("/__tests__/fixtures/") ||
694
- SKIPPED_PATH_SUFFIXES.some((suffix) => file.endsWith(suffix))
695
- );
696
- }
697
-
698
- function findBiomeBinary(startDir: string): string | undefined {
699
- let dir = resolve(startDir);
700
- for (;;) {
701
- const candidate = join(dir, "node_modules", ".bin", "biome");
702
- if (existsSync(candidate)) return candidate;
703
- const parent = dirname(dir);
704
- if (parent === dir) return undefined;
705
- dir = parent;
706
- }
707
- }
708
-
709
- const FORMAT_BATCH_SIZE = 50;
710
-
711
- async function formatWithBiome(files: readonly string[], cwd: string): Promise<void> {
712
- const biome = findBiomeBinary(cwd);
713
- if (biome === undefined) {
714
- console.log(
715
- "[db-factory] biome not found in node_modules/.bin — format and sort imports of the changed files yourself",
716
- );
717
- // skip: formatting is a convenience, the rewrite itself is already on disk
718
- return;
719
- }
720
- for (let i = 0; i < files.length; i += FORMAT_BATCH_SIZE) {
721
- const batch = files.slice(i, i + FORMAT_BATCH_SIZE);
722
- const proc = Bun.spawn({
723
- cmd: [
724
- biome,
725
- "check",
726
- "--write",
727
- "--linter-enabled=false",
728
- "--no-errors-on-unmatched",
729
- ...batch,
730
- ],
731
- cwd,
732
- stdout: "pipe",
733
- stderr: "pipe",
734
- });
735
- const [stderr, exitCode] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
736
- if (exitCode !== 0) {
737
- console.log(
738
- `[db-factory] biome exited ${exitCode}; run it on the changed files yourself\n${stderr.trim()}`,
739
- );
740
- }
741
- }
742
- }
743
-
744
- function displayPath(file: string): string {
745
- const fromCwd = relative(process.cwd(), file);
746
- return fromCwd.startsWith("..") ? file : fromCwd;
747
- }
748
-
749
- interface RunSummary {
750
- readonly rewrites: DbFactorySite[];
751
- readonly manual: DbFactorySite[];
752
- readonly changedFiles: string[];
753
- }
754
-
755
- function transformFiles(files: readonly string[], mode: Mode): RunSummary {
756
- const summary: RunSummary = { rewrites: [], manual: [], changedFiles: [] };
757
- for (const file of files) {
758
- const before = readFileSync(file, "utf8");
759
- const result = transformDbFactorySource(before, file);
760
- const shown = displayPath(file);
761
- for (const site of result.rewrites)
762
- console.log(`${shown}:${site.line} rewritten ${site.description}`);
763
- for (const site of result.manual)
764
- console.log(`${shown}:${site.line} manual ${site.description}`);
765
- summary.rewrites.push(...result.rewrites);
766
- summary.manual.push(...result.manual);
767
- if (mode === "write" && result.output !== before) {
768
- writeFileSync(file, result.output);
769
- summary.changedFiles.push(file);
770
- }
771
- }
772
- return summary;
773
- }
774
-
775
- function parseArgsOrExit(argv: readonly string[]): CliOptions {
776
- try {
777
- return parseArgs(argv);
778
- } catch (err) {
779
- if (err instanceof CliError) {
780
- console.error(`[db-factory] ${err.message}`);
781
- process.exit(2);
782
- }
783
- throw err;
784
- }
785
- }
786
-
787
- async function main(): Promise<void> {
788
- const options = parseArgsOrExit(process.argv.slice(2));
789
- const files = collectSourceFiles(options.paths, { isMigratableFile }).filter(
790
- (file) => !isSkippedPath(file),
791
- );
792
- const { rewrites, manual, changedFiles } = transformFiles(files, options.mode);
793
-
794
- const imports = rewrites.filter((site) => site.kind === "import").length;
795
- const calls = rewrites.filter((site) => site.kind === "call").length;
796
- console.log(
797
- `\n[db-factory] ${options.mode === "write" ? "rewritten" : "rewritable"}: ${imports} import(s), ${calls} call(s) in ${new Set(rewrites.map((site) => site.file)).size} file(s); manual: ${manual.length}`,
798
- );
799
-
800
- if (options.mode === "write" && options.format && changedFiles.length > 0) {
801
- await formatWithBiome(changedFiles, resolve(options.paths[0] ?? "."));
802
- }
803
-
804
- const hasOpenSites = rewrites.length + manual.length > 0;
805
- process.exit(options.mode === "check" && hasOpenSites ? 1 : 0);
806
- }
807
-
808
- if (import.meta.main) {
809
- await main();
810
- }