@cosmicdrift/kumiko-framework 0.14.0 → 0.15.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 (314) hide show
  1. package/package.json +6 -6
  2. package/src/__tests__/{anonymous-access.integration.ts → anonymous-access.integration.test.ts} +12 -9
  3. package/src/__tests__/{error-contract.integration.ts → error-contract.integration.test.ts} +5 -4
  4. package/src/__tests__/{field-access.integration.ts → field-access.integration.test.ts} +3 -3
  5. package/src/__tests__/{full-stack.integration.ts → full-stack.integration.test.ts} +7 -16
  6. package/src/__tests__/{ownership.integration.ts → ownership.integration.test.ts} +3 -2
  7. package/src/__tests__/{raw-table.integration.ts → raw-table.integration.test.ts} +18 -30
  8. package/src/__tests__/{reference-data.integration.ts → reference-data.integration.test.ts} +24 -11
  9. package/src/__tests__/{transition-guard.integration.ts → transition-guard.integration.test.ts} +12 -10
  10. package/src/api/__tests__/api.test.ts +1 -1
  11. package/src/api/__tests__/auth-middleware-transport.test.ts +1 -1
  12. package/src/api/__tests__/auth-routes-cookie.test.ts +1 -1
  13. package/src/api/__tests__/{batch.integration.ts → batch.integration.test.ts} +30 -30
  14. package/src/api/__tests__/body-limit.test.ts +1 -1
  15. package/src/api/__tests__/csrf-middleware.test.ts +1 -1
  16. package/src/api/__tests__/{dispatcher-live.integration.ts → dispatcher-live.integration.test.ts} +10 -9
  17. package/src/api/__tests__/metrics-endpoint.test.ts +1 -1
  18. package/src/api/__tests__/{nested-write.integration.ts → nested-write.integration.test.ts} +13 -16
  19. package/src/api/__tests__/readiness.test.ts +1 -1
  20. package/src/api/__tests__/request-id-middleware.test.ts +1 -1
  21. package/src/api/__tests__/sse-broker.test.ts +12 -12
  22. package/src/api/__tests__/sse-route.test.ts +1 -1
  23. package/src/api/readiness.ts +2 -2
  24. package/src/auth/__tests__/roles.test.ts +2 -2
  25. package/src/bun-db/__tests__/PATTERN.md +73 -0
  26. package/src/bun-db/__tests__/_helpers.ts +103 -0
  27. package/src/bun-db/__tests__/batch-methods.integration.test.ts +143 -0
  28. package/src/bun-db/__tests__/batch-methods.test.ts +20 -0
  29. package/src/bun-db/__tests__/bun-test-db.ts +19 -0
  30. package/src/bun-db/__tests__/bun-test-stack.ts +6 -0
  31. package/src/bun-db/__tests__/column-types.integration.test.ts +132 -0
  32. package/src/bun-db/__tests__/compound-types.integration.test.ts +134 -0
  33. package/src/bun-db/__tests__/jsonb-edge-cases.integration.test.ts +235 -0
  34. package/src/bun-db/__tests__/smoke.integration.test.ts +43 -0
  35. package/src/bun-db/__tests__/sql-methods.integration.test.ts +231 -0
  36. package/src/bun-db/__tests__/where-patterns.integration.test.ts +185 -0
  37. package/src/bun-db/connection.ts +84 -0
  38. package/src/bun-db/index.ts +31 -0
  39. package/src/bun-db/query.ts +845 -0
  40. package/src/compliance/__tests__/duration-spec.test.ts +1 -1
  41. package/src/compliance/__tests__/profiles.test.ts +1 -1
  42. package/src/compliance/__tests__/sub-processors.test.ts +1 -1
  43. package/src/db/__tests__/{apply-entity-event-tenant.integration.ts → apply-entity-event-tenant.integration.test.ts} +13 -11
  44. package/src/db/__tests__/big-int-field.test.ts +15 -14
  45. package/src/db/__tests__/column-ddl.integration.test.ts +113 -0
  46. package/src/db/__tests__/compound-types.test.ts +1 -1
  47. package/src/db/__tests__/{config-seed.integration.ts → config-seed.integration.test.ts} +32 -27
  48. package/src/db/__tests__/connection-options.test.ts +1 -1
  49. package/src/db/__tests__/dialect-instant.test.ts +1 -1
  50. package/src/db/__tests__/encryption.test.ts +1 -1
  51. package/src/db/__tests__/{drizzle-table-types.test.ts → entity-table-types.test.ts} +16 -16
  52. package/src/db/__tests__/{event-store-executor-list.integration.ts → event-store-executor-list.integration.test.ts} +12 -7
  53. package/src/db/__tests__/{event-store-executor.integration.ts → event-store-executor.integration.test.ts} +19 -12
  54. package/src/db/__tests__/{implicit-projection-equivalence.integration.ts → implicit-projection-equivalence.integration.test.ts} +35 -29
  55. package/src/db/__tests__/located-timestamp.test.ts +1 -1
  56. package/src/db/__tests__/money.test.ts +1 -1
  57. package/src/db/__tests__/{multi-row-insert.integration.ts → multi-row-insert.integration.test.ts} +18 -11
  58. package/src/db/__tests__/parse-auto-verb.test.ts +1 -1
  59. package/src/db/__tests__/{required-not-null-migration-safety.integration.ts → required-not-null-migration-safety.integration.test.ts} +28 -24
  60. package/src/db/__tests__/{schema-migration.integration.ts → schema-migration.integration.test.ts} +32 -28
  61. package/src/db/__tests__/sql-inventory.test.ts +56 -0
  62. package/src/db/__tests__/table-builder-indexes.test.ts +30 -11
  63. package/src/db/__tests__/table-builder-required.test.ts +20 -22
  64. package/src/db/__tests__/{tenant-db.integration.ts → tenant-db.integration.test.ts} +106 -144
  65. package/src/db/__tests__/{unique-violation-mapping.integration.ts → unique-violation-mapping.integration.test.ts} +13 -8
  66. package/src/db/api.ts +46 -0
  67. package/src/db/apply-entity-event.ts +45 -36
  68. package/src/db/assert-exists-in.ts +5 -16
  69. package/src/db/bun-provider.ts +37 -0
  70. package/src/db/config-seed.ts +4 -4
  71. package/src/db/connection.ts +14 -57
  72. package/src/db/cursor.ts +5 -56
  73. package/src/db/dialect.ts +472 -99
  74. package/src/db/eagerload.ts +5 -12
  75. package/src/db/entity-table-meta.ts +390 -0
  76. package/src/db/event-store-executor.ts +158 -100
  77. package/src/db/index.ts +33 -5
  78. package/src/db/migrate-generator.ts +350 -0
  79. package/src/db/migrate-runner.ts +206 -0
  80. package/src/db/postgres-provider.ts +25 -0
  81. package/src/db/queries/entity-read.ts +15 -0
  82. package/src/db/queries/es-ops.ts +17 -0
  83. package/src/db/queries/event-consumer.ts +170 -0
  84. package/src/db/queries/event-store-admin.ts +127 -0
  85. package/src/db/queries/event-store.ts +155 -0
  86. package/src/db/queries/projection-rebuild.ts +59 -0
  87. package/src/db/queries/raw-sql.ts +15 -0
  88. package/src/db/queries/schema-drift.ts +35 -0
  89. package/src/db/queries/seed-context.ts +58 -0
  90. package/src/db/queries/table-ops.ts +11 -0
  91. package/src/db/queries/test-stack.ts +56 -0
  92. package/src/db/query-api.ts +22 -0
  93. package/src/db/query.ts +30 -0
  94. package/src/db/reference-data.ts +19 -22
  95. package/src/db/render-ddl.ts +57 -0
  96. package/src/db/row-helpers.ts +3 -52
  97. package/src/db/schema-inspection.ts +17 -4
  98. package/src/db/sql-inventory.ts +208 -0
  99. package/src/db/table-builder.ts +48 -40
  100. package/src/db/tenant-db.ts +105 -326
  101. package/src/engine/__tests__/auth-claims-registrar.test.ts +1 -1
  102. package/src/engine/__tests__/boot-validator-api-exposure.test.ts +3 -3
  103. package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +1 -1
  104. package/src/engine/__tests__/boot-validator-pii-retention.test.ts +5 -5
  105. package/src/engine/__tests__/boot-validator-s0-integration.test.ts +3 -3
  106. package/src/engine/__tests__/boot-validator.test.ts +4 -3
  107. package/src/engine/__tests__/build-app-schema.test.ts +1 -1
  108. package/src/engine/__tests__/build-target.test.ts +1 -1
  109. package/src/engine/__tests__/claim-keys.test.ts +1 -1
  110. package/src/engine/__tests__/codemod-pipeline.test.ts +3 -3
  111. package/src/engine/__tests__/config-helpers.test.ts +1 -1
  112. package/src/engine/__tests__/effective-features.test.ts +1 -1
  113. package/src/engine/__tests__/engine.test.ts +1 -1
  114. package/src/engine/__tests__/entity-handlers.test.ts +3 -3
  115. package/src/engine/__tests__/event-helpers.test.ts +3 -3
  116. package/src/engine/__tests__/extends-registrar.test.ts +4 -4
  117. package/src/engine/__tests__/factories-long-text.test.ts +1 -1
  118. package/src/engine/__tests__/factories-time.test.ts +1 -1
  119. package/src/engine/__tests__/field-predicates.test.ts +1 -1
  120. package/src/engine/__tests__/hook-phases.test.ts +1 -1
  121. package/src/engine/__tests__/identifiers.test.ts +1 -1
  122. package/src/engine/__tests__/lifecycle-hooks.test.ts +1 -1
  123. package/src/engine/__tests__/nav.test.ts +1 -1
  124. package/src/engine/__tests__/ownership.test.ts +10 -11
  125. package/src/engine/__tests__/parse-ref-target.test.ts +1 -1
  126. package/src/engine/__tests__/pipeline-engine.test.ts +1 -1
  127. package/src/engine/__tests__/{pipeline-handler.integration.ts → pipeline-handler.integration.test.ts} +38 -52
  128. package/src/engine/__tests__/{pipeline-observability.integration.ts → pipeline-observability.integration.test.ts} +1 -1
  129. package/src/engine/__tests__/{pipeline-performance.integration.ts → pipeline-performance.integration.test.ts} +1 -1
  130. package/src/engine/__tests__/pipeline-sub-pipelines.test.ts +1 -1
  131. package/src/engine/__tests__/post-query-hook.test.ts +1 -1
  132. package/src/engine/__tests__/projection-helpers.test.ts +25 -17
  133. package/src/engine/__tests__/projection.test.ts +4 -4
  134. package/src/engine/__tests__/qualified-name.test.ts +1 -1
  135. package/src/engine/__tests__/raw-table.test.ts +9 -8
  136. package/src/engine/__tests__/resolve-config-or-param.test.ts +5 -5
  137. package/src/engine/__tests__/run-in.test.ts +1 -1
  138. package/src/engine/__tests__/schema-builder.test.ts +1 -1
  139. package/src/engine/__tests__/screen.test.ts +1 -1
  140. package/src/engine/__tests__/search-payload-extension.test.ts +3 -3
  141. package/src/engine/__tests__/state-machine.test.ts +1 -1
  142. package/src/engine/__tests__/steps-aggregate-append-event.test.ts +7 -7
  143. package/src/engine/__tests__/steps-aggregate-create.test.ts +4 -4
  144. package/src/engine/__tests__/steps-aggregate-update.test.ts +3 -3
  145. package/src/engine/__tests__/steps-call-feature.test.ts +5 -5
  146. package/src/engine/__tests__/steps-mail-send.test.ts +7 -7
  147. package/src/engine/__tests__/steps-read.test.ts +34 -40
  148. package/src/engine/__tests__/steps-resolver-utils.test.ts +6 -6
  149. package/src/engine/__tests__/steps-unsafe-projection-delete.test.ts +24 -19
  150. package/src/engine/__tests__/steps-unsafe-projection-upsert.test.ts +28 -17
  151. package/src/engine/__tests__/steps-webhook-send.test.ts +6 -6
  152. package/src/engine/__tests__/steps-workflow.test.ts +7 -7
  153. package/src/engine/__tests__/system-user.test.ts +1 -1
  154. package/src/engine/__tests__/validate-projection-allowlist.test.ts +4 -5
  155. package/src/engine/__tests__/validation-hooks.test.ts +1 -1
  156. package/src/engine/__tests__/visual-tree-patterns.test.ts +1 -1
  157. package/src/engine/boot-validator/entity-handler.ts +3 -3
  158. package/src/engine/boot-validator/ownership.ts +1 -1
  159. package/src/engine/define-feature.ts +1 -2
  160. package/src/engine/entity-handlers.ts +5 -5
  161. package/src/engine/factories.ts +1 -1
  162. package/src/engine/feature-ast/__tests__/canonical-form.test.ts +1 -1
  163. package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +1 -1
  164. package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +2 -2
  165. package/src/engine/feature-ast/__tests__/parse.test.ts +1 -1
  166. package/src/engine/feature-ast/__tests__/patch.test.ts +1 -1
  167. package/src/engine/feature-ast/__tests__/patcher.test.ts +1 -1
  168. package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +1 -1
  169. package/src/engine/feature-ast/__tests__/visual-tree-parse.test.ts +1 -1
  170. package/src/engine/ownership.ts +113 -41
  171. package/src/engine/pattern-library/__tests__/library.test.ts +2 -2
  172. package/src/engine/projection-helpers.ts +2 -11
  173. package/src/engine/registry.ts +2 -2
  174. package/src/engine/steps/read-find-many.ts +13 -13
  175. package/src/engine/steps/read-find-one.ts +7 -9
  176. package/src/engine/steps/unsafe-projection-delete.ts +4 -5
  177. package/src/engine/steps/unsafe-projection-upsert.ts +63 -31
  178. package/src/engine/types/feature.ts +7 -2
  179. package/src/engine/types/fields.ts +4 -5
  180. package/src/engine/types/step.ts +10 -10
  181. package/src/engine/validate-projection-allowlist.ts +23 -3
  182. package/src/entrypoint/__tests__/{entrypoint-job-wiring.integration.ts → entrypoint-job-wiring.integration.test.ts} +4 -3
  183. package/src/entrypoint/__tests__/{split-deploy.integration.ts → split-deploy.integration.test.ts} +4 -3
  184. package/src/env/__tests__/compose-env-schema.test.ts +1 -1
  185. package/src/env/__tests__/dry-run.test.ts +1 -1
  186. package/src/errors/__tests__/classes.test.ts +1 -1
  187. package/src/errors/__tests__/write-failures.test.ts +1 -1
  188. package/src/es-ops/__tests__/{context.integration.ts → context.integration.test.ts} +43 -29
  189. package/src/es-ops/__tests__/{runner.integration.ts → runner.integration.test.ts} +25 -23
  190. package/src/es-ops/__tests__/runner.test.ts +29 -19
  191. package/src/es-ops/context.ts +9 -43
  192. package/src/es-ops/operations-schema.ts +2 -2
  193. package/src/es-ops/runner.ts +12 -26
  194. package/src/event-store/__tests__/{admin-api.integration.ts → admin-api.integration.test.ts} +71 -45
  195. package/src/event-store/__tests__/{event-store.integration.ts → event-store.integration.test.ts} +7 -5
  196. package/src/event-store/__tests__/{get-stream-version-perf.integration.ts → get-stream-version-perf.integration.test.ts} +5 -3
  197. package/src/event-store/__tests__/{perf.integration.ts → perf.integration.test.ts} +24 -16
  198. package/src/event-store/__tests__/{snapshot.integration.ts → snapshot.integration.test.ts} +34 -28
  199. package/src/event-store/__tests__/{upcaster-dead-letter.integration.ts → upcaster-dead-letter.integration.test.ts} +11 -12
  200. package/src/event-store/__tests__/{upcaster.integration.ts → upcaster.integration.test.ts} +19 -32
  201. package/src/event-store/admin-api.ts +55 -83
  202. package/src/event-store/archive.ts +15 -39
  203. package/src/event-store/event-store.ts +92 -86
  204. package/src/event-store/events-schema.ts +2 -1
  205. package/src/event-store/index.ts +1 -0
  206. package/src/event-store/snapshot.ts +26 -24
  207. package/src/event-store/upcaster-dead-letter.ts +19 -18
  208. package/src/files/__tests__/content-disposition.test.ts +1 -1
  209. package/src/files/__tests__/{file-field-pipeline.integration.ts → file-field-pipeline.integration.test.ts} +8 -5
  210. package/src/files/__tests__/file-handle.test.ts +1 -1
  211. package/src/files/__tests__/{files.integration.ts → files.integration.test.ts} +32 -17
  212. package/src/files/__tests__/read-stream.test.ts +1 -1
  213. package/src/files/__tests__/{storage-tracking.integration.ts → storage-tracking.integration.test.ts} +26 -30
  214. package/src/files/__tests__/write-stream.test.ts +1 -1
  215. package/src/files/__tests__/zip-stream.test.ts +1 -1
  216. package/src/files/file-ref-table.ts +2 -2
  217. package/src/files/file-routes.ts +7 -9
  218. package/src/files/storage-tracking.ts +9 -17
  219. package/src/i18n/__tests__/i18n.test.ts +1 -1
  220. package/src/jobs/__tests__/{job-event-trigger.integration.ts → job-event-trigger.integration.test.ts} +6 -3
  221. package/src/jobs/__tests__/{job-multi-trigger.integration.ts → job-multi-trigger.integration.test.ts} +6 -3
  222. package/src/jobs/__tests__/{jobs.integration.ts → jobs.integration.test.ts} +5 -7
  223. package/src/lifecycle/__tests__/{lifecycle-server.integration.ts → lifecycle-server.integration.test.ts} +1 -1
  224. package/src/lifecycle/__tests__/lifecycle.test.ts +6 -6
  225. package/src/lifecycle/__tests__/signal-handlers.test.ts +6 -6
  226. package/src/logging/__tests__/pino-trace-bridge.test.ts +1 -1
  227. package/src/migrations/__tests__/compare-snapshots.test.ts +1 -1
  228. package/src/migrations/__tests__/{detect-drift.integration.ts → detect-drift.integration.test.ts} +34 -26
  229. package/src/migrations/__tests__/{detect-projections-to-rebuild.integration.ts → detect-projections-to-rebuild.integration.test.ts} +1 -1
  230. package/src/migrations/__tests__/rebuild-marker.test.ts +1 -1
  231. package/src/migrations/projection-detection.ts +12 -1
  232. package/src/migrations/schema-drift.ts +7 -23
  233. package/src/observability/__tests__/console-provider.test.ts +1 -1
  234. package/src/observability/__tests__/metric-validator.test.ts +1 -1
  235. package/src/observability/__tests__/noop-provider.test.ts +1 -1
  236. package/src/observability/__tests__/{observability.integration.ts → observability.integration.test.ts} +5 -8
  237. package/src/observability/__tests__/prometheus-meter.test.ts +1 -1
  238. package/src/observability/__tests__/recording-meter.test.ts +1 -1
  239. package/src/observability/__tests__/recording-tracer.test.ts +1 -1
  240. package/src/observability/__tests__/sensitive-filter.test.ts +1 -1
  241. package/src/pipeline/__tests__/{archive-stream.integration.ts → archive-stream.integration.test.ts} +3 -3
  242. package/src/pipeline/__tests__/auth-claims-resolver.test.ts +9 -9
  243. package/src/pipeline/__tests__/{cascade-handler.integration.ts → cascade-handler.integration.test.ts} +18 -15
  244. package/src/pipeline/__tests__/cascade-handler.test.ts +1 -1
  245. package/src/pipeline/__tests__/{causation-chain.integration.ts → causation-chain.integration.test.ts} +12 -13
  246. package/src/pipeline/__tests__/{ctx-bridge.integration.ts → ctx-bridge.integration.test.ts} +12 -11
  247. package/src/pipeline/__tests__/dispatcher.test.ts +2 -2
  248. package/src/pipeline/__tests__/{distributed-lock.integration.ts → distributed-lock.integration.test.ts} +1 -1
  249. package/src/pipeline/__tests__/{domain-events-projections.integration.ts → domain-events-projections.integration.test.ts} +13 -15
  250. package/src/pipeline/__tests__/{event-dedup.integration.ts → event-dedup.integration.test.ts} +1 -1
  251. package/src/pipeline/__tests__/{event-define-event-strict.integration.ts → event-define-event-strict.integration.test.ts} +6 -16
  252. package/src/pipeline/__tests__/{event-dispatcher-lifecycle.integration.ts → event-dispatcher-lifecycle.integration.test.ts} +1 -1
  253. package/src/pipeline/__tests__/{event-dispatcher-multi-instance.integration.ts → event-dispatcher-multi-instance.integration.test.ts} +3 -2
  254. package/src/pipeline/__tests__/{event-dispatcher-pg-listen.integration.ts → event-dispatcher-pg-listen.integration.test.ts} +1 -1
  255. package/src/pipeline/__tests__/{event-dispatcher-recovery.integration.ts → event-dispatcher-recovery.integration.test.ts} +2 -2
  256. package/src/pipeline/__tests__/{event-dispatcher-second-audit.integration.ts → event-dispatcher-second-audit.integration.test.ts} +17 -16
  257. package/src/pipeline/__tests__/event-dispatcher-strict.test.ts +14 -12
  258. package/src/pipeline/__tests__/{event-dispatcher.integration.ts → event-dispatcher.integration.test.ts} +8 -15
  259. package/src/pipeline/__tests__/{event-retention.integration.ts → event-retention.integration.test.ts} +28 -25
  260. package/src/pipeline/__tests__/{fetch-for-writing.integration.ts → fetch-for-writing.integration.test.ts} +6 -6
  261. package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +4 -4
  262. package/src/pipeline/__tests__/{load-aggregate-query.integration.ts → load-aggregate-query.integration.test.ts} +9 -5
  263. package/src/pipeline/__tests__/{msp-error-mode.integration.ts → msp-error-mode.integration.test.ts} +1 -1
  264. package/src/pipeline/__tests__/{msp-multi-hop.integration.ts → msp-multi-hop.integration.test.ts} +9 -8
  265. package/src/pipeline/__tests__/{msp-rebuild.integration.ts → msp-rebuild.integration.test.ts} +47 -55
  266. package/src/pipeline/__tests__/{multi-stream-projection.integration.ts → multi-stream-projection.integration.test.ts} +19 -53
  267. package/src/pipeline/__tests__/{perf-rebuild.integration.ts → perf-rebuild.integration.test.ts} +36 -34
  268. package/src/pipeline/__tests__/{post-query-hook.integration.ts → post-query-hook.integration.test.ts} +1 -1
  269. package/src/pipeline/__tests__/{projection-rebuild.integration.ts → projection-rebuild.integration.test.ts} +21 -30
  270. package/src/pipeline/__tests__/{query-projection.integration.ts → query-projection.integration.test.ts} +6 -5
  271. package/src/pipeline/__tests__/{redis-pipeline.integration.ts → redis-pipeline.integration.test.ts} +3 -1
  272. package/src/pipeline/cascade-handler.ts +13 -21
  273. package/src/pipeline/dispatcher.ts +43 -48
  274. package/src/pipeline/event-consumer-state.ts +11 -2
  275. package/src/pipeline/event-dispatcher.ts +86 -146
  276. package/src/pipeline/event-retention.ts +14 -24
  277. package/src/pipeline/msp-rebuild.ts +54 -78
  278. package/src/pipeline/projection-rebuild.ts +65 -67
  279. package/src/pipeline/projection-state.ts +2 -2
  280. package/src/random/__tests__/generate.test.ts +13 -13
  281. package/src/rate-limit/__tests__/{dispatcher-l3.integration.ts → dispatcher-l3.integration.test.ts} +1 -1
  282. package/src/rate-limit/__tests__/{middleware.integration.ts → middleware.integration.test.ts} +1 -1
  283. package/src/rate-limit/__tests__/{resolver.integration.ts → resolver.integration.test.ts} +1 -1
  284. package/src/redis/__tests__/redis-options.test.ts +1 -1
  285. package/src/search/__tests__/{meilisearch-adapter.integration.ts → meilisearch-adapter.integration.test.ts} +1 -1
  286. package/src/search/__tests__/search-adapter.test.ts +1 -1
  287. package/src/secrets/__tests__/dek-cache.test.ts +1 -3
  288. package/src/secrets/__tests__/env-master-key-provider.test.ts +1 -1
  289. package/src/secrets/__tests__/envelope.test.ts +1 -1
  290. package/src/secrets/__tests__/leak-guard.test.ts +1 -1
  291. package/src/secrets/__tests__/rotation.test.ts +1 -1
  292. package/src/stack/db.ts +25 -48
  293. package/src/stack/push-entity-projection-tables.ts +2 -4
  294. package/src/stack/table-helpers.ts +98 -61
  295. package/src/stack/test-stack.ts +8 -7
  296. package/src/testing/__tests__/db-cleanup.test.ts +40 -0
  297. package/src/testing/__tests__/e2e-generator.test.ts +1 -1
  298. package/src/testing/__tests__/{ensure-entity-table.integration.ts → ensure-entity-table.integration.test.ts} +7 -14
  299. package/src/testing/db-cleanup.ts +44 -0
  300. package/src/testing/expect-error.ts +1 -1
  301. package/src/testing/index.ts +2 -0
  302. package/src/testing/multipart-helper.ts +94 -0
  303. package/src/testing/shared-entities.ts +5 -5
  304. package/src/time/__tests__/polyfill.test.ts +1 -1
  305. package/src/time/__tests__/tz-context.test.ts +1 -1
  306. package/src/utils/__tests__/assert.test.ts +1 -1
  307. package/src/utils/__tests__/env-parse.test.ts +1 -1
  308. package/CHANGELOG.md +0 -474
  309. package/src/db/__tests__/cursor.test.ts +0 -41
  310. package/src/db/__tests__/db-helpers.test.ts +0 -369
  311. package/src/db/__tests__/drizzle-helpers.integration.ts +0 -186
  312. package/src/db/__tests__/row-helpers.test.ts +0 -59
  313. package/src/engine/steps/_drizzle-boundary.ts +0 -19
  314. package/src/files/__tests__/file-field-column.integration.ts +0 -103
@@ -3,11 +3,10 @@
3
3
  // Vorher mussten Apps für unique-indices über mehrere Spalten daneben eine
4
4
  // hand-written pgTable-Definition halten — Single-Source-of-Truth gebrochen,
5
5
  // Schema-Drift programmiert. Mit entity.indexes pflegen Author die
6
- // Constraint deklarativ in der EntityDefinition; buildDrizzleTable rendert
6
+ // Constraint deklarativ in der EntityDefinition; buildEntityTable rendert
7
7
  // sie via uniqueIndex/index.
8
8
 
9
- import { getTableConfig } from "drizzle-orm/pg-core";
10
- import { describe, expect, test } from "vitest";
9
+ import { describe, expect, test } from "bun:test";
11
10
  import {
12
11
  createBooleanField,
13
12
  createEntity,
@@ -15,9 +14,29 @@ import {
15
14
  defineFeature,
16
15
  validateBoot,
17
16
  } from "../../engine";
18
- import { buildDrizzleTable } from "../table-builder";
17
+ import { buildEntityTable } from "../table-builder";
19
18
 
20
- describe("buildDrizzleTable entity.indexes", () => {
19
+ // Native dialect equivalent of drizzle's getTableConfig: reads the
20
+ // EntityTableMeta-shape exposed on every SchemaTable.
21
+ // biome-ignore lint/suspicious/noExplicitAny: DDL index test helper
22
+ function getTableConfig(table: any): {
23
+ indexes: Array<{ config: { name: string; unique: boolean; columns: Array<{ name: string }> } }>;
24
+ } {
25
+ const meta = table as unknown as {
26
+ indexes: ReadonlyArray<{ name: string; columns: readonly string[]; unique?: boolean }>;
27
+ };
28
+ return {
29
+ indexes: meta.indexes.map((idx) => ({
30
+ config: {
31
+ name: idx.name,
32
+ unique: idx.unique === true,
33
+ columns: idx.columns.map((c) => ({ name: c })),
34
+ },
35
+ })),
36
+ };
37
+ }
38
+
39
+ describe("buildEntityTable — entity.indexes", () => {
21
40
  test("composite unique-index landet als unique=true in Drizzle table-config", () => {
22
41
  const entity = createEntity({
23
42
  fields: {
@@ -26,7 +45,7 @@ describe("buildDrizzleTable — entity.indexes", () => {
26
45
  },
27
46
  indexes: [{ unique: true, columns: ["key", "tenantId", "userId"] }],
28
47
  });
29
- const tbl = buildDrizzleTable("config-value", entity);
48
+ const tbl = buildEntityTable("config-value", entity);
30
49
  const { indexes } = getTableConfig(tbl);
31
50
  const composite = indexes.find(
32
51
  (i) => i.config.name === "read_config_values_key_tenant_id_user_id_unique",
@@ -48,7 +67,7 @@ describe("buildDrizzleTable — entity.indexes", () => {
48
67
  },
49
68
  indexes: [{ columns: ["startedAt", "endedAt"] }],
50
69
  });
51
- const tbl = buildDrizzleTable("session", entity);
70
+ const tbl = buildEntityTable("session", entity);
52
71
  const { indexes } = getTableConfig(tbl);
53
72
  const composite = indexes.find(
54
73
  (i) => i.config.name === "read_sessions_started_at_ended_at_idx",
@@ -62,7 +81,7 @@ describe("buildDrizzleTable — entity.indexes", () => {
62
81
  fields: { slug: createTextField({ required: true }) },
63
82
  indexes: [{ unique: true, columns: ["slug"], name: "my_custom_idx" }],
64
83
  });
65
- const tbl = buildDrizzleTable("page", entity);
84
+ const tbl = buildEntityTable("page", entity);
66
85
  const { indexes } = getTableConfig(tbl);
67
86
  const idx = indexes.find((i) => i.config.name === "my_custom_idx");
68
87
  expect(idx).toBeDefined();
@@ -75,11 +94,11 @@ describe("buildDrizzleTable — entity.indexes", () => {
75
94
  title: createTextField({}),
76
95
  },
77
96
  });
78
- expect(() => buildDrizzleTable("widget", entity)).not.toThrow();
97
+ expect(() => buildEntityTable("widget", entity)).not.toThrow();
79
98
  });
80
99
 
81
100
  test("Spalten die keine DB-Spalte haben (multi-files) werden via Boot-Validator gecatched", () => {
82
- // buildDrizzleTable selbst überspringt fehlende Columns silently —
101
+ // buildEntityTable selbst überspringt fehlende Columns silently —
83
102
  // der Boot-Validator wirft.
84
103
  const entity = createEntity({
85
104
  fields: {
@@ -88,7 +107,7 @@ describe("buildDrizzleTable — entity.indexes", () => {
88
107
  indexes: [{ columns: ["attachments"] }],
89
108
  });
90
109
  // No throw at build time.
91
- expect(() => buildDrizzleTable("widget", entity)).not.toThrow();
110
+ expect(() => buildEntityTable("widget", entity)).not.toThrow();
92
111
  // But validateBoot does.
93
112
  const feature = defineFeature("widgetFeature", (r) => {
94
113
  r.entity("widget", entity);
@@ -7,7 +7,7 @@
7
7
  // generierte Variante gedriftet sind. Hier: required muss durchschlagen,
8
8
  // für jeden Field-Type.
9
9
 
10
- import { describe, expect, test } from "vitest";
10
+ import { describe, expect, test } from "bun:test";
11
11
  import {
12
12
  createBooleanField,
13
13
  createDateField,
@@ -24,25 +24,23 @@ import {
24
24
  createTzField,
25
25
  } from "../../engine";
26
26
  import type { ReferenceFieldDef } from "../../engine/types";
27
- import { buildDrizzleTable } from "../table-builder";
27
+ import { buildEntityTable } from "../table-builder";
28
28
 
29
29
  // Reference-fields haben keinen Factory-Helper — direkt-typed inline.
30
30
  function refField(args: Omit<ReferenceFieldDef, "type">): ReferenceFieldDef {
31
31
  return { type: "reference", ...args };
32
32
  }
33
33
 
34
- function colByName(table: ReturnType<typeof buildDrizzleTable>, dbName: string) {
35
- // Drizzle's PgTable proxies columns through both JS-prop-name and the
36
- // serialized "name" attribute. We need the underlying column.config to
37
- // read .notNull, which lives at runtime under the column instance. Simplest
38
- // robust path: iterate Object.values, match by name.
39
- for (const col of Object.values(table) as Array<{ name?: string; notNull?: boolean }>) {
40
- if (col && typeof col === "object" && col.name === dbName) return col;
34
+ function colByName(table: unknown, dbName: string) {
35
+ const cols = (table as { columns?: ReadonlyArray<{ name: string; notNull?: boolean }> }).columns;
36
+ if (!cols) throw new Error("Table has no columns metadata");
37
+ for (const c of cols) {
38
+ if (c.name === dbName) return { name: c.name, notNull: c.notNull };
41
39
  }
42
40
  throw new Error(`Column ${dbName} not found in table`);
43
41
  }
44
42
 
45
- describe("buildDrizzleTable — required: true → NOT NULL", () => {
43
+ describe("buildEntityTable — required: true → NOT NULL", () => {
46
44
  test("text field — required true makes column NOT NULL", () => {
47
45
  const entity = createEntity({
48
46
  fields: {
@@ -50,7 +48,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
50
48
  subtitle: createTextField({}),
51
49
  },
52
50
  });
53
- const tbl = buildDrizzleTable("widget", entity);
51
+ const tbl = buildEntityTable("widget", entity);
54
52
  expect(colByName(tbl, "title").notNull).toBe(true);
55
53
  expect(colByName(tbl, "subtitle").notNull).toBe(false);
56
54
  });
@@ -62,7 +60,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
62
60
  tag: createSelectField({ options: ["x"] as const }),
63
61
  },
64
62
  });
65
- const tbl = buildDrizzleTable("widget", entity);
63
+ const tbl = buildEntityTable("widget", entity);
66
64
  expect(colByName(tbl, "status").notNull).toBe(true);
67
65
  expect(colByName(tbl, "tag").notNull).toBe(false);
68
66
  });
@@ -74,7 +72,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
74
72
  optional: createNumberField({}),
75
73
  },
76
74
  });
77
- const tbl = buildDrizzleTable("widget", entity);
75
+ const tbl = buildEntityTable("widget", entity);
78
76
  expect(colByName(tbl, "count").notNull).toBe(true);
79
77
  expect(colByName(tbl, "optional").notNull).toBe(false);
80
78
  });
@@ -86,7 +84,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
86
84
  archived: createBooleanField({}),
87
85
  },
88
86
  });
89
- const tbl = buildDrizzleTable("widget", entity);
87
+ const tbl = buildEntityTable("widget", entity);
90
88
  expect(colByName(tbl, "active").notNull).toBe(true);
91
89
  // Default ohne required ergibt notNull (default macht Spalte never-null)
92
90
  expect(colByName(tbl, "archived").notNull).toBe(true);
@@ -99,7 +97,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
99
97
  assignee: refField({ entity: "user" }),
100
98
  },
101
99
  });
102
- const tbl = buildDrizzleTable("task", entity);
100
+ const tbl = buildEntityTable("task", entity);
103
101
  expect(colByName(tbl, "owner").notNull).toBe(true);
104
102
  expect(colByName(tbl, "assignee").notNull).toBe(false);
105
103
  });
@@ -115,7 +113,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
115
113
  zoneOpt: createTzField({}),
116
114
  },
117
115
  });
118
- const tbl = buildDrizzleTable("event", entity);
116
+ const tbl = buildEntityTable("event", entity);
119
117
  expect(colByName(tbl, "born_on").notNull).toBe(true);
120
118
  expect(colByName(tbl, "born_on_opt").notNull).toBe(false);
121
119
  expect(colByName(tbl, "observed_at").notNull).toBe(true);
@@ -131,7 +129,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
131
129
  dropoff: createLocatedTimestampField({}),
132
130
  },
133
131
  });
134
- const tbl = buildDrizzleTable("transport", entity);
132
+ const tbl = buildEntityTable("transport", entity);
135
133
  expect(colByName(tbl, "pickup_utc").notNull).toBe(true);
136
134
  expect(colByName(tbl, "pickup_tz").notNull).toBe(true);
137
135
  expect(colByName(tbl, "dropoff_utc").notNull).toBe(false);
@@ -156,7 +154,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
156
154
  }),
157
155
  },
158
156
  });
159
- const tbl = buildDrizzleTable("acl", entity);
157
+ const tbl = buildEntityTable("acl", entity);
160
158
  expect(colByName(tbl, "roles_default").notNull).toBe(true);
161
159
  expect(colByName(tbl, "roles_optional").notNull).toBe(true);
162
160
  expect(colByName(tbl, "roles_required").notNull).toBe(true);
@@ -170,7 +168,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
170
168
  metaOptional: createEmbeddedField({ note: { type: "text" } }, { required: false }),
171
169
  },
172
170
  });
173
- const tbl = buildDrizzleTable("widget", entity);
171
+ const tbl = buildEntityTable("widget", entity);
174
172
  expect(colByName(tbl, "meta").notNull).toBe(true);
175
173
  expect(colByName(tbl, "meta_optional").notNull).toBe(true);
176
174
  });
@@ -183,7 +181,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
183
181
  tagsOptional: refField({ entity: "tag", multiple: true, required: false }),
184
182
  },
185
183
  });
186
- const tbl = buildDrizzleTable("post", entity);
184
+ const tbl = buildEntityTable("post", entity);
187
185
  expect(colByName(tbl, "tags").notNull).toBe(true);
188
186
  expect(colByName(tbl, "tags_optional").notNull).toBe(true);
189
187
  });
@@ -195,7 +193,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
195
193
  discount: createMoneyField({}),
196
194
  },
197
195
  });
198
- const tbl = buildDrizzleTable("listing", entity);
196
+ const tbl = buildEntityTable("listing", entity);
199
197
  expect(colByName(tbl, "price").notNull).toBe(true);
200
198
  expect(colByName(tbl, "price_currency").notNull).toBe(true);
201
199
  expect(colByName(tbl, "discount").notNull).toBe(false);
@@ -209,7 +207,7 @@ describe("buildDrizzleTable — required: true → NOT NULL", () => {
209
207
  cover: createImageField({}),
210
208
  },
211
209
  });
212
- const tbl = buildDrizzleTable("profile", entity);
210
+ const tbl = buildEntityTable("profile", entity);
213
211
  expect(colByName(tbl, "avatar").notNull).toBe(true);
214
212
  expect(colByName(tbl, "cover").notNull).toBe(false);
215
213
  });