@cosmicdrift/kumiko-framework 0.389.0 → 0.390.0

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