@cosmicdrift/kumiko-framework 1.0.0 → 2.0.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.
- package/README.md +9 -38
- package/package.json +21 -2
- package/src/__tests__/anonymous-access.integration.test.ts +185 -0
- package/src/__tests__/consumer-cli.integration.test.ts +172 -0
- package/src/__tests__/entity-permalink-open.integration.test.ts +94 -0
- package/src/__tests__/full-stack.integration.test.ts +1 -1
- package/src/__tests__/schema-cli-temporal-polyfill.test.ts +48 -0
- package/src/__tests__/schema-cli.integration.test.ts +50 -0
- package/src/__tests__/store-table.integration.test.ts +93 -0
- package/src/api/__tests__/api.test.ts +373 -0
- package/src/api/__tests__/auth-middleware-anonymous-access-boot.test.ts +40 -0
- package/src/api/__tests__/auth-routes-cookie.test.ts +17 -1
- package/src/api/__tests__/auth-routes-invalid-body-invite.test.ts +253 -0
- package/src/api/__tests__/auth-routes-mfa-preauth-confirm.test.ts +222 -0
- package/src/api/__tests__/auth-routes-mfa-preauth-enable-start.test.ts +249 -0
- package/src/api/__tests__/auth-routes-mfa-verify.test.ts +202 -0
- package/src/api/__tests__/auth-routes-trusted-proxy.test.ts +135 -0
- package/src/api/__tests__/batch.integration.test.ts +101 -11
- package/src/api/__tests__/csrf-constants-sync.test.ts +20 -0
- package/src/api/__tests__/dispatcher-live.integration.test.ts +74 -0
- package/src/api/__tests__/jwt.test.ts +200 -1
- package/src/api/__tests__/login-rate-limiter-sweep.test.ts +50 -0
- package/src/api/__tests__/pat-scope.test.ts +36 -0
- package/src/api/__tests__/pii-leak-guard.integration.test.ts +103 -0
- package/src/api/__tests__/redis-login-rate-limiter.integration.test.ts +138 -0
- package/src/api/__tests__/request-id-middleware.test.ts +51 -0
- package/src/api/__tests__/server-boot-guards.test.ts +71 -0
- package/src/api/__tests__/server-jwt-ttl.test.ts +58 -0
- package/src/api/__tests__/sse-broker.test.ts +57 -0
- package/src/api/__tests__/sse-route.test.ts +4 -0
- package/src/api/api-constants.ts +11 -0
- package/src/api/auth-middleware.ts +248 -40
- package/src/api/auth-routes.ts +576 -95
- package/src/api/index.ts +13 -4
- package/src/api/jwt.ts +170 -11
- package/src/api/pat-scope.ts +14 -0
- package/src/api/pii-leak-guard.ts +47 -0
- package/src/api/request-context.ts +3 -0
- package/src/api/request-id-middleware.ts +2 -0
- package/src/api/routes.ts +169 -2
- package/src/api/server.ts +112 -16
- package/src/api/sse-broker.ts +39 -0
- package/src/bun-db/__tests__/PATTERN.md +0 -1
- package/src/bun-db/__tests__/coerce-row-temporal.test.ts +41 -0
- package/src/bun-db/__tests__/select-many-retry.test.ts +79 -0
- package/src/bun-db/__tests__/write-brand.test.ts +21 -0
- package/src/bun-db/connection.ts +3 -3
- package/src/bun-db/index.ts +2 -0
- package/src/bun-db/query.ts +105 -32
- package/src/consumer-cli.ts +134 -0
- package/src/crypto/__tests__/blind-index.test.ts +130 -0
- package/src/crypto/__tests__/event-pii.test.ts +161 -0
- package/src/crypto/__tests__/kek-rotation.integration.test.ts +180 -0
- package/src/crypto/__tests__/kms-adapter-contract.ts +134 -0
- package/src/crypto/__tests__/kms-adapter.contract.test.ts +4 -0
- package/src/crypto/__tests__/pg-kms-adapter.integration.test.ts +117 -0
- package/src/crypto/__tests__/pii-field-encryption.test.ts +376 -0
- package/src/crypto/__tests__/request-kms-cache.test.ts +74 -0
- package/src/crypto/__tests__/subject-resolver.test.ts +108 -0
- package/src/crypto/blind-index.ts +118 -0
- package/src/crypto/event-pii.ts +70 -0
- package/src/crypto/in-memory-kms-adapter.ts +50 -0
- package/src/crypto/index.ts +67 -0
- package/src/crypto/kms-adapter.ts +2 -0
- package/src/crypto/pg-kms-adapter.ts +295 -0
- package/src/crypto/pii-field-encryption.ts +248 -0
- package/src/crypto/request-kms-cache.ts +38 -0
- package/src/crypto/subject-resolver.ts +91 -0
- package/src/db/__tests__/assert-no-unreachable-live-rows.integration.test.ts +191 -0
- package/src/db/__tests__/blind-index.integration.test.ts +248 -0
- package/src/db/__tests__/build-filter-where.test.ts +34 -0
- package/src/db/__tests__/collect-table-metas.test.ts +10 -10
- package/src/db/__tests__/config-seed.integration.test.ts +13 -5
- package/src/db/__tests__/dialect-instant.test.ts +1 -4
- package/src/db/__tests__/entity-field-encryption.test.ts +7 -7
- package/src/db/__tests__/entity-table-meta-source.test.ts +50 -0
- package/src/db/__tests__/event-store-executor-context.pii-roundtrip.test.ts +67 -0
- package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +402 -0
- package/src/db/__tests__/event-store-executor.integration.test.ts +299 -29
- package/src/db/__tests__/feature-table-sources.test.ts +34 -0
- package/src/db/__tests__/implicit-projection-equivalence.integration.test.ts +118 -39
- package/src/db/__tests__/instant-to-driver-temporal.test.ts +21 -0
- package/src/db/__tests__/located-timestamp.test.ts +19 -0
- package/src/db/__tests__/migrate-generator.test.ts +21 -0
- package/src/db/__tests__/migrate-runner.test.ts +61 -0
- package/src/db/__tests__/number-field-fractional.integration.test.ts +58 -0
- package/src/db/__tests__/rebuild-marker.test.ts +13 -3
- package/src/db/__tests__/replay-migration-sql.test.ts +384 -0
- package/src/db/__tests__/schema-inspection.test.ts +7 -0
- package/src/db/__tests__/schema-migration.integration.test.ts +1 -1
- package/src/db/__tests__/table-builder-meta-lockstep.test.ts +39 -0
- package/src/db/__tests__/tenant-db-where-merge.test.ts +49 -3
- package/src/db/__tests__/tenant-db.integration.test.ts +6 -2
- package/src/db/api.ts +2 -2
- package/src/db/apply-entity-event.ts +18 -14
- package/src/db/blind-index-cleanup.ts +55 -0
- package/src/db/bun-provider.ts +2 -2
- package/src/db/collect-table-metas.ts +6 -7
- package/src/db/config-seed.ts +9 -9
- package/src/db/connection.ts +7 -12
- package/src/db/cursor.ts +1 -18
- package/src/db/dialect.ts +20 -26
- package/src/db/entity-field-encryption.ts +81 -24
- package/src/db/entity-table-meta-types.ts +2 -0
- package/src/db/entity-table-meta.ts +63 -90
- package/src/db/event-store-executor-context.ts +404 -0
- package/src/db/event-store-executor-read.ts +275 -0
- package/src/db/event-store-executor-write.ts +644 -0
- package/src/db/event-store-executor.ts +28 -1155
- package/src/db/feature-table-sources.ts +6 -5
- package/src/db/index.ts +20 -3
- package/src/db/located-timestamp.ts +4 -0
- package/src/db/migrate-generator.ts +39 -6
- package/src/db/migrate-runner.ts +107 -11
- package/src/db/pg-error.ts +9 -1
- package/src/db/postgres-provider.ts +2 -2
- package/src/db/queries/__tests__/event-store-idempotency-index.integration.test.ts +80 -0
- package/src/db/queries/backfill-pii.ts +277 -0
- package/src/db/queries/ddl.ts +45 -0
- package/src/db/queries/event-consumer.ts +35 -2
- package/src/db/queries/event-store.ts +126 -19
- package/src/db/queries/projection-rebuild.ts +22 -8
- package/src/db/queries/shadow-swap.ts +183 -0
- package/src/db/queries/test-stack.ts +4 -30
- package/src/db/query-api.ts +1 -0
- package/src/db/query.ts +1 -0
- package/src/db/rebuild-marker.ts +18 -2
- package/src/db/reference-data.ts +2 -3
- package/src/db/replay-migration-sql.ts +257 -0
- package/src/db/schema-inspection.ts +1 -1
- package/src/db/table-builder.ts +102 -71
- package/src/db/tenant-db.ts +15 -53
- package/src/engine/__tests__/boot-validator-action-wiring.test.ts +242 -0
- package/src/engine/__tests__/boot-validator-boot-check.test.ts +99 -0
- package/src/engine/__tests__/boot-validator-dashboard.test.ts +237 -0
- package/src/engine/__tests__/boot-validator-entity-list.test.ts +104 -0
- package/src/engine/__tests__/boot-validator-gdpr-storage.test.ts +7 -69
- package/src/engine/__tests__/boot-validator-i18n-keys.test.ts +26 -5
- package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +3 -19
- package/src/engine/__tests__/boot-validator-pii-retention.test.ts +246 -4
- package/src/engine/__tests__/boot-validator.test.ts +219 -15
- package/src/engine/__tests__/build-app-schema.test.ts +82 -0
- package/src/engine/__tests__/build-config-feature-schema.test.ts +125 -0
- package/src/engine/__tests__/build-target.test.ts +3 -11
- package/src/engine/__tests__/codemod-pipeline.test.ts +152 -21
- package/src/engine/__tests__/config-helpers.test.ts +16 -0
- package/src/engine/__tests__/define-feature-entity-mapping.test.ts +6 -0
- package/src/engine/__tests__/define-roles.test.ts +21 -0
- package/src/engine/__tests__/engine.test.ts +163 -1
- package/src/engine/__tests__/entity-handlers.test.ts +80 -0
- package/src/engine/__tests__/event-migration-declarative.test.ts +65 -0
- package/src/engine/__tests__/event-type-map-augmentation.test.ts +24 -0
- package/src/engine/__tests__/extend-entity-projection.test.ts +123 -0
- package/src/engine/__tests__/factories-time.test.ts +2 -66
- package/src/engine/__tests__/feature-crud-shorthand.test.ts +28 -0
- package/src/engine/__tests__/feature-manifest.test.ts +31 -1
- package/src/engine/__tests__/field-access.test.ts +23 -1
- package/src/engine/__tests__/hook-phases.test.ts +5 -5
- package/src/engine/__tests__/membership-roles.test.ts +4 -10
- package/src/engine/__tests__/nav.test.ts +86 -1
- package/src/engine/__tests__/pipeline-engine.test.ts +9 -9
- package/src/engine/__tests__/pipeline-handler.integration.test.ts +18 -18
- package/src/engine/__tests__/pipeline-observability.integration.test.ts +2 -2
- package/src/engine/__tests__/pipeline-performance.integration.test.ts +3 -3
- package/src/engine/__tests__/pipeline-sub-pipelines.test.ts +9 -9
- package/src/engine/__tests__/post-query-hook.test.ts +7 -7
- package/src/engine/__tests__/registrar-object-form.test.ts +141 -0
- package/src/engine/__tests__/registry.test.ts +144 -0
- package/src/engine/__tests__/schema-builder.test.ts +18 -0
- package/src/engine/__tests__/screen.test.ts +147 -1
- package/src/engine/__tests__/soft-delete-cleanup.test.ts +3 -0
- package/src/engine/__tests__/store-table.test.ts +229 -0
- package/src/engine/__tests__/tier-resolver-extension.test.ts +19 -1
- package/src/engine/__tests__/{visual-tree-patterns.test.ts → tree-actions-patterns.test.ts} +7 -95
- package/src/engine/__tests__/validate-projection-allowlist.test.ts +15 -15
- package/src/engine/boot-validator/__tests__/config-deps.test.ts +92 -0
- package/src/engine/boot-validator/action-wiring.ts +149 -0
- package/src/engine/boot-validator/boot-check.ts +21 -0
- package/src/engine/boot-validator/config-deps.ts +40 -4
- package/src/engine/boot-validator/entity-handler.ts +20 -21
- package/src/engine/boot-validator/entity-list-screens.ts +88 -0
- package/src/engine/boot-validator/gdpr-storage.ts +0 -20
- package/src/engine/boot-validator/i18n-keys.ts +58 -4
- package/src/engine/boot-validator/index.ts +33 -12
- package/src/engine/boot-validator/nav.ts +125 -0
- package/src/engine/boot-validator/pii-retention.ts +95 -10
- package/src/engine/boot-validator/{screens-nav.ts → screens.ts} +214 -191
- package/src/engine/boot-validator/workspaces.ts +68 -0
- package/src/engine/build-app-schema.ts +16 -0
- package/src/engine/build-config-feature-schema.ts +44 -7
- package/src/engine/codemod/pipeline-codemod.ts +5 -5
- package/src/engine/config-helpers.ts +15 -0
- package/src/engine/constants.ts +32 -6
- package/src/engine/create-app.ts +11 -0
- package/src/engine/define-feature.ts +95 -947
- package/src/engine/define-handler.ts +28 -94
- package/src/engine/define-workflow.ts +1 -1
- package/src/engine/effective-features.ts +12 -2
- package/src/engine/entity-handlers.ts +76 -11
- package/src/engine/extensions/tenant-data.ts +19 -0
- package/src/engine/extensions/user-data.ts +29 -2
- package/src/engine/factories.ts +8 -49
- package/src/engine/feature-ast/__tests__/canonical-form.test.ts +26 -29
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/feature.ts +9 -0
- package/src/engine/feature-ast/__tests__/fixtures/cross-file-registrar/screens.ts +4 -0
- package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +1 -2
- package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +18 -8
- package/src/engine/feature-ast/__tests__/parse.test.ts +1640 -160
- package/src/engine/feature-ast/__tests__/patch.test.ts +206 -12
- package/src/engine/feature-ast/__tests__/patcher.test.ts +20 -23
- package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +380 -5
- package/src/engine/feature-ast/extractors/events.ts +322 -0
- package/src/engine/feature-ast/extractors/handlers.ts +234 -0
- package/src/engine/feature-ast/extractors/hooks.ts +243 -0
- package/src/engine/feature-ast/extractors/index.ts +34 -31
- package/src/engine/feature-ast/extractors/jobs-routes.ts +221 -0
- package/src/engine/feature-ast/extractors/projections-screens.ts +269 -0
- package/src/engine/feature-ast/extractors/round1.ts +3 -3
- package/src/engine/feature-ast/extractors/round5.ts +3 -3
- package/src/engine/feature-ast/extractors/round6.ts +2 -36
- package/src/engine/feature-ast/extractors/shared.ts +64 -6
- package/src/engine/feature-ast/index.ts +2 -4
- package/src/engine/feature-ast/parse.ts +130 -23
- package/src/engine/feature-ast/patch.ts +39 -50
- package/src/engine/feature-ast/patcher.ts +37 -38
- package/src/engine/feature-ast/patterns.ts +50 -62
- package/src/engine/feature-ast/render.ts +67 -44
- package/src/engine/feature-builder-state.ts +168 -0
- package/src/engine/feature-config-events-jobs.ts +403 -0
- package/src/engine/feature-entity-handlers.ts +208 -0
- package/src/engine/feature-manifest.ts +2 -1
- package/src/engine/feature-ui-extensions.ts +500 -0
- package/src/engine/field-access.ts +13 -2
- package/src/engine/field-helpers.ts +31 -0
- package/src/engine/handler-helpers.ts +26 -0
- package/src/engine/hook-helpers.ts +16 -0
- package/src/engine/index.ts +23 -7
- package/src/engine/membership-roles.ts +13 -0
- package/src/engine/object-form.ts +27 -0
- package/src/engine/ownership.ts +26 -79
- package/src/engine/pattern-library/__tests__/library.test.ts +7 -20
- package/src/engine/pattern-library/library.ts +44 -1152
- package/src/engine/pattern-library/mixed-schemas.ts +450 -0
- package/src/engine/pattern-library/opaque-schemas.ts +124 -0
- package/src/engine/pattern-library/shared-fields.ts +75 -0
- package/src/engine/pattern-library/static-schemas.ts +456 -0
- package/src/engine/pipeline.ts +6 -11
- package/src/engine/registry-facade.ts +362 -0
- package/src/engine/registry-ingest.ts +478 -0
- package/src/engine/registry-state.ts +388 -0
- package/src/engine/registry-validate.ts +642 -0
- package/src/engine/registry.ts +78 -1658
- package/src/engine/run-pipeline.ts +1 -1
- package/src/engine/schema-builder.ts +1 -0
- package/src/engine/screen-helpers.ts +54 -0
- package/src/engine/soft-delete-cleanup.ts +6 -2
- package/src/engine/steps/__tests__/duration-utils.test.ts +20 -0
- package/src/engine/steps/_duration-utils.ts +2 -0
- package/src/engine/steps/unsafe-projection-upsert.ts +1 -4
- package/src/engine/tier-resolver-extension.ts +3 -2
- package/src/engine/types/config.ts +2 -482
- package/src/engine/types/define-handler.ts +2 -0
- package/src/engine/types/entity-handlers.ts +2 -0
- package/src/engine/types/event-type-map.ts +1 -37
- package/src/engine/types/feature.ts +2 -972
- package/src/engine/types/fields.ts +2 -675
- package/src/engine/types/handlers.ts +2 -774
- package/src/engine/types/hooks.ts +2 -184
- package/src/engine/types/http-route.ts +1 -54
- package/src/engine/types/identifiers.ts +1 -47
- package/src/engine/types/index.ts +86 -40
- package/src/engine/types/nav.ts +2 -63
- package/src/engine/types/ownership.ts +2 -0
- package/src/engine/types/projection.ts +2 -138
- package/src/engine/types/relations.ts +1 -51
- package/src/engine/types/screen.ts +2 -574
- package/src/engine/types/step.ts +2 -334
- package/src/engine/types/target-ref.ts +1 -21
- package/src/engine/types/tree-node.ts +1 -132
- package/src/engine/types/workspace.ts +2 -49
- package/src/engine/validate-projection-allowlist.ts +6 -6
- package/src/entrypoint/__tests__/entrypoint-job-wiring.integration.test.ts +120 -1
- package/src/entrypoint/index.ts +49 -6
- package/src/errors/classes.ts +22 -1
- package/src/errors/field-issue.ts +0 -3
- package/src/errors/index.ts +1 -1
- package/src/errors/write-error-info.ts +10 -22
- package/src/es-ops/README.md +1 -1
- package/src/es-ops/__tests__/runner.integration.test.ts +74 -0
- package/src/es-ops/context.ts +4 -2
- package/src/es-ops/types.ts +8 -1
- package/src/event-store/__tests__/admin-api.integration.test.ts +27 -1
- package/src/event-store/__tests__/backfill-pii.integration.test.ts +279 -0
- package/src/event-store/__tests__/event-store.integration.test.ts +201 -0
- package/src/event-store/__tests__/row-to-stored-event.test.ts +2 -2
- package/src/event-store/__tests__/snapshot.integration.test.ts +86 -0
- package/src/event-store/__tests__/unscoped-stream-primitives.guard.test.ts +58 -0
- package/src/event-store/__tests__/upcaster.integration.test.ts +77 -45
- package/src/event-store/admin-api.ts +11 -4
- package/src/event-store/errors.ts +2 -35
- package/src/event-store/event-store.ts +64 -78
- package/src/event-store/events-schema.ts +11 -13
- package/src/event-store/index.ts +18 -3
- package/src/event-store/rebuild-dead-letter.ts +111 -0
- package/src/event-store/snapshot.ts +63 -40
- package/src/event-store/types.ts +2 -0
- package/src/files/__tests__/build-storage-key.test.ts +28 -0
- package/src/files/__tests__/file-ref-entity.test.ts +8 -0
- package/src/files/__tests__/files.integration.test.ts +24 -0
- package/src/files/__tests__/in-memory-provider.contract.test.ts +4 -0
- package/src/files/__tests__/local-provider.test.ts +31 -0
- package/src/files/__tests__/provider-resolver.test.ts +70 -0
- package/src/files/__tests__/write-stream.test.ts +13 -0
- package/src/files/file-handle.ts +2 -19
- package/src/files/file-ref-entity.ts +2 -2
- package/src/files/file-routes.ts +13 -0
- package/src/files/index.ts +1 -1
- package/src/files/local-provider.ts +27 -8
- package/src/files/provider-resolver.ts +31 -20
- package/src/files/types.ts +13 -55
- package/src/i18n/__tests__/required-surface-keys.test.ts +17 -0
- package/src/i18n/required-surface-keys.ts +120 -1
- package/src/jobs/__tests__/job-queue-depth.integration.test.ts +82 -0
- package/src/jobs/__tests__/jobs.integration.test.ts +329 -3
- package/src/jobs/job-runner.ts +82 -12
- package/src/logging/types.ts +1 -7
- package/src/migrations/pending-rebuilds.ts +1 -1
- package/src/observability/__tests__/observability.integration.test.ts +4 -1
- package/src/observability/__tests__/recording-tracer.test.ts +6 -4
- package/src/observability/index.ts +2 -0
- package/src/observability/noop-provider.ts +0 -9
- package/src/observability/recording-tracer.ts +0 -12
- package/src/observability/standard-metrics.ts +64 -2
- package/src/observability/types/index.ts +1 -29
- package/src/observability/types/metric.ts +1 -56
- package/src/observability/types/provider.ts +1 -32
- package/src/observability/types/span.ts +1 -64
- package/src/pipeline/__tests__/ctx-bridge.integration.test.ts +2 -2
- package/src/pipeline/__tests__/dispatcher.test.ts +366 -1
- package/src/pipeline/__tests__/event-consumer-state.integration.test.ts +31 -0
- package/src/pipeline/__tests__/event-dispatcher-delivery-max-attempts.test.ts +126 -0
- package/src/pipeline/__tests__/event-dispatcher-rearm.integration.test.ts +263 -0
- package/src/pipeline/__tests__/event-dispatcher.integration.test.ts +10 -0
- package/src/pipeline/__tests__/job-trigger-consumer.integration.test.ts +106 -0
- package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +308 -77
- package/src/pipeline/__tests__/load-aggregate-query.integration.test.ts +16 -8
- package/src/pipeline/__tests__/post-query-hook.integration.test.ts +3 -3
- package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +80 -2
- package/src/pipeline/__tests__/rebuild-poison-quarantine.integration.test.ts +274 -0
- package/src/pipeline/__tests__/try-append-event.integration.test.ts +166 -0
- package/src/pipeline/dispatch-batch.ts +187 -0
- package/src/pipeline/dispatch-query.ts +165 -0
- package/src/pipeline/dispatch-shared.ts +826 -0
- package/src/pipeline/dispatch-stream.ts +90 -0
- package/src/pipeline/dispatch-write.ts +451 -0
- package/src/pipeline/dispatcher-utils.ts +1 -1
- package/src/pipeline/dispatcher.ts +44 -1372
- package/src/pipeline/entity-cache.ts +2 -33
- package/src/pipeline/event-consumer-state.ts +30 -2
- package/src/pipeline/event-dispatcher-admin.ts +293 -0
- package/src/pipeline/event-dispatcher-delivery.ts +305 -0
- package/src/pipeline/event-dispatcher.ts +85 -542
- package/src/pipeline/index.ts +2 -0
- package/src/pipeline/msp-rebuild.ts +42 -3
- package/src/pipeline/multi-stream-apply-context.ts +4 -42
- package/src/pipeline/projection-rebuild.ts +105 -3
- package/src/pipeline/system-hooks.ts +144 -1
- package/src/rate-limit/__tests__/resolver.integration.test.ts +18 -0
- package/src/rate-limit/resolver.ts +16 -32
- package/src/schema-cli.ts +76 -16
- package/src/search/__tests__/meilisearch-adapter.integration.test.ts +207 -185
- package/src/search/__tests__/meilisearch-ids.test.ts +30 -0
- package/src/search/__tests__/reindex-entity.integration.test.ts +144 -0
- package/src/search/index.ts +6 -0
- package/src/search/meilisearch-adapter.ts +13 -12
- package/src/search/reindex-entity.ts +177 -0
- package/src/search/types.ts +1 -39
- package/src/secrets/__tests__/contains-secret.test.ts +34 -0
- package/src/secrets/__tests__/envelope-cipher.test.ts +59 -0
- package/src/secrets/__tests__/envelope.test.ts +1 -1
- package/src/secrets/dek-cache.ts +26 -5
- package/src/secrets/envelope-cipher.ts +53 -0
- package/src/secrets/envelope.ts +5 -3
- package/src/secrets/index.ts +13 -1
- package/src/secrets/stored-envelope.ts +46 -0
- package/src/secrets/types.ts +2 -162
- package/src/stack/__tests__/event-collector.test.ts +42 -0
- package/src/stack/__tests__/setup-test-stack-jobs.integration.test.ts +125 -0
- package/src/stack/db.ts +2 -1
- package/src/stack/push-entity-projection-tables.ts +4 -3
- package/src/stack/redis.ts +8 -0
- package/src/stack/request-helper.ts +38 -2
- package/src/stack/table-helpers.ts +6 -4
- package/src/stack/test-stack.ts +249 -131
- package/src/testing/__tests__/late-bound.test.ts +32 -0
- package/src/testing/__tests__/wait-for.test.ts +59 -0
- package/src/testing/boot-validator-fixture.ts +121 -0
- package/src/testing/e2e-generator.ts +8 -0
- package/src/testing/file-provider-contract.ts +104 -0
- package/src/testing/handler-context.ts +3 -1
- package/src/testing/index.ts +5 -0
- package/src/testing/late-bound.ts +5 -3
- package/src/testing/mutable-master-key-provider.ts +29 -3
- package/src/testing/wait-for.ts +3 -0
- package/src/testing/without-ambient-temporal.ts +14 -0
- package/src/time/__tests__/tz-dateline.test.ts +8 -10
- package/src/time/geo-tz.ts +1 -32
- package/src/time/index.ts +1 -0
- package/src/time/legacy-date.ts +18 -0
- package/src/time/polyfill.ts +21 -38
- package/src/time/tz-context.ts +44 -85
- package/src/ui-types/app-schema.ts +12 -0
- package/src/ui-types/index.ts +20 -7
- package/src/utils/__tests__/safe-json-temporal.test.ts +18 -0
- package/src/utils/safe-json.ts +13 -1
- package/src/__tests__/raw-table.integration.test.ts +0 -116
- package/src/bun-db/__tests__/bun-test-stack.ts +0 -6
- package/src/db/__tests__/encryption.test.ts +0 -39
- package/src/db/encryption.ts +0 -39
- package/src/db/row-helpers.ts +0 -4
- package/src/engine/__tests__/raw-table.test.ts +0 -150
- package/src/engine/__tests__/unmanaged-table.test.ts +0 -127
- package/src/engine/feature-ast/__tests__/visual-tree-parse.test.ts +0 -184
- package/src/engine/feature-ast/extractors/round4.ts +0 -1366
|
@@ -1,138 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import type { StoredEvent } from "../../event-store/event-store";
|
|
4
|
-
import type { MultiStreamApplyContext } from "../../pipeline/multi-stream-apply-context";
|
|
5
|
-
import type { RunIn } from "./config";
|
|
6
|
-
|
|
7
|
-
// Drizzle pgTable shape — projections hand their table through to apply() so
|
|
8
|
-
// user code writes upserts/updates directly instead of going through a
|
|
9
|
-
// framework-managed state reducer. Using Drizzle's own `PgTableWithColumns<any>`
|
|
10
|
-
// (re-exported as TableColumns) keeps typing honest: drizzle's typed paths work
|
|
11
|
-
// inside apply(), but the column union is erased so framework code doesn't need
|
|
12
|
-
// to know the schema shape of every user table.
|
|
13
|
-
// biome-ignore lint/suspicious/noExplicitAny: Drizzle's PgTable generic needs a concrete row shape; we erase it on purpose because the framework does not know user-defined column types.
|
|
14
|
-
export type ProjectionTable = TableColumns<any>;
|
|
15
|
-
|
|
16
|
-
// Single-stream projection apply: runs inline in the write-TX of the event
|
|
17
|
-
// it projects. Gets the event, the TX-scoped DbRunner, and the projection's
|
|
18
|
-
// own `table` (already erased to ProjectionTable). Write through THAT table —
|
|
19
|
-
// it is the only ES-blessed write into a managed projection outside the
|
|
20
|
-
// executor, and it is reachable only here (an arbitrary handler has no such
|
|
21
|
-
// arg), so the write-brand cannot be bypassed by closing over the branded
|
|
22
|
-
// table constant. Inline projections must not spawn further events (no ctx)
|
|
23
|
-
// because they run inside the command's transaction and the framework
|
|
24
|
-
// guarantees a single commit boundary per command.
|
|
25
|
-
//
|
|
26
|
-
// Generic über payload-shape. Default = Record<string, unknown> behält
|
|
27
|
-
// rückwärtskompatibles Verhalten; Konkrete Apply-Handler annotieren
|
|
28
|
-
// `SingleStreamApplyFn<MyPayload>` für typed event.payload-Access. Der
|
|
29
|
-
// `table`-Param ist additiv — 2-arg-Applies (event, tx) bleiben gültig.
|
|
30
|
-
export type SingleStreamApplyFn<TPayload = Record<string, unknown>> = (
|
|
31
|
-
event: StoredEvent<TPayload>,
|
|
32
|
-
tx: DbRunner,
|
|
33
|
-
table: ProjectionTable,
|
|
34
|
-
) => Promise<void>;
|
|
35
|
-
|
|
36
|
-
// Multi-stream projection apply: runs asynchronously via the event-dispatcher
|
|
37
|
-
// with its own cursor. Gets the event, tx, and a ctx surface for emitting
|
|
38
|
-
// follow-up events (saga / process-manager pattern). ctx.appendEvent +
|
|
39
|
-
// ctx.loadAggregate are the Marten-equivalent of IProjectionSession — write
|
|
40
|
-
// cross-aggregate reactions here, not in single-stream projections.
|
|
41
|
-
export type MultiStreamApplyFn<TPayload = Record<string, unknown>> = (
|
|
42
|
-
event: StoredEvent<TPayload>,
|
|
43
|
-
tx: DbRunner,
|
|
44
|
-
ctx: MultiStreamApplyContext,
|
|
45
|
-
) => Promise<void>;
|
|
46
|
-
|
|
47
|
-
export type ProjectionDefinition = {
|
|
48
|
-
readonly name: string;
|
|
49
|
-
// One or more entity names whose events feed this projection. Event-types
|
|
50
|
-
// are matched in `apply` (e.g. "unit.created") — `source` is only used to
|
|
51
|
-
// index projections so the executor doesn't scan all projections on every
|
|
52
|
-
// write.
|
|
53
|
-
readonly source: string | readonly string[];
|
|
54
|
-
// Drizzle-table the projection materializes into. User owns the schema —
|
|
55
|
-
// framework just guarantees the TX and event delivery.
|
|
56
|
-
readonly table: ProjectionTable;
|
|
57
|
-
// Keyed by fully-qualified event type ("<aggregate>.<verb>", e.g. "unit.created").
|
|
58
|
-
// Missing keys are silently skipped — a projection declares only the events it
|
|
59
|
-
// cares about.
|
|
60
|
-
readonly apply: Readonly<Record<string, SingleStreamApplyFn>>;
|
|
61
|
-
// Auto-registered projection (one per r.entity) that exists ONLY to
|
|
62
|
-
// make rebuildProjection work for entity-tables. Live writes go through
|
|
63
|
-
// the EventStoreExecutor directly — firing the implicit apply inline
|
|
64
|
-
// would double-write into the same table. The inline-projection-runner
|
|
65
|
-
// skips entries with this flag; rebuildProjection treats them
|
|
66
|
-
// identically to explicit projections.
|
|
67
|
-
readonly isImplicit?: boolean;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// Per-lifecycle error policy for a MultiStreamProjection. Mirrors Marten's
|
|
71
|
-
// Projections.Errors / Projections.RebuildErrors split — a projection can
|
|
72
|
-
// be lenient during steady-state delivery but strict during rebuild (or
|
|
73
|
-
// vice versa).
|
|
74
|
-
export type MspErrorPolicy = {
|
|
75
|
-
// When the apply handler throws: log the error, advance the cursor past
|
|
76
|
-
// the offending event, and keep delivering. Default false — current
|
|
77
|
-
// strict behaviour: retry up to maxAttempts, then mark the consumer
|
|
78
|
-
// status="dead" and pause delivery. Use for best-effort sinks
|
|
79
|
-
// (notifications, webhooks) where a single bad event should not stall
|
|
80
|
-
// the whole consumer.
|
|
81
|
-
readonly skipApplyErrors?: boolean;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export type MspErrorMode = {
|
|
85
|
-
// Applied during steady-state dispatcher delivery.
|
|
86
|
-
readonly continuous?: MspErrorPolicy;
|
|
87
|
-
// Applied during rebuildProjection() / backfill passes. When omitted,
|
|
88
|
-
// rebuild inherits continuous — explicit override common for "strict
|
|
89
|
-
// during rebuild, lenient in production" patterns.
|
|
90
|
-
readonly rebuild?: MspErrorPolicy;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// Marten-style MultiStreamProjection: aggregates events from many streams
|
|
94
|
-
// into one cross-cutting read-model. Unlike ProjectionDefinition (single-
|
|
95
|
-
// source, inline in the write-TX), an MSP is ASYNC — the event-dispatcher
|
|
96
|
-
// picks events off the log via its own cursor. Handlers MUST be idempotent
|
|
97
|
-
// because the dispatcher guarantees at-least-once delivery.
|
|
98
|
-
//
|
|
99
|
-
// Use for Sagas / process managers, customer-centric views that span
|
|
100
|
-
// multiple aggregate types, cross-feature aggregations, audit logs. With
|
|
101
|
-
// `table` omitted, the MSP becomes a pure side-effect consumer — sending
|
|
102
|
-
// notifications, posting webhooks, updating an external system. Marten's
|
|
103
|
-
// equivalent of a subscription / event listener, without a separate API.
|
|
104
|
-
export type MultiStreamProjectionDefinition = {
|
|
105
|
-
readonly name: string;
|
|
106
|
-
// Optional: omit for side-effect-only handlers (notifications, external
|
|
107
|
-
// system sync). When present, setupTestStack auto-pushes the table.
|
|
108
|
-
readonly table?: ProjectionTable;
|
|
109
|
-
// Keyed by fully-qualified event type. Unlike a single-stream projection,
|
|
110
|
-
// there is no source-entity hint — the MSP declares the event types it
|
|
111
|
-
// cares about directly. Extract the identity/grouping key inside the
|
|
112
|
-
// apply handler from the event payload.
|
|
113
|
-
readonly apply: Readonly<Record<string, MultiStreamApplyFn>>;
|
|
114
|
-
// How the dispatcher handles apply-throws. Default strict (retry + dead).
|
|
115
|
-
readonly errorMode?: MspErrorMode;
|
|
116
|
-
// Which deploy-lane runs this MSP's dispatcher. Default "worker". MSPs
|
|
117
|
-
// share a single consumer-row per MSP name with SKIP LOCKED, so "both"
|
|
118
|
-
// is safe semantically (API + Worker race for each event; exactly one
|
|
119
|
-
// wins). Use "api" for MSPs that need in-process state on the API
|
|
120
|
-
// (rare); use "both" only when genuinely load-balancing is helpful.
|
|
121
|
-
readonly runIn?: RunIn;
|
|
122
|
-
// Delivery semantics across multi-instance deploys:
|
|
123
|
-
// "shared" (default) — one cursor across all dispatcher instances,
|
|
124
|
-
// SKIP LOCKED serialises; each event delivered exactly
|
|
125
|
-
// once globally. The right choice for side-effects with
|
|
126
|
-
// any downstream state: notifications, external APIs,
|
|
127
|
-
// projection tables, audit rows.
|
|
128
|
-
// "per-instance" — one cursor PER dispatcher instance, so every process
|
|
129
|
-
// delivers every event. Required for push-to-local-
|
|
130
|
-
// subscribers (SSE, in-memory caches): a split-deploy
|
|
131
|
-
// where API instance B emits an event that API instance
|
|
132
|
-
// A's clients also need to see. Handler MUST be
|
|
133
|
-
// side-effect-free relative to the DB — it only reaches
|
|
134
|
-
// in-process structures — otherwise each instance
|
|
135
|
-
// writes duplicate rows. Misuse = duplicated side
|
|
136
|
-
// effects, not a safety property.
|
|
137
|
-
readonly delivery?: "shared" | "per-instance";
|
|
138
|
-
};
|
|
1
|
+
// Legacy path — re-exported for callers still importing this module directly.
|
|
2
|
+
export type * from "@cosmicdrift/kumiko-types/projection";
|
|
@@ -1,51 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// --- Relations ---
|
|
4
|
-
|
|
5
|
-
export type BelongsToRelation = {
|
|
6
|
-
readonly type: "belongsTo";
|
|
7
|
-
readonly target: string;
|
|
8
|
-
readonly foreignKey: string;
|
|
9
|
-
readonly searchInclude?: readonly string[];
|
|
10
|
-
// onDelete is declared on the parent-side (hasMany / manyToMany) because
|
|
11
|
-
// that's where the "what happens to my children?" decision lives. A
|
|
12
|
-
// belongsTo node just points at a parent — the parent's onDelete drives
|
|
13
|
-
// the cleanup.
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export type HasManyRelation = {
|
|
17
|
-
readonly type: "hasMany";
|
|
18
|
-
readonly target: string;
|
|
19
|
-
readonly foreignKey: string;
|
|
20
|
-
readonly onDelete?: OnDeleteStrategy;
|
|
21
|
-
// When true, a nested payload under this relation's key (e.g.
|
|
22
|
-
// `{ tasks: [{ ... }] }` on a `project:create` write) is auto-expanded
|
|
23
|
-
// into child writes: parent first, then one child-write per entry with
|
|
24
|
-
// the foreign key set to the parent's new id — all in the same TX.
|
|
25
|
-
// Opt-in (default false) so legacy hasMany relations that were declared
|
|
26
|
-
// purely for cascade-delete or UI-nav semantics don't silently gain a
|
|
27
|
-
// client-writable path. Children are never inferred from payload-shape
|
|
28
|
-
// alone; only relations with this flag unlock nested-write.
|
|
29
|
-
//
|
|
30
|
-
// Scope v1: depth=1, create-only, hasMany-only. Update-nested,
|
|
31
|
-
// delete-nested, and belongsTo/m2m auto-expansion are explicit future
|
|
32
|
-
// work — when they arrive, they'll take the same flag so the opt-in
|
|
33
|
-
// stays a single, consistent surface.
|
|
34
|
-
readonly nestedWrite?: boolean;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export type ManyToManyRelation = {
|
|
38
|
-
readonly type: "manyToMany";
|
|
39
|
-
readonly target: string;
|
|
40
|
-
readonly through: {
|
|
41
|
-
readonly table: string;
|
|
42
|
-
readonly sourceKey: string;
|
|
43
|
-
readonly targetKey: string;
|
|
44
|
-
};
|
|
45
|
-
readonly searchInclude?: readonly string[];
|
|
46
|
-
readonly onDelete?: OnDeleteStrategy;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export type RelationDefinition = BelongsToRelation | HasManyRelation | ManyToManyRelation;
|
|
50
|
-
|
|
51
|
-
export type EntityRelations = Readonly<Record<string, RelationDefinition>>;
|
|
1
|
+
export type * from "@cosmicdrift/kumiko-types/relations";
|