@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
package/src/engine/index.ts
CHANGED
|
@@ -6,7 +6,6 @@ export {
|
|
|
6
6
|
validateAppCustomScreenWriteQns,
|
|
7
7
|
validateBoot,
|
|
8
8
|
} from "./boot-validator";
|
|
9
|
-
export { validateExtensionPreSaveWiring } from "./boot-validator/entity-handler";
|
|
10
9
|
export { type BuildAppSchemaOptions, buildAppSchema } from "./build-app-schema";
|
|
11
10
|
export type { ConfigFeatureSchema } from "./build-config-feature-schema";
|
|
12
11
|
export {
|
|
@@ -24,6 +23,7 @@ export {
|
|
|
24
23
|
createTenantSeed,
|
|
25
24
|
createUserConfig,
|
|
26
25
|
createUserSeed,
|
|
26
|
+
isEncryptedAtRest,
|
|
27
27
|
} from "./config-helpers";
|
|
28
28
|
export type { SystemHookName } from "./constants";
|
|
29
29
|
export {
|
|
@@ -42,6 +42,7 @@ export { crossTenantOverrideDenied } from "./cross-tenant";
|
|
|
42
42
|
export { defineFeature } from "./define-feature";
|
|
43
43
|
export type {
|
|
44
44
|
QueryHandlerDefinition,
|
|
45
|
+
StreamHandlerDefinition,
|
|
45
46
|
WriteHandlerDefinition,
|
|
46
47
|
WriteHandlerInput,
|
|
47
48
|
} from "./define-handler";
|
|
@@ -51,7 +52,7 @@ export { defineStep, getStep, listStepKinds } from "./define-step";
|
|
|
51
52
|
export type { WorkflowDefinition, WorkflowInput, WorkflowTrigger } from "./define-workflow";
|
|
52
53
|
export { computeDefinitionFingerprint, defineWorkflow } from "./define-workflow";
|
|
53
54
|
export type { ToggleReader } from "./effective-features";
|
|
54
|
-
export { computeEffectiveFeatures } from "./effective-features";
|
|
55
|
+
export { computeEffectiveFeatures, isToggleableFeature } from "./effective-features";
|
|
55
56
|
export {
|
|
56
57
|
createEntityExecutor,
|
|
57
58
|
defineEntityCreateHandler,
|
|
@@ -67,6 +68,9 @@ export {
|
|
|
67
68
|
defineEntityUpdateHandler,
|
|
68
69
|
defineEntityWriteHandler,
|
|
69
70
|
defineProjectionQueryHandler,
|
|
71
|
+
type EntityCrudRegistrar,
|
|
72
|
+
type RegisterEntityCrudOptions,
|
|
73
|
+
registerEntityCrud,
|
|
70
74
|
} from "./entity-handlers";
|
|
71
75
|
export type { EmitCtx } from "./event-helpers";
|
|
72
76
|
export { emitEvent, typedPayload } from "./event-helpers";
|
|
@@ -82,6 +86,11 @@ export {
|
|
|
82
86
|
EXT_USER_DATA_ORDER,
|
|
83
87
|
FILE_PROVIDER_CONFIG_KEY,
|
|
84
88
|
} from "./extension-names";
|
|
89
|
+
export type {
|
|
90
|
+
TenantDataDestroyHook,
|
|
91
|
+
TenantDataExtensionHooks,
|
|
92
|
+
TenantDataHookCtx,
|
|
93
|
+
} from "./extensions/tenant-data";
|
|
85
94
|
export type {
|
|
86
95
|
TenantUserModel,
|
|
87
96
|
UserDataDeleteHook,
|
|
@@ -114,7 +123,6 @@ export {
|
|
|
114
123
|
createTextField,
|
|
115
124
|
createTimestampField,
|
|
116
125
|
createTzField,
|
|
117
|
-
locatedTimestamp,
|
|
118
126
|
} from "./factories";
|
|
119
127
|
// AST inspection + patching pipeline — used by the CLI scaffolder, the
|
|
120
128
|
// Designer (C5/C6), and the AI-Builder (L2). See feature-ast/index.ts
|
|
@@ -170,15 +178,22 @@ export {
|
|
|
170
178
|
checkWriteFieldRoles,
|
|
171
179
|
filterReadFields,
|
|
172
180
|
} from "./field-access";
|
|
181
|
+
export { resolveName, withResponseData } from "./handler-helpers";
|
|
182
|
+
// findForbiddenMembershipRole/isForbiddenMembershipRole/
|
|
183
|
+
// stripForbiddenMembershipRoles/buildSessionRoles are Public API for host
|
|
184
|
+
// apps that build their own membership handlers. FORBIDDEN_MEMBERSHIP_ROLES
|
|
185
|
+
// itself stays internal (637/3) — exporting the raw Set would make its
|
|
186
|
+
// representation a semver promise; the predicate functions are the intended
|
|
187
|
+
// surface.
|
|
173
188
|
export {
|
|
174
|
-
|
|
189
|
+
buildSessionRoles,
|
|
175
190
|
findForbiddenMembershipRole,
|
|
176
191
|
isForbiddenMembershipRole,
|
|
177
192
|
stripForbiddenMembershipRoles,
|
|
178
193
|
} from "./membership-roles";
|
|
179
194
|
export type { OwnershipClause, OwnershipMap, OwnershipRef, OwnershipRule } from "./ownership";
|
|
180
195
|
export { from } from "./ownership";
|
|
181
|
-
export { buildPipelineSteps,
|
|
196
|
+
export { buildPipelineSteps, stepsPipeline } from "./pipeline";
|
|
182
197
|
export { defineApply, defineMspApply, setFields } from "./projection-helpers";
|
|
183
198
|
export type { BuiltinQnType, ParsedQn, QnType } from "./qualified-name";
|
|
184
199
|
export { isValidQn, parseQn, QnTypes, qn, toKebab } from "./qualified-name";
|
|
@@ -190,6 +205,7 @@ export { runsInLane } from "./run-in";
|
|
|
190
205
|
export type { StepListOutcome } from "./run-pipeline";
|
|
191
206
|
export { runPipeline, runStepList } from "./run-pipeline";
|
|
192
207
|
export { buildInsertSchema, buildUpdateSchema, fieldToZod } from "./schema-builder";
|
|
208
|
+
export { isExtensionEditSection, normalizeEditField, normalizeListColumn } from "./screen-helpers";
|
|
193
209
|
export type { TransitionGraph } from "./state-machine";
|
|
194
210
|
export { defineTransitions, guardTransition } from "./state-machine";
|
|
195
211
|
export {
|
|
@@ -349,6 +365,8 @@ export type {
|
|
|
349
365
|
SecretKeyHandle,
|
|
350
366
|
SelectFieldDef,
|
|
351
367
|
SessionUser,
|
|
368
|
+
StreamHandlerDef,
|
|
369
|
+
StreamHandlerFn,
|
|
352
370
|
Subscribe,
|
|
353
371
|
TargetRef,
|
|
354
372
|
TenantId,
|
|
@@ -372,9 +390,7 @@ export type {
|
|
|
372
390
|
WriteResult,
|
|
373
391
|
} from "./types";
|
|
374
392
|
export { DEFAULT_CURRENCIES, HookPhases } from "./types";
|
|
375
|
-
export { resolveName, withResponseData } from "./types/handlers";
|
|
376
393
|
export { isSystemTenant, parseTenantId, SYSTEM_TENANT_ID } from "./types/identifiers";
|
|
377
|
-
export { isExtensionEditSection, normalizeEditField, normalizeListColumn } from "./types/screen";
|
|
378
394
|
export type {
|
|
379
395
|
PipelineBuildCtx,
|
|
380
396
|
PipelineCtx,
|
|
@@ -30,3 +30,16 @@ export function findForbiddenMembershipRole(roles: readonly string[]): string |
|
|
|
30
30
|
export function stripForbiddenMembershipRoles(roles: readonly string[]): readonly string[] {
|
|
31
31
|
return roles.filter((role) => !isForbiddenMembershipRole(role));
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
// Single mint path for session roles: merges globalRoles with the stripped
|
|
35
|
+
// membership portion and dedupes. Every place that builds a session's roles
|
|
36
|
+
// from a membership should go through this instead of repeating
|
|
37
|
+
// `new Set([...globalRoles, ...stripForbiddenMembershipRoles(x)])` — a new
|
|
38
|
+
// mint site that forgets the strip is exactly the bug class this guards
|
|
39
|
+
// against.
|
|
40
|
+
export function buildSessionRoles(
|
|
41
|
+
globalRoles: readonly string[],
|
|
42
|
+
membershipRoles: readonly string[],
|
|
43
|
+
): readonly string[] {
|
|
44
|
+
return Array.from(new Set([...globalRoles, ...stripForbiddenMembershipRoles(membershipRoles)]));
|
|
45
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Shared helper for registrar methods that accept an Object-Form call
|
|
2
|
+
// (`r.entity({ name: "item", ... })`) alongside the classic positional form
|
|
3
|
+
// (`r.entity("item", { ... })`). Object-Form is the shape the feature-ast
|
|
4
|
+
// renderer emits for Designer/AI-generated code — a single object argument
|
|
5
|
+
// with named fields is easier to generate correctly than positional args
|
|
6
|
+
// whose count/order vary per method.
|
|
7
|
+
export function splitNamedDefinition<T extends { readonly name: string }>(
|
|
8
|
+
definition: T,
|
|
9
|
+
): [string, Omit<T, "name">] {
|
|
10
|
+
const { name, ...rest } = definition;
|
|
11
|
+
return [name, rest];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Shared helper for registrar methods that accept either variadic strings
|
|
15
|
+
// (hand-written call sites) or a single Object-Form object wrapping the
|
|
16
|
+
// same string array under `key` (the feature-ast renderer's canonical
|
|
17
|
+
// shape for Designer/AI-generated code).
|
|
18
|
+
export function unwrapArrayForm<K extends string>(
|
|
19
|
+
args: readonly [Record<K, readonly string[]>] | readonly string[],
|
|
20
|
+
key: K,
|
|
21
|
+
): readonly string[] {
|
|
22
|
+
const [first] = args;
|
|
23
|
+
if (typeof first === "object" && first !== null && key in first) {
|
|
24
|
+
return (first as Record<K, readonly string[]>)[key];
|
|
25
|
+
}
|
|
26
|
+
return args as readonly string[];
|
|
27
|
+
}
|
package/src/engine/ownership.ts
CHANGED
|
@@ -17,67 +17,35 @@
|
|
|
17
17
|
// Construction: use the `from(ref, column?)` helper. It returns a FromRule
|
|
18
18
|
// ready to drop into an access map.
|
|
19
19
|
|
|
20
|
+
import {
|
|
21
|
+
KUMIKO_COLUMNS_SYMBOL,
|
|
22
|
+
KUMIKO_NAME_SYMBOL,
|
|
23
|
+
} from "@cosmicdrift/kumiko-types/schema-table-types";
|
|
20
24
|
import { toSnakeCase } from "../db/table-builder";
|
|
21
25
|
import type { SessionUser } from "./types";
|
|
22
26
|
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
export type FromRuleKind = "user" | "claim";
|
|
46
|
-
|
|
47
|
-
export type FromRule = {
|
|
48
|
-
readonly kind: "from";
|
|
49
|
-
readonly refKind: FromRuleKind;
|
|
50
|
-
// For "user:id" → "id"; for "user:tenantId" → "tenantId".
|
|
51
|
-
// For "claim:<featureName>:<key>" → "<featureName>:<key>" (the full QN,
|
|
52
|
-
// which is exactly the key under which the JWT stores the value).
|
|
53
|
-
readonly refPath: string;
|
|
54
|
-
// Row-column to match against. For claim rules defaults to the claim's
|
|
55
|
-
// shortName (second segment of the claim QN). For user-rules the column
|
|
56
|
-
// is always explicit.
|
|
57
|
-
readonly column: string;
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
// Context passed to a WhereRule escape-hatch. The author returns a SqlFragment
|
|
61
|
-
// whose placeholders start at `paramStart` ($N, $N+1, ...); the framework
|
|
62
|
-
// concatenates the fragment into the larger query.
|
|
63
|
-
export type WhereRuleContext<TTable = unknown> = {
|
|
64
|
-
readonly table: TTable;
|
|
65
|
-
readonly tableName: string;
|
|
66
|
-
readonly paramStart: number;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export type WhereRule<TTable = unknown> = {
|
|
70
|
-
readonly kind: "where";
|
|
71
|
-
readonly where: (user: SessionUser, ctx: WhereRuleContext<TTable>) => SqlFragment;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// "all" collapses to a primitive so map authors can write `Admin: "all"`
|
|
75
|
-
// without importing a helper.
|
|
76
|
-
export type OwnershipRule = "all" | FromRule | WhereRule;
|
|
77
|
-
|
|
78
|
-
// Per-role map: every key is a role name, value is the rule that role
|
|
79
|
-
// satisfies to pass the access check.
|
|
80
|
-
export type OwnershipMap = Readonly<Record<string, OwnershipRule>>;
|
|
27
|
+
// Types live in engine/types/ownership.ts (no runtime dependency); re-exported
|
|
28
|
+
// here for backwards compatibility with existing importers of this file.
|
|
29
|
+
export type {
|
|
30
|
+
FromRule,
|
|
31
|
+
FromRuleKind,
|
|
32
|
+
OwnershipClause,
|
|
33
|
+
OwnershipMap,
|
|
34
|
+
OwnershipRef,
|
|
35
|
+
OwnershipRule,
|
|
36
|
+
SqlFragment,
|
|
37
|
+
WhereRule,
|
|
38
|
+
WhereRuleContext,
|
|
39
|
+
} from "./types/ownership";
|
|
40
|
+
|
|
41
|
+
import type {
|
|
42
|
+
FromRule,
|
|
43
|
+
OwnershipClause,
|
|
44
|
+
OwnershipMap,
|
|
45
|
+
OwnershipRef,
|
|
46
|
+
OwnershipRule,
|
|
47
|
+
SqlFragment,
|
|
48
|
+
} from "./types/ownership";
|
|
81
49
|
|
|
82
50
|
// Parse an OwnershipRef into kind + resolved path + default column.
|
|
83
51
|
// Throws on malformed input so the error surfaces at `from()`-call-site (in
|
|
@@ -254,30 +222,9 @@ export function userCanCreateFieldRow(
|
|
|
254
222
|
return false;
|
|
255
223
|
}
|
|
256
224
|
|
|
257
|
-
// Result of buildOwnershipClause. The discriminant lets the caller handle
|
|
258
|
-
// the three outcomes without inspecting SQL internals:
|
|
259
|
-
//
|
|
260
|
-
// "pass" → user is unrestricted. Run the query as-is.
|
|
261
|
-
// "empty" → user has a role mapped but no rule accepts any row (missing
|
|
262
|
-
// claim, empty array, role not in map). Skip the DB call entirely
|
|
263
|
-
// — returning [] is equivalent and avoids a pointless roundtrip.
|
|
264
|
-
// "sql" → apply the parameterised fragment as an AND on the query.
|
|
265
|
-
// Caller is responsible for renumbering placeholders when
|
|
266
|
-
// concatenating with other fragments (see `shiftParams` below).
|
|
267
|
-
//
|
|
268
|
-
// "empty" vs. "pass" is the critical distinction for a safe default:
|
|
269
|
-
// undefined/pass = allow, empty = deny-by-construction.
|
|
270
|
-
export type OwnershipClause =
|
|
271
|
-
| { readonly kind: "pass" }
|
|
272
|
-
| { readonly kind: "empty" }
|
|
273
|
-
| { readonly kind: "sql"; readonly sqlText: string; readonly params: readonly unknown[] };
|
|
274
|
-
|
|
275
225
|
const PASS_CLAUSE: OwnershipClause = { kind: "pass" };
|
|
276
226
|
const EMPTY_CLAUSE: OwnershipClause = { kind: "empty" };
|
|
277
227
|
|
|
278
|
-
const KUMIKO_NAME_SYMBOL = Symbol.for("kumiko:schema:Name");
|
|
279
|
-
const KUMIKO_COLUMNS_SYMBOL = Symbol.for("kumiko:schema:Columns");
|
|
280
|
-
|
|
281
228
|
function tableNameOf(table: unknown): string {
|
|
282
229
|
if (table !== null && typeof table === "object") {
|
|
283
230
|
const sym = (table as Record<symbol, unknown>)[KUMIKO_NAME_SYMBOL];
|
|
@@ -46,8 +46,8 @@ const ALL_KINDS: FeaturePatternKind[] = [
|
|
|
46
46
|
"screen",
|
|
47
47
|
"writeHandler",
|
|
48
48
|
"queryHandler",
|
|
49
|
+
"streamHandler",
|
|
49
50
|
"hook",
|
|
50
|
-
"entityHook",
|
|
51
51
|
"job",
|
|
52
52
|
"notification",
|
|
53
53
|
"authClaims",
|
|
@@ -55,12 +55,10 @@ const ALL_KINDS: FeaturePatternKind[] = [
|
|
|
55
55
|
"projection",
|
|
56
56
|
"multiStreamProjection",
|
|
57
57
|
"defineEvent",
|
|
58
|
-
"eventMigration",
|
|
59
58
|
"extendsRegistrar",
|
|
60
59
|
"usesApi",
|
|
61
60
|
"exposesApi",
|
|
62
61
|
"treeActions",
|
|
63
|
-
"tree",
|
|
64
62
|
"envSchema",
|
|
65
63
|
"unknown",
|
|
66
64
|
];
|
|
@@ -273,20 +271,20 @@ function makePlaceholderPattern(kind: FeaturePatternKind): FeaturePattern {
|
|
|
273
271
|
schemaSource: PLACEHOLDER_BODY_LOC,
|
|
274
272
|
handlerBody: PLACEHOLDER_BODY_LOC,
|
|
275
273
|
};
|
|
276
|
-
case "
|
|
274
|
+
case "streamHandler":
|
|
277
275
|
return {
|
|
278
276
|
kind,
|
|
279
277
|
source: PLACEHOLDER_LOC,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
278
|
+
handlerName: "x",
|
|
279
|
+
schemaSource: PLACEHOLDER_BODY_LOC,
|
|
280
|
+
handlerBody: PLACEHOLDER_BODY_LOC,
|
|
283
281
|
};
|
|
284
|
-
case "
|
|
282
|
+
case "hook":
|
|
285
283
|
return {
|
|
286
284
|
kind,
|
|
287
285
|
source: PLACEHOLDER_LOC,
|
|
288
286
|
hookType: "postSave",
|
|
289
|
-
|
|
287
|
+
target: "x",
|
|
290
288
|
fnBody: PLACEHOLDER_BODY_LOC,
|
|
291
289
|
};
|
|
292
290
|
case "job":
|
|
@@ -333,15 +331,6 @@ function makePlaceholderPattern(kind: FeaturePatternKind): FeaturePattern {
|
|
|
333
331
|
eventName: "x",
|
|
334
332
|
schemaSource: PLACEHOLDER_BODY_LOC,
|
|
335
333
|
};
|
|
336
|
-
case "eventMigration":
|
|
337
|
-
return {
|
|
338
|
-
kind,
|
|
339
|
-
source: PLACEHOLDER_LOC,
|
|
340
|
-
eventName: "x",
|
|
341
|
-
fromVersion: 1,
|
|
342
|
-
toVersion: 2,
|
|
343
|
-
transformBody: PLACEHOLDER_BODY_LOC,
|
|
344
|
-
};
|
|
345
334
|
case "extendsRegistrar":
|
|
346
335
|
return {
|
|
347
336
|
kind,
|
|
@@ -351,8 +340,6 @@ function makePlaceholderPattern(kind: FeaturePatternKind): FeaturePattern {
|
|
|
351
340
|
};
|
|
352
341
|
case "treeActions":
|
|
353
342
|
return { kind, source: PLACEHOLDER_LOC, definitions: {} };
|
|
354
|
-
case "tree":
|
|
355
|
-
return { kind, source: PLACEHOLDER_LOC, providerBody: PLACEHOLDER_BODY_LOC };
|
|
356
343
|
case "envSchema":
|
|
357
344
|
return { kind, source: PLACEHOLDER_LOC, schemaBody: PLACEHOLDER_BODY_LOC };
|
|
358
345
|
case "unknown":
|