@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,424 +0,0 @@
1
- #!/usr/bin/env bun
2
- // feature-layout — the runtime of a feature file follows from its path: <feature>/web/** is client
3
- // code, everything else is server or isomorphic. This moves every file marked as runtime client of a
4
- // feature that lies outside web/ into <feature>/web/ (sub-structure kept), rewrites each relative
5
- // import / re-export / import() / mock.module that points at it or out of it, rewrites package.json
6
- // export targets, and drops the marker. A marker the path already implies (client in web/, test in
7
- // __tests__/, dev in dev/, tooling in scripts/) is only removed. A target that already exists, or a
8
- // marker no path rule covers, is reported as manual and left alone.
9
- //
10
- // Features are found as src/features/<feature>/ and bundled-features/src/<feature>/ below the target
11
- // directories; --feature-dir <dir> names a directory that is itself one feature, --features-root <dir>
12
- // a directory whose children are features.
13
- //
14
- // Usage:
15
- // bun scripts/codemod/feature-layout.ts <targetDir...> [--feature-dir <dir>] [--features-root <dir>]
16
- // [--check | --dry-run | --write] [--no-format]
17
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1 while
18
- // any move, marker or manual site is left; --dry-run only reports.
19
-
20
- import { mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
21
- import { dirname, join, relative, resolve } from "node:path";
22
- import { Node, Project } from "ts-morph";
23
- import {
24
- applyEdits,
25
- type CodemodSite,
26
- formatWithBiome,
27
- moduleSpecifierLiterals,
28
- SCRIPT_EXTENSION,
29
- type TextEdit,
30
- } from "./codemod-support.ts";
31
- import { collectSourceFiles } from "./collect-source-files.ts";
32
-
33
- const MARKER_HEAD_LINES = 8;
34
- const MARKER_LINE = /^\s*\/\/\s*@runtime(?:\s+(\w+))?\s*$/;
35
- const WEB_DIR = "web";
36
- const IMPLICIT_FEATURE_PATTERNS: readonly RegExp[] = [
37
- /^(.*\/src\/features\/[^/]+)\/(.+)$/,
38
- /^(.*\/bundled-features\/src\/[^/]+)\/(.+)$/,
39
- ];
40
- const TEST_PATH = /(?:^|\/)__tests__\/|\.(?:test|integration|e2e|spec)\.[tj]sx?$/;
41
-
42
- export interface FeatureLayoutOptions {
43
- readonly featureDirs?: readonly string[];
44
- readonly featuresRoots?: readonly string[];
45
- }
46
-
47
- export interface FeatureLayoutMove {
48
- readonly from: string;
49
- readonly to: string;
50
- }
51
-
52
- export interface FeatureLayoutResult {
53
- // New content per final path (moved files under their new path).
54
- readonly writes: ReadonlyMap<string, string>;
55
- // Old paths that no longer exist after the moves.
56
- readonly removals: readonly string[];
57
- readonly moves: readonly FeatureLayoutMove[];
58
- readonly markersRemoved: readonly string[];
59
- readonly importRewrites: readonly CodemodSite[];
60
- readonly manual: readonly CodemodSite[];
61
- }
62
-
63
- interface Marker {
64
- readonly line: number;
65
- readonly kind: string | undefined;
66
- }
67
-
68
- function findMarker(source: string): Marker | undefined {
69
- const lines = source.split("\n", MARKER_HEAD_LINES);
70
- for (const [index, text] of lines.entries()) {
71
- const match = MARKER_LINE.exec(text);
72
- if (match) return { line: index, kind: match[1] };
73
- }
74
- return undefined;
75
- }
76
-
77
- function removeMarkerLine(source: string, line: number): string {
78
- const lines = source.split("\n");
79
- lines.splice(line, 1);
80
- if (line === 0 && lines[0] === "") lines.shift();
81
- return lines.join("\n");
82
- }
83
-
84
- function splitFeaturePath(
85
- file: string,
86
- options: FeatureLayoutOptions,
87
- ): { readonly featureDir: string; readonly rel: string } | undefined {
88
- for (const dir of options.featureDirs ?? []) {
89
- if (file.startsWith(`${dir}/`)) return { featureDir: dir, rel: file.slice(dir.length + 1) };
90
- }
91
- for (const root of options.featuresRoots ?? []) {
92
- if (!file.startsWith(`${root}/`)) continue;
93
- const [feature, ...rest] = file.slice(root.length + 1).split("/");
94
- if (feature !== undefined && rest.length > 0) {
95
- return { featureDir: `${root}/${feature}`, rel: rest.join("/") };
96
- }
97
- }
98
- for (const pattern of IMPLICIT_FEATURE_PATTERNS) {
99
- const match = pattern.exec(file);
100
- if (match?.[1] !== undefined && match[2] !== undefined) {
101
- return { featureDir: match[1], rel: match[2] };
102
- }
103
- }
104
- return undefined;
105
- }
106
-
107
- function pathImpliedKind(rel: string): string | undefined {
108
- if (TEST_PATH.test(rel)) return "test";
109
- if (rel === WEB_DIR || rel.startsWith(`${WEB_DIR}/`) || /^web\.tsx?$/.test(rel)) return "client";
110
- if (rel.startsWith("dev/")) return "dev";
111
- if (rel.startsWith("scripts/")) return "tooling";
112
- return undefined;
113
- }
114
-
115
- function stripScriptExtension(file: string): { readonly base: string; readonly extension: string } {
116
- const extension = SCRIPT_EXTENSION.exec(file)?.[0] ?? "";
117
- return { base: file.slice(0, file.length - extension.length), extension };
118
- }
119
-
120
- function movedTargetOf(
121
- absoluteSpecifier: string,
122
- moved: ReadonlyMap<string, string>,
123
- ): string | undefined {
124
- const { base, extension } = stripScriptExtension(absoluteSpecifier);
125
- const candidates: string[] =
126
- extension === ".js" || extension === ".ts" || extension === ".tsx" || extension === ""
127
- ? [absoluteSpecifier, `${base}.ts`, `${base}.tsx`]
128
- : [absoluteSpecifier];
129
- if (extension === "")
130
- candidates.push(`${absoluteSpecifier}/index.ts`, `${absoluteSpecifier}/index.tsx`);
131
- for (const candidate of candidates) {
132
- if (moved.has(candidate)) return candidate;
133
- }
134
- return undefined;
135
- }
136
-
137
- // A moved `<dir>/index.ts` is imported as `<dir>`, so the file name alone never appears in the importer.
138
- function importableNameOf(file: string): string {
139
- const { base } = stripScriptExtension(baseName(file));
140
- return base === "index" ? baseName(dirname(file)) : base;
141
- }
142
-
143
- function relativeSpecifierFrom(fromDir: string, target: string): string {
144
- const path = relative(fromDir, target).split("\\").join("/");
145
- return path.startsWith(".") ? path : `./${path}`;
146
- }
147
-
148
- function rewrittenSpecifier(
149
- specifier: string,
150
- oldFile: string,
151
- newFile: string,
152
- moved: ReadonlyMap<string, string>,
153
- ): string | undefined {
154
- if (!specifier.startsWith(".")) return undefined;
155
- const absolute = resolve(dirname(oldFile), specifier);
156
- const oldTarget = movedTargetOf(absolute, moved);
157
- if (oldTarget === undefined && oldFile === newFile) return undefined;
158
- const newTarget = oldTarget === undefined ? absolute : moved.get(oldTarget);
159
- if (newTarget === undefined) return undefined;
160
- let next: string;
161
- if (oldTarget === undefined) {
162
- next = relativeSpecifierFrom(dirname(newFile), newTarget);
163
- if (specifier.endsWith("/")) next = `${next}/`;
164
- } else {
165
- const { extension } = stripScriptExtension(absolute);
166
- const { base } = stripScriptExtension(newTarget);
167
- const isDirectoryImport = extension === "" && base.endsWith("/index");
168
- const target = isDirectoryImport ? base.slice(0, -"/index".length) : `${base}${extension}`;
169
- next = relativeSpecifierFrom(dirname(newFile), target);
170
- }
171
- return next === specifier ? undefined : next;
172
- }
173
-
174
- function rewriteSpecifiers(
175
- source: string,
176
- oldFile: string,
177
- newFile: string,
178
- moved: ReadonlyMap<string, string>,
179
- sites: CodemodSite[],
180
- ): string {
181
- const project = new Project({
182
- useInMemoryFileSystem: true,
183
- skipAddingFilesFromTsConfig: true,
184
- skipFileDependencyResolution: true,
185
- });
186
- const sourceFile = project.createSourceFile(oldFile, source);
187
- const edits: TextEdit[] = [];
188
- for (const literal of moduleSpecifierLiterals(sourceFile)) {
189
- if (!Node.isStringLiteral(literal)) continue;
190
- const current = literal.getLiteralValue();
191
- const next = rewrittenSpecifier(current, oldFile, newFile, moved);
192
- if (next === undefined) continue;
193
- sites.push({
194
- file: oldFile,
195
- line: literal.getStartLineNumber(),
196
- description: `${current} -> ${next}`,
197
- });
198
- edits.push({ start: literal.getStart() + 1, end: literal.getEnd() - 1, text: next });
199
- }
200
- return applyEdits(source, edits);
201
- }
202
-
203
- // package.json export targets: "./src/<rel>.ts" and the publishConfig mirror "./dist/<rel>.js|.d.ts".
204
- function rewritePackageJson(
205
- source: string,
206
- packageJsonPath: string,
207
- moved: ReadonlyMap<string, string>,
208
- sites: CodemodSite[],
209
- ): string {
210
- const packageDir = dirname(packageJsonPath);
211
- return source.replace(/"(\.\/(?:src|dist)\/[^"]+)"/g, (whole, target: string) => {
212
- const isDist = target.startsWith("./dist/");
213
- const sourceTarget = isDist
214
- ? target.replace("./dist/", "./src/").replace(/(?:\.d\.ts|\.js)$/, "")
215
- : target;
216
- const { base } = stripScriptExtension(resolve(packageDir, sourceTarget));
217
- const candidates = isDist ? [`${base}.ts`, `${base}.tsx`] : [resolve(packageDir, sourceTarget)];
218
- const oldFile = candidates.find((candidate) => moved.has(candidate));
219
- const newFile = oldFile === undefined ? undefined : moved.get(oldFile);
220
- if (newFile === undefined) return whole;
221
- const newRel = relative(packageDir, newFile).split("\\").join("/");
222
- const next = isDist
223
- ? target.replace(/^\.\/dist\/.*?(\.d\.ts|\.js)$/, (_all, ext: string) => {
224
- return `./dist/${newRel.slice("src/".length).replace(/\.tsx?$/, "")}${ext}`;
225
- })
226
- : `./${newRel}`;
227
- sites.push({
228
- file: packageJsonPath,
229
- line: source.slice(0, source.indexOf(whole)).split("\n").length,
230
- description: `${target} -> ${next}`,
231
- });
232
- return `"${next}"`;
233
- });
234
- }
235
-
236
- type MarkerAction =
237
- | { readonly action: "strip" }
238
- | { readonly action: "move"; readonly target: string }
239
- | { readonly action: "manual"; readonly description: string };
240
-
241
- function actionForMarker(
242
- marker: Marker,
243
- location: { readonly featureDir: string; readonly rel: string },
244
- isTaken: (target: string) => boolean,
245
- ): MarkerAction {
246
- if (marker.kind === undefined) {
247
- return { action: "manual", description: "bare @runtime marker without a kind" };
248
- }
249
- const implied = pathImpliedKind(location.rel);
250
- if (marker.kind === implied || (marker.kind === "client" && implied !== undefined)) {
251
- return { action: "strip" };
252
- }
253
- if (marker.kind !== "client") {
254
- return { action: "manual", description: `@runtime ${marker.kind} has no path rule here` };
255
- }
256
- const target = join(location.featureDir, WEB_DIR, location.rel);
257
- return isTaken(target)
258
- ? { action: "manual", description: `cannot move to ${WEB_DIR}/${location.rel}: target exists` }
259
- : { action: "move", target };
260
- }
261
-
262
- function buildWrites(
263
- files: ReadonlyMap<string, string>,
264
- stripped: ReadonlyMap<string, string>,
265
- moved: ReadonlyMap<string, string>,
266
- importRewrites: CodemodSite[],
267
- ): Map<string, string> {
268
- const writes = new Map<string, string>();
269
- const basenames = [...moved.keys()].map(importableNameOf);
270
- for (const [file, original] of files) {
271
- const content = stripped.get(file) ?? original;
272
- const newFile = moved.get(file) ?? file;
273
- if (file.endsWith("package.json")) {
274
- const next =
275
- moved.size > 0 ? rewritePackageJson(content, file, moved, importRewrites) : content;
276
- if (next !== original) writes.set(file, next);
277
- continue;
278
- }
279
- const mentionsMoved = moved.has(file) || basenames.some((name) => content.includes(name));
280
- const next = mentionsMoved
281
- ? rewriteSpecifiers(content, file, newFile, moved, importRewrites)
282
- : content;
283
- if (next !== original || newFile !== file) writes.set(newFile, next);
284
- }
285
- return writes;
286
- }
287
-
288
- export function applyFeatureLayout(
289
- files: ReadonlyMap<string, string>,
290
- options: FeatureLayoutOptions = {},
291
- ): FeatureLayoutResult {
292
- const manual: CodemodSite[] = [];
293
- const markersRemoved: string[] = [];
294
- const stripped = new Map<string, string>();
295
- const moved = new Map<string, string>();
296
- const claimedTargets = new Set<string>();
297
- const isTaken = (target: string): boolean => files.has(target) || claimedTargets.has(target);
298
-
299
- for (const [file, source] of files) {
300
- const location = splitFeaturePath(file, options);
301
- const marker = location === undefined ? undefined : findMarker(source);
302
- if (location === undefined || marker === undefined) continue;
303
- const decision = actionForMarker(marker, location, isTaken);
304
- if (decision.action === "manual") {
305
- manual.push({ file, line: marker.line + 1, description: decision.description });
306
- continue;
307
- }
308
- if (decision.action === "move") {
309
- claimedTargets.add(decision.target);
310
- moved.set(file, decision.target);
311
- }
312
- stripped.set(file, removeMarkerLine(source, marker.line));
313
- markersRemoved.push(file);
314
- }
315
-
316
- const importRewrites: CodemodSite[] = [];
317
- const writes = buildWrites(files, stripped, moved, importRewrites);
318
-
319
- return {
320
- writes,
321
- removals: [...moved.keys()],
322
- moves: [...moved].map(([from, to]) => ({ from, to })),
323
- markersRemoved,
324
- importRewrites,
325
- manual,
326
- };
327
- }
328
-
329
- function baseName(file: string): string {
330
- return file.slice(file.lastIndexOf("/") + 1);
331
- }
332
-
333
- type Mode = "write" | "dry-run" | "check";
334
-
335
- interface CliOptions extends FeatureLayoutOptions {
336
- readonly mode: Mode;
337
- readonly format: boolean;
338
- readonly paths: readonly string[];
339
- }
340
-
341
- function parseArgs(argv: readonly string[]): CliOptions {
342
- let mode: Mode = "write";
343
- let format = true;
344
- const paths: string[] = [];
345
- const featureDirs: string[] = [];
346
- const featuresRoots: string[] = [];
347
- for (let i = 0; i < argv.length; i++) {
348
- const arg = argv[i] ?? "";
349
- if (arg === "--check") mode = "check";
350
- else if (arg === "--dry-run") mode = "dry-run";
351
- else if (arg === "--write") mode = "write";
352
- else if (arg === "--no-format") format = false;
353
- else if (arg === "--feature-dir" || arg === "--features-root") {
354
- const value = argv[++i];
355
- if (value === undefined) throw new Error(`${arg} needs a directory`);
356
- (arg === "--feature-dir" ? featureDirs : featuresRoots).push(resolve(value));
357
- } else if (arg.startsWith("--")) throw new Error(`unknown flag: ${arg}`);
358
- else paths.push(arg);
359
- }
360
- if (paths.length === 0) throw new Error("at least one target directory is required");
361
- return { mode, format, paths, featureDirs, featuresRoots };
362
- }
363
-
364
- function readTargetFiles(paths: readonly string[]): Map<string, string> {
365
- const files = new Map<string, string>();
366
- const names = collectSourceFiles(paths, {
367
- isMigratableFile: (name) => /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts"),
368
- });
369
- const packageJsons = collectSourceFiles(paths, {
370
- isMigratableFile: (name) => name === "package.json",
371
- });
372
- for (const file of [...names, ...packageJsons]) {
373
- if (file.includes("/__tests__/fixtures/")) continue;
374
- if (statSync(file).isFile()) files.set(file, readFileSync(file, "utf8"));
375
- }
376
- return files;
377
- }
378
-
379
- function display(file: string): string {
380
- const fromCwd = relative(process.cwd(), file);
381
- return fromCwd.startsWith("..") ? file : fromCwd;
382
- }
383
-
384
- function writeResult(result: FeatureLayoutResult): void {
385
- for (const old of result.removals) rmSync(old);
386
- for (const [file, content] of result.writes) {
387
- mkdirSync(dirname(file), { recursive: true });
388
- writeFileSync(file, content);
389
- }
390
- }
391
-
392
- async function main(argv: readonly string[]): Promise<void> {
393
- let options: CliOptions;
394
- try {
395
- options = parseArgs(argv);
396
- } catch (err) {
397
- console.error(`[feature-layout] ${err instanceof Error ? err.message : String(err)}`);
398
- process.exit(2);
399
- }
400
- const files = readTargetFiles(options.paths);
401
- const result = applyFeatureLayout(files, options);
402
- for (const move of result.moves) {
403
- console.log(`${display(move.from)} moved -> ${display(move.to)}`);
404
- }
405
- for (const file of result.markersRemoved) console.log(`${display(file)} marker removed`);
406
- for (const site of result.manual) {
407
- console.log(`${display(site.file)}:${site.line} manual ${site.description}`);
408
- }
409
- console.log(
410
- `\n[feature-layout] ${options.mode === "write" ? "moved" : "movable"}: ${result.moves.length} file(s); markers: ${result.markersRemoved.length}; import sites: ${result.importRewrites.length}; manual: ${result.manual.length}`,
411
- );
412
- if (options.mode === "write") {
413
- writeResult(result);
414
- if (options.format) {
415
- const changed = [...result.writes.keys()].filter((file) => /\.(ts|tsx)$/.test(file));
416
- if (changed.length > 0)
417
- await formatWithBiome("feature-layout", changed, resolve(options.paths[0] ?? "."));
418
- }
419
- }
420
- const pending = result.markersRemoved.length + result.manual.length;
421
- process.exit(options.mode === "check" && pending > 0 ? 1 : 0);
422
- }
423
-
424
- if (import.meta.main) await main(process.argv.slice(2));
@@ -1,118 +0,0 @@
1
- #!/usr/bin/env bun
2
- // import-extensions — relative imports name the TypeScript source file:
3
- // import { x } from "./foo.js" -> "./foo.ts"
4
- // import { C } from "./Comp.jsx" -> "./Comp.tsx"
5
- // Covers import/export ... from, import type, import("..."), import types and mock.module. A site
6
- // is rewritten only when the target file exists with the new extension next to the importer;
7
- // otherwise it is reported as manual and left alone.
8
- //
9
- // Needs `allowImportingTsExtensions` and `rewriteRelativeImportExtensions` in the tsconfig that
10
- // compiles the code, otherwise tsc rejects the `.ts` specifiers.
11
- //
12
- // Usage:
13
- // bun scripts/codemod/import-extensions.ts <targetDir...> [--check | --dry-run | --write] [--no-format]
14
- // Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
15
- // while any rewritable or manual site is left; --dry-run only reports.
16
-
17
- import { existsSync } from "node:fs";
18
- import { dirname, resolve } from "node:path";
19
- import { Node, Project, SyntaxKind } from "ts-morph";
20
- import { type CodemodResult, runCodemodCli, type SiteLists } from "./codemod-support.ts";
21
-
22
- const CHEAP_PREFILTER = /\.jsx?["'`]/;
23
-
24
- const RELATIVE_JS_SPECIFIER = /^(\.{1,2}\/.*)\.(jsx?)$/;
25
-
26
- function candidateExtensions(oldExtension: string): readonly string[] {
27
- return oldExtension === "jsx" ? ["tsx"] : ["ts", "tsx"];
28
- }
29
-
30
- function sourceExtensionFor(
31
- importerPath: string,
32
- base: string,
33
- oldExtension: string,
34
- ): string | undefined {
35
- return candidateExtensions(oldExtension).find((extension) =>
36
- existsSync(resolve(dirname(importerPath), `${base}.${extension}`)),
37
- );
38
- }
39
-
40
- interface TextEdit {
41
- readonly start: number;
42
- readonly end: number;
43
- readonly text: string;
44
- }
45
-
46
- function specifierLiterals(project: Project, source: string, filePath: string): Node[] {
47
- const sourceFile = project.createSourceFile(filePath, source, { overwrite: true });
48
- const literals: Node[] = [];
49
- for (const declaration of [
50
- ...sourceFile.getImportDeclarations(),
51
- ...sourceFile.getExportDeclarations(),
52
- ]) {
53
- const literal = declaration.getModuleSpecifier();
54
- if (literal !== undefined) literals.push(literal);
55
- }
56
- for (const importType of sourceFile.getDescendantsOfKind(SyntaxKind.ImportType)) {
57
- const argument = importType.getArgument();
58
- if (Node.isLiteralTypeNode(argument)) literals.push(argument.getLiteral());
59
- }
60
- for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
61
- const callee = call.getExpression();
62
- const isModuleLoad =
63
- callee.getKind() === SyntaxKind.ImportKeyword || callee.getText() === "mock.module";
64
- const first = call.getArguments()[0];
65
- if (isModuleLoad && first !== undefined && Node.isStringLiteral(first)) literals.push(first);
66
- }
67
- return literals;
68
- }
69
-
70
- export function transformImportExtensionsSource(
71
- source: string,
72
- filePath = "source.ts",
73
- ): CodemodResult {
74
- const result: SiteLists = { rewrites: [], manual: [] };
75
- if (!CHEAP_PREFILTER.test(source)) return { output: source, ...result };
76
- const project = new Project({
77
- useInMemoryFileSystem: true,
78
- skipAddingFilesFromTsConfig: true,
79
- skipFileDependencyResolution: true,
80
- });
81
- const edits: TextEdit[] = [];
82
- for (const literal of specifierLiterals(project, source, filePath)) {
83
- if (!Node.isStringLiteral(literal) && !Node.isNoSubstitutionTemplateLiteral(literal)) continue;
84
- const current = literal.getLiteralValue();
85
- const match = RELATIVE_JS_SPECIFIER.exec(current);
86
- if (match === null) continue;
87
- const [, base = "", oldExtension = ""] = match;
88
- const line = literal.getStartLineNumber();
89
- const newExtension = sourceExtensionFor(filePath, base, oldExtension);
90
- if (newExtension === undefined) {
91
- result.manual.push({
92
- file: filePath,
93
- line,
94
- description: `${current}: no .${candidateExtensions(oldExtension).join("/.")} file next to the importer`,
95
- });
96
- continue;
97
- }
98
- const next = `${base}.${newExtension}`;
99
- result.rewrites.push({ file: filePath, line, description: `${current} -> ${next}` });
100
- edits.push({ start: literal.getStart() + 1, end: literal.getEnd() - 1, text: next });
101
- }
102
- let output = source;
103
- for (const edit of edits.sort((a, b) => b.start - a.start)) {
104
- output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
105
- }
106
- return { output, ...result };
107
- }
108
-
109
- if (import.meta.main) {
110
- await runCodemodCli(
111
- {
112
- name: "import-extensions",
113
- transform: transformImportExtensionsSource,
114
- isSkippedPath: () => false,
115
- },
116
- process.argv.slice(2),
117
- );
118
- }