@cosmicdrift/kumiko-framework 0.387.0 → 0.389.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 (375) hide show
  1. package/AGENTS.md +9 -1
  2. package/agents/examples/anonymous-access.md +1 -1
  3. package/agents/examples/apex-landing.md +204 -0
  4. package/agents/examples/api-worker-split.md +64 -0
  5. package/agents/examples/app-config.md +14 -0
  6. package/agents/examples/auth-mfa.md +115 -0
  7. package/agents/examples/env-composition.md +28 -1
  8. package/agents/examples/golden-path.md +13 -1
  9. package/agents/examples/legal-pages.md +1 -1
  10. package/agents/examples/lifecycle-hooks.md +55 -2
  11. package/agents/examples/list-table-options.md +466 -0
  12. package/agents/examples/pdf-audit-export.md +4 -2
  13. package/agents/examples/prod-boot-options.md +16 -0
  14. package/agents/examples/rate-limiting.md +48 -0
  15. package/agents/examples/record-detail-layout.md +692 -0
  16. package/agents/examples/seed-migration.md +212 -0
  17. package/agents/examples/state-machine.md +3 -2
  18. package/agents/examples/tenant-isolation.md +73 -1
  19. package/agents/examples/wizard-form.md +941 -0
  20. package/agents/examples/writeform-section.md +548 -0
  21. package/agents/examples.md +1 -0
  22. package/agents/features.md +19 -2
  23. package/agents/widgets.md +2 -0
  24. package/dist/api/api-constants.d.ts +1 -0
  25. package/dist/api/api-constants.js +2 -0
  26. package/dist/api/auth-routes-shared.d.ts +2 -0
  27. package/dist/api/auth-routes-shared.js +5 -0
  28. package/dist/api/client-error-route.js +10 -5
  29. package/dist/api/entity-read-access.d.ts +2 -1
  30. package/dist/api/entity-read-access.js +14 -0
  31. package/dist/api/export/export-cells-reference.d.ts +9 -0
  32. package/dist/api/export/export-cells-reference.js +21 -0
  33. package/dist/api/export/export-cells.d.ts +11 -0
  34. package/dist/api/export/export-cells.js +136 -0
  35. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  36. package/dist/api/export/export-ciphertext-guard.js +27 -0
  37. package/dist/api/export/export-columns.d.ts +29 -0
  38. package/dist/api/export/export-columns.js +85 -0
  39. package/dist/api/export/export-errors.d.ts +4 -0
  40. package/dist/api/export/export-errors.js +14 -0
  41. package/dist/api/export/export-route.d.ts +4 -0
  42. package/dist/api/export/export-route.js +74 -0
  43. package/dist/api/export/export-rows.d.ts +13 -0
  44. package/dist/api/export/export-rows.js +62 -0
  45. package/dist/api/export/export-screen.d.ts +12 -0
  46. package/dist/api/export/export-screen.js +47 -0
  47. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  48. package/dist/api/export/export-xlsx-writer.js +21 -0
  49. package/dist/api/extra-route.d.ts +4 -0
  50. package/dist/api/index.d.ts +3 -1
  51. package/dist/api/index.js +3 -1
  52. package/dist/api/pii-leak-guard.d.ts +3 -0
  53. package/dist/api/pii-leak-guard.js +3 -2
  54. package/dist/api/request-context.d.ts +1 -1
  55. package/dist/api/request-context.js +1 -1
  56. package/dist/api/routes.d.ts +16 -0
  57. package/dist/api/routes.js +2 -2
  58. package/dist/api/server-boot-checks.d.ts +10 -0
  59. package/dist/api/server-boot-checks.js +157 -0
  60. package/dist/api/server-event-dispatcher.d.ts +26 -0
  61. package/dist/api/server-event-dispatcher.js +208 -0
  62. package/dist/api/server-extra-routes.d.ts +11 -0
  63. package/dist/api/server-extra-routes.js +206 -0
  64. package/dist/api/server-middleware.d.ts +20 -0
  65. package/dist/api/server-middleware.js +211 -0
  66. package/dist/api/server-routes.d.ts +19 -0
  67. package/dist/api/server-routes.js +299 -0
  68. package/dist/api/server-websocket-routes.d.ts +4 -0
  69. package/dist/api/server-websocket-routes.js +108 -0
  70. package/dist/api/server-wiring.d.ts +32 -0
  71. package/dist/api/server-wiring.js +238 -0
  72. package/dist/api/server.d.ts +10 -15
  73. package/dist/api/server.js +48 -1251
  74. package/dist/api/session-cookies.js +4 -4
  75. package/dist/api/sse-route.d.ts +2 -1
  76. package/dist/api/sse-route.js +27 -13
  77. package/dist/config/index.d.ts +3 -1
  78. package/dist/crypto/owner-transition-rekey.d.ts +5 -1
  79. package/dist/crypto/owner-transition-rekey.js +1 -1
  80. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  81. package/dist/crypto/pg-kms-adapter.js +12 -18
  82. package/dist/crypto/pii-field-encryption.d.ts +5 -1
  83. package/dist/crypto/pii-field-encryption.js +3 -1
  84. package/dist/db/aggregate-sql.d.ts +23 -0
  85. package/dist/db/aggregate-sql.js +165 -0
  86. package/dist/db/closed-connection.d.ts +9 -0
  87. package/dist/db/closed-connection.js +88 -0
  88. package/dist/db/connection.d.ts +4 -5
  89. package/dist/db/connection.js +29 -20
  90. package/dist/db/dialect.js +1 -1
  91. package/dist/db/distinct-on.d.ts +1 -1
  92. package/dist/db/driver-row-coercion.d.ts +2 -0
  93. package/dist/db/driver-row-coercion.js +186 -0
  94. package/dist/db/driver-value-preparation.d.ts +16 -0
  95. package/dist/db/driver-value-preparation.js +101 -0
  96. package/dist/db/entity-field-encryption.d.ts +1 -0
  97. package/dist/db/entity-field-encryption.js +1 -1
  98. package/dist/db/entity-table-meta.js +103 -110
  99. package/dist/db/event-store-executor-context.d.ts +2 -1
  100. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  101. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  102. package/dist/db/event-store-executor-read-aggregate.d.ts +8 -0
  103. package/dist/db/event-store-executor-read-aggregate.js +143 -0
  104. package/dist/db/event-store-executor-read-filter.d.ts +31 -0
  105. package/dist/db/event-store-executor-read-filter.js +206 -0
  106. package/dist/db/event-store-executor-read-paging.d.ts +14 -0
  107. package/dist/db/event-store-executor-read-paging.js +99 -0
  108. package/dist/db/event-store-executor-read-rows.d.ts +6 -0
  109. package/dist/db/event-store-executor-read-rows.js +32 -0
  110. package/dist/db/event-store-executor-read-search.d.ts +28 -0
  111. package/dist/db/event-store-executor-read-search.js +221 -0
  112. package/dist/db/event-store-executor-read-sort.d.ts +41 -0
  113. package/dist/db/event-store-executor-read-sort.js +130 -0
  114. package/dist/db/event-store-executor-read-where.d.ts +24 -0
  115. package/dist/db/event-store-executor-read-where.js +81 -0
  116. package/dist/db/event-store-executor-read.d.ts +2 -9
  117. package/dist/db/event-store-executor-read.js +48 -701
  118. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  119. package/dist/db/event-store-executor-write-atomic.js +41 -0
  120. package/dist/db/event-store-executor-write-steps.d.ts +17 -0
  121. package/dist/db/event-store-executor-write-steps.js +95 -0
  122. package/dist/db/event-store-executor-write.js +405 -509
  123. package/dist/db/event-store-executor.js +2 -1
  124. package/dist/db/executor-managed-tables.js +1 -1
  125. package/dist/db/index.d.ts +7 -3
  126. package/dist/db/index.js +6 -2
  127. package/dist/db/list-aggregate-labels.d.ts +14 -0
  128. package/dist/db/list-aggregate-labels.js +26 -0
  129. package/dist/db/migrate-generator.js +71 -86
  130. package/dist/db/migrate-runner.js +7 -4
  131. package/dist/db/pg-error.js +26 -21
  132. package/dist/db/queries/backfill-pii.js +3 -6
  133. package/dist/db/queries/database-now.js +2 -1
  134. package/dist/db/queries/shadow-swap.js +2 -3
  135. package/dist/db/query.d.ts +16 -15
  136. package/dist/db/query.js +76 -804
  137. package/dist/db/reference-data.js +19 -2
  138. package/dist/db/statement-timeout.js +2 -1
  139. package/dist/db/table-builder.js +113 -166
  140. package/dist/db/table-info.d.ts +10 -0
  141. package/dist/db/table-info.js +45 -0
  142. package/dist/db/temporal-value-guards.d.ts +6 -0
  143. package/dist/db/temporal-value-guards.js +15 -0
  144. package/dist/db/tenant-db-runner.d.ts +1 -0
  145. package/dist/db/tenant-db-runner.js +3 -0
  146. package/dist/db/tenant-db-upsert.d.ts +5 -0
  147. package/dist/db/tenant-db-upsert.js +91 -0
  148. package/dist/db/tenant-db.js +50 -10
  149. package/dist/db/where-clause.d.ts +6 -0
  150. package/dist/db/where-clause.js +236 -0
  151. package/dist/derivatives/delete-stored-file.js +2 -1
  152. package/dist/engine/boot-validator/boot-check.js +1 -1
  153. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  154. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  155. package/dist/engine/boot-validator/detail-screens.js +2 -2
  156. package/dist/engine/boot-validator/entity-handler.d.ts +1 -0
  157. package/dist/engine/boot-validator/entity-handler.js +17 -0
  158. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  159. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  160. package/dist/engine/boot-validator/form-derivations.js +35 -1
  161. package/dist/engine/boot-validator/i18n-keys.js +5 -3
  162. package/dist/engine/boot-validator/index.js +2 -0
  163. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  164. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  165. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  166. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  167. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  168. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  169. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +10 -0
  170. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  171. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  172. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  173. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  174. package/dist/engine/boot-validator/list-table-options.js +77 -0
  175. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  176. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  177. package/dist/engine/boot-validator/pii-retention.js +233 -155
  178. package/dist/engine/boot-validator/projection-list-screens.d.ts +1 -1
  179. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  180. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  181. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  182. package/dist/engine/boot-validator/screens-actions.d.ts +1 -0
  183. package/dist/engine/boot-validator/screens-actions.js +8 -1
  184. package/dist/engine/boot-validator/screens-dashboard.js +2 -5
  185. package/dist/engine/boot-validator/screens-forms.js +2 -6
  186. package/dist/engine/boot-validator/screens-kind-config-edit.d.ts +3 -0
  187. package/dist/engine/boot-validator/screens-kind-config-edit.js +88 -0
  188. package/dist/engine/boot-validator/screens-kind-entity-edit.d.ts +3 -0
  189. package/dist/engine/boot-validator/screens-kind-entity-edit.js +55 -0
  190. package/dist/engine/boot-validator/screens-kind-entity-list.d.ts +3 -0
  191. package/dist/engine/boot-validator/screens-kind-entity-list.js +235 -0
  192. package/dist/engine/boot-validator/screens-kind-projection-detail.d.ts +3 -0
  193. package/dist/engine/boot-validator/screens-kind-projection-detail.js +235 -0
  194. package/dist/engine/boot-validator/screens-kind-projection-list.d.ts +3 -0
  195. package/dist/engine/boot-validator/screens-kind-projection-list.js +56 -0
  196. package/dist/engine/boot-validator/screens-kind-secret-mint.d.ts +3 -0
  197. package/dist/engine/boot-validator/screens-kind-secret-mint.js +28 -0
  198. package/dist/engine/boot-validator/screens-kind-shared.d.ts +37 -0
  199. package/dist/engine/boot-validator/screens-kind-shared.js +142 -0
  200. package/dist/engine/boot-validator/screens-lists.d.ts +2 -1
  201. package/dist/engine/boot-validator/screens-lists.js +24 -11
  202. package/dist/engine/boot-validator/screens.d.ts +0 -2
  203. package/dist/engine/boot-validator/screens.js +99 -860
  204. package/dist/engine/build-app-schema.d.ts +2 -1
  205. package/dist/engine/build-app-schema.js +65 -97
  206. package/dist/engine/build-config-feature-schema.js +6 -1
  207. package/dist/engine/define-feature.js +13 -2
  208. package/dist/engine/define-handler.js +1 -0
  209. package/dist/engine/entity-handlers.d.ts +13 -0
  210. package/dist/engine/entity-handlers.js +10 -21
  211. package/dist/engine/entity-list-runtime-options.d.ts +8 -0
  212. package/dist/engine/entity-list-runtime-options.js +18 -0
  213. package/dist/engine/feature-ast/extractors/handlers.js +1 -0
  214. package/dist/engine/feature-ast/extractors/index.d.ts +1 -1
  215. package/dist/engine/feature-ast/extractors/index.js +1 -1
  216. package/dist/engine/feature-ast/extractors/round1.d.ts +2 -1
  217. package/dist/engine/feature-ast/extractors/round1.js +6 -0
  218. package/dist/engine/feature-ast/extractors/round2.js +25 -6
  219. package/dist/engine/feature-ast/index.d.ts +1 -1
  220. package/dist/engine/feature-ast/parse.js +3 -1
  221. package/dist/engine/feature-ast/patch.d.ts +2 -0
  222. package/dist/engine/feature-ast/patch.js +5 -182
  223. package/dist/engine/feature-ast/pattern-change-schema.d.ts +10 -245
  224. package/dist/engine/feature-ast/pattern-change-schema.js +10 -163
  225. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +7 -0
  226. package/dist/engine/feature-ast/pattern-id-matchers.js +211 -0
  227. package/dist/engine/feature-ast/pattern-id-schema.d.ts +251 -0
  228. package/dist/engine/feature-ast/pattern-id-schema.js +166 -0
  229. package/dist/engine/feature-ast/patterns.d.ts +14 -1
  230. package/dist/engine/feature-ast/patterns.js +44 -51
  231. package/dist/engine/feature-ast/render.js +52 -87
  232. package/dist/engine/feature-builder-state.d.ts +1 -0
  233. package/dist/engine/feature-builder-state.js +1 -0
  234. package/dist/engine/feature-entity-handlers.js +3 -0
  235. package/dist/engine/feature-manifest.d.ts +1 -0
  236. package/dist/engine/feature-manifest.js +1 -0
  237. package/dist/engine/field-access.d.ts +1 -0
  238. package/dist/engine/field-access.js +12 -0
  239. package/dist/engine/form-derivations.js +18 -7
  240. package/dist/engine/handler-field-references.js +1 -1
  241. package/dist/engine/index.d.ts +2 -2
  242. package/dist/engine/index.js +1 -1
  243. package/dist/engine/pattern-library/library.js +2 -1
  244. package/dist/engine/pattern-library/static-schemas.d.ts +1 -0
  245. package/dist/engine/pattern-library/static-schemas.js +9 -0
  246. package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
  247. package/dist/engine/project-app-schema-for-roles.js +6 -4
  248. package/dist/engine/registry-ingest.js +1 -1
  249. package/dist/engine/schema-builder.js +228 -212
  250. package/dist/engine/screen-filter-ops.js +2 -0
  251. package/dist/engine/screen-helpers.js +1 -1
  252. package/dist/engine/screen-kind.d.ts +7 -0
  253. package/dist/engine/screen-kind.js +1 -0
  254. package/dist/engine/strip-disabled-features-from-app-schema.js +58 -17
  255. package/dist/engine/types/feature.d.ts +1 -0
  256. package/dist/engine/types/index.d.ts +4 -3
  257. package/dist/engine/types/screen.d.ts +1 -1
  258. package/dist/engine/types/screen.js +1 -1
  259. package/dist/engine/validate-projection-allowlist.js +2 -1
  260. package/dist/entrypoint/index.d.ts +6 -1
  261. package/dist/entrypoint/index.js +10 -1
  262. package/dist/errors/docs-url.d.ts +1 -1
  263. package/dist/errors/docs-url.js +22 -2
  264. package/dist/es-ops/context.js +1 -1
  265. package/dist/event-store/admin-api.js +1 -1
  266. package/dist/event-store/event-store.d.ts +1 -0
  267. package/dist/event-store/event-store.js +17 -8
  268. package/dist/event-store/provenance-append.js +1 -1
  269. package/dist/files/bind-pending-file-refs.js +3 -3
  270. package/dist/files/create-file-ref-from-bytes.js +7 -1
  271. package/dist/files/create-file-ref.d.ts +3 -0
  272. package/dist/files/create-file-ref.js +11 -2
  273. package/dist/files/file-handle.js +2 -3
  274. package/dist/files/file-routes.d.ts +2 -0
  275. package/dist/files/file-routes.js +40 -10
  276. package/dist/files/provider-resolver.d.ts +1 -0
  277. package/dist/files/provider-resolver.js +1 -1
  278. package/dist/files/record-write-check.d.ts +6 -0
  279. package/dist/files/record-write-check.js +13 -0
  280. package/dist/files/resolve-content-type.js +43 -0
  281. package/dist/files/upload-ledger.d.ts +2 -2
  282. package/dist/files/upload-ledger.js +11 -4
  283. package/dist/i18n/required-surface-keys.js +189 -208
  284. package/dist/internal/stack-support.d.ts +2 -1
  285. package/dist/internal/stack-support.js +1 -1
  286. package/dist/internal/testing.js +1 -1
  287. package/dist/jobs/job-runner-context.d.ts +32 -0
  288. package/dist/jobs/job-runner-context.js +305 -0
  289. package/dist/jobs/job-runner-execution.d.ts +7 -0
  290. package/dist/jobs/job-runner-execution.js +160 -0
  291. package/dist/jobs/job-runner-gates.d.ts +19 -0
  292. package/dist/jobs/job-runner-gates.js +198 -0
  293. package/dist/jobs/job-runner-helpers.d.ts +17 -3
  294. package/dist/jobs/job-runner-helpers.js +61 -2
  295. package/dist/jobs/job-runner-scope.d.ts +44 -0
  296. package/dist/jobs/job-runner-scope.js +102 -0
  297. package/dist/jobs/job-runner-types.d.ts +12 -0
  298. package/dist/jobs/job-runner.d.ts +0 -1
  299. package/dist/jobs/job-runner.js +50 -657
  300. package/dist/observability/escape-hatch-report.d.ts +3 -0
  301. package/dist/observability/escape-hatch-report.js +21 -3
  302. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  303. package/dist/pipeline/after-rollback-sink.js +32 -0
  304. package/dist/pipeline/cascade-handler.js +165 -138
  305. package/dist/pipeline/dispatch-batch.js +8 -1
  306. package/dist/pipeline/dispatch-query.js +10 -3
  307. package/dist/pipeline/dispatch-shared.d.ts +13 -3
  308. package/dist/pipeline/dispatch-shared.js +62 -710
  309. package/dist/pipeline/dispatch-write.js +296 -189
  310. package/dist/pipeline/event-dispatcher-admin.js +2 -1
  311. package/dist/pipeline/event-dispatcher-delivery.js +6 -6
  312. package/dist/pipeline/event-dispatcher.d.ts +1 -0
  313. package/dist/pipeline/event-dispatcher.js +6 -9
  314. package/dist/pipeline/handler-context-auth.d.ts +9 -0
  315. package/dist/pipeline/handler-context-auth.js +54 -0
  316. package/dist/pipeline/handler-context-config.d.ts +14 -0
  317. package/dist/pipeline/handler-context-config.js +113 -0
  318. package/dist/pipeline/handler-context-db.d.ts +24 -0
  319. package/dist/pipeline/handler-context-db.js +149 -0
  320. package/dist/pipeline/handler-context-dispatch.d.ts +23 -0
  321. package/dist/pipeline/handler-context-dispatch.js +101 -0
  322. package/dist/pipeline/handler-context-events.d.ts +41 -0
  323. package/dist/pipeline/handler-context-events.js +239 -0
  324. package/dist/pipeline/handler-context-notify.d.ts +12 -0
  325. package/dist/pipeline/handler-context-notify.js +55 -0
  326. package/dist/pipeline/handler-context-observability.d.ts +7 -0
  327. package/dist/pipeline/handler-context-observability.js +21 -0
  328. package/dist/pipeline/handler-context-scope.d.ts +48 -0
  329. package/dist/pipeline/handler-context-scope.js +88 -0
  330. package/dist/pipeline/notify-scope.js +12 -1
  331. package/dist/pipeline/pre-handler-gates.js +20 -4
  332. package/dist/pipeline/pre-transaction-reservations.d.ts +1 -0
  333. package/dist/pipeline/pre-transaction-reservations.js +9 -3
  334. package/dist/pipeline/projection-rebuild.js +2 -1
  335. package/dist/pipeline/system-hooks.d.ts +3 -1
  336. package/dist/pipeline/system-hooks.js +55 -6
  337. package/dist/pipeline/write-result-masking.js +13 -10
  338. package/dist/schema-cli/apply-command.d.ts +2 -0
  339. package/dist/schema-cli/apply-command.js +97 -0
  340. package/dist/schema-cli/baseline-command.d.ts +2 -0
  341. package/dist/schema-cli/baseline-command.js +33 -0
  342. package/dist/schema-cli/generate-command.d.ts +2 -0
  343. package/dist/schema-cli/generate-command.js +90 -0
  344. package/dist/schema-cli/shared.d.ts +39 -0
  345. package/dist/schema-cli/shared.js +95 -0
  346. package/dist/schema-cli/status-command.d.ts +2 -0
  347. package/dist/schema-cli/status-command.js +73 -0
  348. package/dist/schema-cli/validate-boot-input.d.ts +5 -0
  349. package/dist/schema-cli/validate-boot-input.js +130 -0
  350. package/dist/schema-cli/validate-command.d.ts +2 -0
  351. package/dist/schema-cli/validate-command.js +130 -0
  352. package/dist/schema-cli.d.ts +2 -18
  353. package/dist/schema-cli.js +47 -604
  354. package/dist/search/meilisearch-adapter.js +2 -1
  355. package/dist/search/reindex-entity.js +15 -5
  356. package/dist/ui-types/index.d.ts +2 -2
  357. package/dist/ui-types/index.js +1 -1
  358. package/dist/upgrade-changelog.d.ts +2 -0
  359. package/dist/upgrade-changelog.js +14 -0
  360. package/dist/upgrade-cli.d.ts +3 -12
  361. package/dist/upgrade-cli.js +171 -197
  362. package/dist/upgrade-marker-parse.d.ts +32 -0
  363. package/dist/upgrade-marker-parse.js +73 -0
  364. package/package.json +9 -6
  365. package/src/changes.json +555 -0
  366. package/src/scripts/codemod/codemod-support.ts +1 -1
  367. package/src/scripts/codemod/db-factory.ts +1 -1
  368. package/src/scripts/codemod/feature-layout.ts +10 -2
  369. package/src/scripts/codemod/object-form.ts +41 -4
  370. package/src/scripts/codemod/package-merge.ts +58 -8
  371. package/src/scripts/codemod/pii-personal-migration.ts +175 -145
  372. package/src/scripts/codemod/testing-injection.ts +122 -42
  373. package/src/scripts/codemod/testing-move.ts +29 -7
  374. package/dist/engine/provider-plugin-context.d.ts +0 -3
  375. package/dist/engine/provider-plugin-context.js +0 -28
@@ -199,8 +199,9 @@ function pushRelatedListSectionKeys(out, section) {
199
199
  }
200
200
  for (const action of section.rowActions ?? [])
201
201
  pushRowActionKeys(out, action);
202
- pushKey(out, section.groupBy?.label);
203
- for (const label of Object.values(section.groupBy?.labels ?? {}))
202
+ const grouping = section.table?.grouping;
203
+ pushKey(out, grouping?.label);
204
+ for (const label of Object.values(grouping?.labels ?? {}))
204
205
  pushKey(out, label);
205
206
  }
206
207
  function pushListEmptyStateKeys(out, emptyState) {
@@ -221,222 +222,202 @@ function pushExpandableRowKeys(out, section) {
221
222
  pushRowActionKeys(out, section.emptyState.action);
222
223
  }
223
224
  }
224
- export function requiredKeysFromScreen(featureName, screen, options = {}) {
225
- const { treatDotFormAsKey = false } = options;
226
- const out = new Set();
227
- pushKey(out, screenTitleKey(screen.id));
228
- switch (screen.type) {
229
- case "entityList": {
230
- const list = screen;
231
- for (const col of list.columns) {
232
- const normalized = normalizeListColumn(col);
233
- if (normalized.label !== undefined) {
234
- pushKey(out, normalized.label);
235
- }
236
- else {
237
- out.add(fieldLabelKey(featureName, list.entity, normalized.field));
238
- }
239
- }
240
- pushKey(out, list.createLabel);
241
- pushKey(out, list.searchPlaceholder);
242
- pushKey(out, list.description);
243
- pushListEmptyStateKeys(out, list.emptyState);
244
- for (const action of list.rowActions ?? [])
245
- pushRowActionKeys(out, action);
246
- for (const action of list.toolbarActions ?? [])
247
- pushToolbarActionKeys(out, action);
248
- if (list.expandableRow !== undefined)
249
- pushExpandableRowKeys(out, list.expandableRow);
250
- break;
225
+ function pushFieldLabelOrOverrideKey(ctx, labelEntity, fieldName, fieldLabels, treatAsKey = false) {
226
+ const override = fieldLabels?.[fieldName];
227
+ if (override !== undefined)
228
+ pushKey(ctx.out, override, treatAsKey);
229
+ else
230
+ ctx.out.add(fieldLabelKey(ctx.featureName, labelEntity, fieldName));
231
+ }
232
+ function pushListChromeKeys(out, list) {
233
+ pushKey(out, list.createLabel);
234
+ pushKey(out, list.searchPlaceholder);
235
+ pushKey(out, list.description);
236
+ pushListEmptyStateKeys(out, list.emptyState);
237
+ for (const action of list.rowActions ?? [])
238
+ pushRowActionKeys(out, action);
239
+ for (const action of list.toolbarActions ?? [])
240
+ pushToolbarActionKeys(out, action);
241
+ for (const bulk of list.bulkActions ?? [])
242
+ pushKey(out, bulk.confirm);
243
+ }
244
+ function collectEntityListKeys(ctx, list) {
245
+ for (const col of list.columns) {
246
+ const normalized = normalizeListColumn(col);
247
+ if (normalized.label !== undefined) {
248
+ pushKey(ctx.out, normalized.label);
251
249
  }
252
- case "projectionList": {
253
- const list = screen;
254
- // No entity means there are no field-label fallbacks; only explicit column labels are
255
- // collected.
256
- for (const col of list.columns) {
257
- const normalized = normalizeListColumn(col);
258
- if (normalized.label !== undefined)
259
- pushKey(out, normalized.label);
260
- }
261
- pushKey(out, list.createLabel);
262
- pushKey(out, list.searchPlaceholder);
263
- pushKey(out, list.description);
264
- pushListEmptyStateKeys(out, list.emptyState);
265
- for (const action of list.rowActions ?? [])
266
- pushRowActionKeys(out, action);
267
- for (const action of list.toolbarActions ?? [])
268
- pushToolbarActionKeys(out, action);
269
- break;
250
+ else {
251
+ ctx.out.add(fieldLabelKey(ctx.featureName, list.entity, normalized.field));
270
252
  }
271
- case "dashboard": {
272
- pushDashboardScreenKeys(out, screen);
273
- break;
253
+ }
254
+ pushListChromeKeys(ctx.out, list);
255
+ if (list.expandableRow !== undefined)
256
+ pushExpandableRowKeys(ctx.out, list.expandableRow);
257
+ }
258
+ function collectProjectionListKeys(ctx, list) {
259
+ // No entity means there are no field-label fallbacks; only explicit column labels are
260
+ // collected.
261
+ for (const col of list.columns) {
262
+ const normalized = normalizeListColumn(col);
263
+ if (normalized.label !== undefined)
264
+ pushKey(ctx.out, normalized.label);
265
+ }
266
+ pushListChromeKeys(ctx.out, list);
267
+ }
268
+ function pushEditLayoutSectionKeys(ctx, sections, labelEntity, fieldLabels) {
269
+ for (const section of sections) {
270
+ if (isExtensionEditSection(section)) {
271
+ pushKey(ctx.out, section.title);
272
+ continue;
274
273
  }
275
- case "entityEdit": {
276
- const edit = screen;
277
- pushKey(out, edit.submitLabel);
278
- pushKey(out, edit.titleTemplate);
279
- for (const section of edit.layout.sections) {
280
- if (isExtensionEditSection(section)) {
281
- pushKey(out, section.title);
282
- continue;
283
- }
284
- if (section.kind === "relatedList")
285
- continue; // rejected at boot, unreachable here
286
- pushSectionTitles(out, section);
287
- for (const f of sectionFieldSpecs(section)) {
288
- pushEditFieldTextKeys(out, f);
289
- const fieldName = editFieldName(f);
290
- const override = edit.fieldLabels?.[fieldName];
291
- if (override !== undefined)
292
- pushKey(out, override);
293
- else
294
- out.add(fieldLabelKey(featureName, edit.entity, fieldName));
295
- }
296
- }
297
- break;
274
+ if (section.kind === "relatedList")
275
+ continue; // rejected at boot, unreachable here
276
+ pushSectionTitles(ctx.out, section);
277
+ for (const f of sectionFieldSpecs(section)) {
278
+ pushEditFieldTextKeys(ctx.out, f);
279
+ pushFieldLabelOrOverrideKey(ctx, labelEntity, editFieldName(f), fieldLabels);
298
280
  }
299
- case "actionForm": {
300
- const form = screen;
301
- pushKey(out, form.submitLabel);
302
- pushKey(out, form.summary?.title);
303
- pushKey(out, form.summary?.subtitle);
304
- for (const action of form.footerActions ?? [])
305
- pushKey(out, action.label);
306
- for (const link of form.successLinks ?? [])
307
- pushKey(out, link.label);
308
- for (const fact of form.successFacts ?? [])
309
- pushKey(out, fact.label);
310
- for (const fieldName of Object.keys(form.fields)) {
311
- const override = form.fieldLabels?.[fieldName];
312
- if (override !== undefined)
313
- pushKey(out, override);
314
- else
315
- out.add(fieldLabelKey(featureName, ACTION_FORM_ENTITY, fieldName));
316
- }
317
- for (const section of form.layout.sections) {
318
- if (isExtensionEditSection(section)) {
319
- pushKey(out, section.title);
320
- continue;
321
- }
322
- if (section.kind === "relatedList")
323
- continue; // rejected at boot, unreachable here
324
- pushSectionTitles(out, section);
325
- for (const f of sectionFieldSpecs(section)) {
326
- pushEditFieldTextKeys(out, f);
327
- const fieldName = editFieldName(f);
328
- const override = form.fieldLabels?.[fieldName];
329
- if (override !== undefined)
330
- pushKey(out, override);
331
- else
332
- out.add(fieldLabelKey(featureName, ACTION_FORM_ENTITY, fieldName));
333
- }
334
- }
335
- break;
281
+ }
282
+ }
283
+ function collectEntityEditKeys(ctx, edit) {
284
+ pushKey(ctx.out, edit.submitLabel);
285
+ pushKey(ctx.out, edit.titleTemplate);
286
+ pushEditLayoutSectionKeys(ctx, edit.layout.sections, edit.entity, edit.fieldLabels);
287
+ }
288
+ function collectActionFormKeys(ctx, form) {
289
+ pushKey(ctx.out, form.submitLabel);
290
+ pushKey(ctx.out, form.summary?.title);
291
+ pushKey(ctx.out, form.summary?.subtitle);
292
+ for (const action of form.footerActions ?? [])
293
+ pushKey(ctx.out, action.label);
294
+ for (const link of form.successLinks ?? [])
295
+ pushKey(ctx.out, link.label);
296
+ for (const fact of form.successFacts ?? [])
297
+ pushKey(ctx.out, fact.label);
298
+ for (const fieldName of Object.keys(form.fields)) {
299
+ pushFieldLabelOrOverrideKey(ctx, ACTION_FORM_ENTITY, fieldName, form.fieldLabels);
300
+ }
301
+ pushEditLayoutSectionKeys(ctx, form.layout.sections, ACTION_FORM_ENTITY, form.fieldLabels);
302
+ }
303
+ function collectSecretMintKeys(ctx, mint) {
304
+ const { out, featureName } = ctx;
305
+ pushKey(out, mint.submitLabel);
306
+ pushActionFormShapedKeys(out, featureName, mint);
307
+ pushKey(out, mint.reveal.title);
308
+ pushKey(out, mint.reveal.warning);
309
+ pushKey(out, mint.reveal.confirmLabel);
310
+ pushKey(out, mint.reveal.acknowledge);
311
+ for (const revealField of mint.reveal.fields) {
312
+ pushKey(out, revealField.label);
313
+ }
314
+ if (mint.confirm !== undefined) {
315
+ pushKey(out, mint.confirm.submitLabel);
316
+ pushKey(out, mint.confirm.doneMessage);
317
+ pushActionFormShapedKeys(out, featureName, mint.confirm);
318
+ }
319
+ }
320
+ function pushConfigEditSectionKeys(ctx, config) {
321
+ const { out, treatDotFormAsKey } = ctx;
322
+ for (const section of config.layout.sections) {
323
+ if (isExtensionEditSection(section)) {
324
+ pushKey(out, section.title);
325
+ continue;
336
326
  }
337
- case "secretMint": {
338
- const mint = screen;
339
- pushKey(out, mint.submitLabel);
340
- pushActionFormShapedKeys(out, featureName, mint);
341
- pushKey(out, mint.reveal.title);
342
- pushKey(out, mint.reveal.warning);
343
- pushKey(out, mint.reveal.confirmLabel);
344
- pushKey(out, mint.reveal.acknowledge);
345
- for (const revealField of mint.reveal.fields) {
346
- pushKey(out, revealField.label);
347
- }
348
- if (mint.confirm !== undefined) {
349
- pushKey(out, mint.confirm.submitLabel);
350
- pushKey(out, mint.confirm.doneMessage);
351
- pushActionFormShapedKeys(out, featureName, mint.confirm);
352
- }
353
- break;
327
+ if (section.kind === "relatedList")
328
+ continue; // rejected at boot, unreachable here
329
+ pushSectionTitles(out, section, treatDotFormAsKey);
330
+ pushKey(out, section.description, treatDotFormAsKey);
331
+ for (const f of sectionFieldSpecs(section)) {
332
+ pushEditFieldTextKeys(out, f, treatDotFormAsKey);
333
+ pushFieldLabelOrOverrideKey(ctx, CONFIG_EDIT_ENTITY, editFieldName(f), config.fieldLabels, treatDotFormAsKey);
354
334
  }
355
- case "configEdit": {
356
- const config = screen;
357
- pushKey(out, config.submitLabel);
358
- pushKey(out, config.description, treatDotFormAsKey);
359
- for (const key of Object.values(config.fieldDescriptions ?? {})) {
360
- pushKey(out, key, treatDotFormAsKey);
361
- }
362
- for (const fieldName of Object.keys(config.fields)) {
363
- const override = config.fieldLabels?.[fieldName];
364
- if (override !== undefined)
365
- pushKey(out, override, treatDotFormAsKey);
366
- else
367
- out.add(fieldLabelKey(featureName, CONFIG_EDIT_ENTITY, fieldName));
368
- }
369
- for (const section of config.layout.sections) {
370
- if (isExtensionEditSection(section)) {
371
- pushKey(out, section.title);
372
- continue;
373
- }
374
- if (section.kind === "relatedList")
375
- continue; // rejected at boot, unreachable here
376
- pushSectionTitles(out, section, treatDotFormAsKey);
377
- pushKey(out, section.description, treatDotFormAsKey);
378
- for (const f of sectionFieldSpecs(section)) {
379
- pushEditFieldTextKeys(out, f, treatDotFormAsKey);
380
- const fieldName = editFieldName(f);
381
- const override = config.fieldLabels?.[fieldName];
382
- if (override !== undefined)
383
- pushKey(out, override, treatDotFormAsKey);
384
- else
385
- out.add(fieldLabelKey(featureName, CONFIG_EDIT_ENTITY, fieldName));
386
- }
387
- }
388
- break;
335
+ }
336
+ }
337
+ function collectConfigEditKeys(ctx, config) {
338
+ const { out, treatDotFormAsKey } = ctx;
339
+ pushKey(out, config.submitLabel);
340
+ pushKey(out, config.description, treatDotFormAsKey);
341
+ for (const key of Object.values(config.fieldDescriptions ?? {})) {
342
+ pushKey(out, key, treatDotFormAsKey);
343
+ }
344
+ for (const fieldName of Object.keys(config.fields)) {
345
+ pushFieldLabelOrOverrideKey(ctx, CONFIG_EDIT_ENTITY, fieldName, config.fieldLabels, treatDotFormAsKey);
346
+ }
347
+ pushConfigEditSectionKeys(ctx, config);
348
+ }
349
+ function collectSecretsEditKeys(ctx, secretsEdit) {
350
+ const { out, treatDotFormAsKey } = ctx;
351
+ for (const key of Object.values(secretsEdit.fieldLabels))
352
+ pushKey(out, key, treatDotFormAsKey);
353
+ for (const key of Object.values(secretsEdit.fieldHints ?? {})) {
354
+ pushKey(out, key, treatDotFormAsKey);
355
+ }
356
+ for (const section of secretsEdit.sections)
357
+ pushKey(out, section.title, treatDotFormAsKey);
358
+ }
359
+ function pushWriteFormSectionKeys(ctx, section) {
360
+ pushKey(ctx.out, section.title);
361
+ pushKey(ctx.out, section.description);
362
+ pushKey(ctx.out, section.submitLabel);
363
+ for (const f of section.fields) {
364
+ pushEditFieldTextKeys(ctx.out, f);
365
+ ctx.out.add(fieldLabelKey(ctx.featureName, WRITE_FORM_SECTION_ENTITY, editFieldName(f)));
366
+ }
367
+ }
368
+ function collectProjectionDetailKeys(ctx, detail) {
369
+ for (const metric of detail.metrics ?? [])
370
+ pushKey(ctx.out, metric.label);
371
+ for (const section of detail.layout.sections) {
372
+ if (isExtensionEditSection(section)) {
373
+ pushKey(ctx.out, section.title);
374
+ continue;
389
375
  }
390
- case "secretsEdit": {
391
- const secretsEdit = screen;
392
- for (const key of Object.values(secretsEdit.fieldLabels))
393
- pushKey(out, key, treatDotFormAsKey);
394
- for (const key of Object.values(secretsEdit.fieldHints ?? {})) {
395
- pushKey(out, key, treatDotFormAsKey);
396
- }
397
- for (const section of secretsEdit.sections)
398
- pushKey(out, section.title, treatDotFormAsKey);
399
- break;
376
+ if (section.kind === "relatedList") {
377
+ pushRelatedListSectionKeys(ctx.out, section);
378
+ for (const bulk of section.bulkActions ?? [])
379
+ pushKey(ctx.out, bulk.confirm);
380
+ continue;
400
381
  }
401
- case "projectionDetail": {
402
- const detail = screen;
403
- for (const section of detail.layout.sections) {
404
- if (isExtensionEditSection(section)) {
405
- pushKey(out, section.title);
406
- continue;
407
- }
408
- if (section.kind === "relatedList") {
409
- pushRelatedListSectionKeys(out, section);
410
- continue;
411
- }
412
- if (isWriteFormEditSection(section)) {
413
- pushKey(out, section.title);
414
- pushKey(out, section.description);
415
- pushKey(out, section.submitLabel);
416
- for (const f of section.fields) {
417
- pushEditFieldTextKeys(out, f);
418
- const fieldName = editFieldName(f);
419
- out.add(fieldLabelKey(featureName, WRITE_FORM_SECTION_ENTITY, fieldName));
420
- }
421
- continue;
422
- }
423
- pushSectionTitles(out, section);
424
- for (const f of sectionFieldSpecs(section)) {
425
- pushEditFieldTextKeys(out, f);
426
- const fieldName = editFieldName(f);
427
- const override = detail.fieldLabels?.[fieldName];
428
- if (override !== undefined)
429
- pushKey(out, override);
430
- else
431
- out.add(fieldLabelKey(featureName, PROJECTION_DETAIL_ENTITY, fieldName));
432
- }
433
- }
434
- break;
382
+ if (isWriteFormEditSection(section)) {
383
+ pushWriteFormSectionKeys(ctx, section);
384
+ continue;
385
+ }
386
+ pushSectionTitles(ctx.out, section);
387
+ for (const f of sectionFieldSpecs(section)) {
388
+ pushEditFieldTextKeys(ctx.out, f);
389
+ pushFieldLabelOrOverrideKey(ctx, PROJECTION_DETAIL_ENTITY, editFieldName(f), detail.fieldLabels);
435
390
  }
436
- case "custom":
437
- break;
438
391
  }
439
- return [...out];
392
+ }
393
+ const SCREEN_KEY_COLLECTORS = {
394
+ entityList: collectEntityListKeys,
395
+ projectionList: collectProjectionListKeys,
396
+ entityEdit: collectEntityEditKeys,
397
+ actionForm: collectActionFormKeys,
398
+ secretMint: collectSecretMintKeys,
399
+ configEdit: collectConfigEditKeys,
400
+ secretsEdit: collectSecretsEditKeys,
401
+ projectionDetail: collectProjectionDetailKeys,
402
+ dashboard: (ctx, screen) => pushDashboardScreenKeys(ctx.out, screen),
403
+ // Custom screens translate their own texts.
404
+ custom: () => { },
405
+ };
406
+ function collectScreenKeysOfKind(ctx, kind, screen) {
407
+ SCREEN_KEY_COLLECTORS[kind](ctx, screen);
408
+ }
409
+ export function requiredKeysFromScreen(featureName, screen, options = {}) {
410
+ const ctx = {
411
+ out: new Set(),
412
+ featureName,
413
+ treatDotFormAsKey: options.treatDotFormAsKey ?? false,
414
+ };
415
+ pushKey(ctx.out, screenTitleKey(screen.id));
416
+ // An unknown type is only reachable by casting past ScreenDefinition and yields the title key alone.
417
+ if (Object.hasOwn(SCREEN_KEY_COLLECTORS, screen.type)) {
418
+ collectScreenKeysOfKind(ctx, screen.type, screen);
419
+ }
420
+ return [...ctx.out];
440
421
  }
441
422
  export function requiredKeysFromNav(nav, options = {}) {
442
423
  const out = new Set();
@@ -1,6 +1,7 @@
1
+ export { isClosedConnectionError } from "../db/closed-connection.ts";
1
2
  export { createDbConnection } from "../db/connection.ts";
2
3
  export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.ts";
3
- export { type AnyDb, isClosedConnectionError } from "../db/query.ts";
4
+ export type { AnyDb } from "../db/query.ts";
4
5
  export { columnNamesOf } from "../db/schema-inspection.ts";
5
6
  export { schemaTableName } from "../db/table-introspection.ts";
6
7
  export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.ts";
@@ -1,7 +1,7 @@
1
1
  // @runtime dev
2
+ export { isClosedConnectionError } from "../db/closed-connection.js";
2
3
  export { createDbConnection } from "../db/connection.js";
3
4
  export { acquireSessionAdvisoryLock, createDatabase, databaseExists, dropDatabaseIfExists, listDatabaseNamesWithPrefix, renameDatabase, truncateTablesRestartIdentity, } from "../db/queries/test-stack.js";
4
- export { isClosedConnectionError } from "../db/query.js";
5
5
  export { columnNamesOf } from "../db/schema-inspection.js";
6
6
  export { schemaTableName } from "../db/table-introspection.js";
7
7
  export { addMissingColumns, addMissingIndexes, tableToMeta, unsafeCreateEntityTable, unsafeEnsureEntityTable, unsafePushTables, } from "../db/table-push.js";
@@ -14,5 +14,5 @@ export function withExecutorManagedWritesForTests(db) {
14
14
  }
15
15
  if (isDbRunner(db))
16
16
  return withExecutorManagedWrites(db);
17
- throw new Error("withExecutorManagedWritesForTests: expected a TenantDb or a postgres-js runner");
17
+ throw new Error("withExecutorManagedWritesForTests: expected a TenantDb or a Bun.SQL runner");
18
18
  }
@@ -0,0 +1,32 @@
1
+ /// <reference types="temporal-polyfill/global" preserve="true" />
2
+ import type { ConfigAccessor } from "@cosmicdrift/kumiko-types/config";
3
+ import type { WriteOrigin } from "@cosmicdrift/kumiko-types/event-store-types";
4
+ import type { DbRow } from "../db/connection.ts";
5
+ import type { JobContext, JobDefinition } from "../engine/types/index.ts";
6
+ import type { JobRunnerScope } from "./job-runner-scope.ts";
7
+ import type { JobInvocation, JobLogEntry, JobMeta } from "./job-runner-types.ts";
8
+ export type TenantVisibleSubjects = {
9
+ readonly failureSubject: string | null;
10
+ readonly runSubject: string | null;
11
+ readonly configError: Error | undefined;
12
+ };
13
+ export type JobRun = {
14
+ readonly jobName: string;
15
+ readonly jobDef: JobDefinition;
16
+ readonly jobId: string;
17
+ readonly startTime: number;
18
+ readonly logs: JobLogEntry[];
19
+ readonly rawData: DbRow;
20
+ readonly attempt: number;
21
+ readonly finalAttempt: boolean;
22
+ readonly meta: JobMeta;
23
+ readonly payload: Record<string, unknown>;
24
+ readonly tenantId: string;
25
+ readonly triggeredById: string | null;
26
+ readonly subjects: TenantVisibleSubjects;
27
+ readonly writeOrigin: WriteOrigin | undefined;
28
+ readonly writeOriginInvalid: boolean;
29
+ readonly config: ConfigAccessor | undefined;
30
+ readonly jobContext: Omit<JobContext, "tz">;
31
+ };
32
+ export declare function prepareJobRun(scope: JobRunnerScope, jobDef: JobDefinition, bullJob: JobInvocation, token: string | undefined): JobRun;