@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,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
- }