@cosmicdrift/kumiko-framework 0.369.0 → 0.370.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/AGENTS.md +14 -1
- package/agents/examples/apex-surface-auth.md +2 -1
- package/agents/examples/app-config.md +98 -0
- package/agents/examples/auth-mfa.md +72 -0
- package/agents/examples/compose-stacks.md +188 -0
- package/agents/examples/env-composition.md +268 -0
- package/agents/examples/host-routing.md +181 -0
- package/agents/examples/legal-pages.md +52 -3
- package/agents/examples/managed-config.md +1 -0
- package/agents/examples/managed-pages.md +1 -0
- package/agents/examples/prod-boot-options.md +180 -0
- package/agents/examples/relations.md +4 -0
- package/agents/examples/secrets-demo.md +4 -2
- package/agents/examples/security-baseline.md +20 -17
- package/agents/examples.md +6 -1
- package/agents/features.md +14 -2
- package/dist/api/anonymous-cookie.d.ts +1 -1
- package/dist/api/anonymous-live-entities.d.ts +1 -1
- package/dist/api/auth-middleware.d.ts +2 -2
- package/dist/api/auth-routes.d.ts +7 -7
- package/dist/api/extra-route.d.ts +2 -2
- package/dist/api/index.d.ts +37 -37
- package/dist/api/jwt.d.ts +1 -1
- package/dist/api/observability-middleware.d.ts +1 -1
- package/dist/api/readiness.d.ts +1 -1
- package/dist/api/redis-sse-broker.d.ts +2 -2
- package/dist/api/request-context.d.ts +1 -1
- package/dist/api/request-id-middleware.d.ts +3 -3
- package/dist/api/route-registrars.d.ts +4 -4
- package/dist/api/routes.d.ts +1 -1
- package/dist/api/server.d.ts +16 -16
- package/dist/api/sse-broker.d.ts +1 -1
- package/dist/api/sse-route.d.ts +1 -1
- package/dist/api/websocket-route.d.ts +3 -3
- package/dist/auth/index.d.ts +2 -2
- package/dist/compliance/duration-spec.d.ts +2 -2
- package/dist/compliance/index.d.ts +6 -6
- package/dist/compliance/profiles.d.ts +1 -1
- package/dist/config/index.d.ts +44 -0
- package/dist/config/index.js +61 -0
- package/dist/crypto/blind-index.d.ts +1 -1
- package/dist/crypto/event-pii.d.ts +1 -1
- package/dist/crypto/in-memory-kms-adapter.d.ts +1 -1
- package/dist/crypto/index.d.ts +11 -11
- package/dist/crypto/is-self-pii-field.d.ts +1 -1
- package/dist/crypto/kms-wiring.d.ts +2 -2
- package/dist/crypto/owner-transition-rekey.d.ts +1 -1
- package/dist/crypto/pg-kms-adapter.d.ts +1 -1
- package/dist/crypto/pii-field-encryption.d.ts +4 -4
- package/dist/crypto/request-kms-cache.d.ts +1 -1
- package/dist/crypto/subject-resolver.d.ts +3 -3
- package/dist/db/apply-entity-event.d.ts +4 -4
- package/dist/db/assert-exists-in.d.ts +4 -4
- package/dist/db/blind-index-cleanup.d.ts +2 -2
- package/dist/db/collect-table-metas.d.ts +2 -2
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/config-seed.d.ts +5 -5
- package/dist/db/connection.d.ts +1 -6
- package/dist/db/connection.js +15 -4
- package/dist/db/dialect.d.ts +1 -1
- package/dist/db/eagerload.d.ts +3 -3
- package/dist/db/entity-field-encryption.d.ts +3 -3
- package/dist/db/entity-field-encryption.js +3 -1
- package/dist/db/entity-table-from-registry.d.ts +3 -3
- package/dist/db/entity-table-meta.d.ts +3 -3
- package/dist/db/event-store-executor-context.d.ts +9 -9
- package/dist/db/event-store-executor-read.d.ts +2 -2
- package/dist/db/event-store-executor-write.d.ts +2 -2
- package/dist/db/event-store-executor.d.ts +8 -8
- package/dist/db/feature-table-sources.d.ts +1 -1
- package/dist/db/index.d.ts +39 -39
- package/dist/db/located-timestamp.d.ts +1 -1
- package/dist/db/lock-guard.d.ts +2 -2
- package/dist/db/migrate-generator.d.ts +2 -2
- package/dist/db/migrate-runner.d.ts +1 -1
- package/dist/db/money.d.ts +1 -1
- package/dist/db/parent-ref-clause.d.ts +4 -4
- package/dist/db/projection-registry-binding.d.ts +1 -1
- package/dist/db/queries/advisory-lock.d.ts +1 -1
- package/dist/db/queries/backfill-pii.d.ts +2 -2
- package/dist/db/queries/ddl.d.ts +1 -1
- package/dist/db/queries/entity-read.d.ts +1 -1
- package/dist/db/queries/es-ops.d.ts +1 -1
- package/dist/db/queries/event-consumer.d.ts +2 -2
- package/dist/db/queries/event-store-admin.d.ts +1 -1
- package/dist/db/queries/event-store-transfer.d.ts +1 -1
- package/dist/db/queries/event-store.d.ts +1 -1
- package/dist/db/queries/pii-backfill-state.d.ts +1 -1
- package/dist/db/queries/projection-rebuild.d.ts +1 -1
- package/dist/db/queries/raw-sql.d.ts +1 -1
- package/dist/db/queries/seed-context.d.ts +2 -2
- package/dist/db/queries/shadow-swap.d.ts +3 -3
- package/dist/db/queries/table-ops.d.ts +1 -1
- package/dist/db/queries/test-stack.d.ts +2 -2
- package/dist/db/query.d.ts +3 -3
- package/dist/db/rebuild-marker.d.ts +1 -1
- package/dist/db/reference-data.d.ts +3 -3
- package/dist/db/render-ddl.d.ts +1 -1
- package/dist/db/replay-migration-sql.d.ts +1 -1
- package/dist/db/retired-framework-tables.d.ts +1 -1
- package/dist/db/schema-inspection.d.ts +1 -1
- package/dist/db/table-builder.d.ts +4 -4
- package/dist/db/table-push.d.ts +3 -3
- package/dist/db/tenant-db-runner.d.ts +2 -2
- package/dist/db/tenant-db.d.ts +7 -9
- package/dist/db/tenant-db.js +2 -12
- package/dist/derivatives/derivatives-context.d.ts +3 -3
- package/dist/derivatives/field-variants.d.ts +1 -1
- package/dist/derivatives/index.d.ts +6 -6
- package/dist/engine/access.d.ts +1 -1
- package/dist/engine/active-membership.d.ts +2 -2
- package/dist/engine/boot-validator/access-declarations.d.ts +1 -1
- package/dist/engine/boot-validator/access-roles.d.ts +1 -1
- package/dist/engine/boot-validator/action-wiring.d.ts +1 -1
- package/dist/engine/boot-validator/api-ext.d.ts +1 -1
- package/dist/engine/boot-validator/boot-check.d.ts +1 -1
- package/dist/engine/boot-validator/card-meta-overflow.d.ts +1 -1
- package/dist/engine/boot-validator/config-deps.d.ts +1 -1
- package/dist/engine/boot-validator/detail-screens.d.ts +2 -2
- package/dist/engine/boot-validator/entity-handler.d.ts +1 -1
- package/dist/engine/boot-validator/entity-list-screens.d.ts +1 -1
- package/dist/engine/boot-validator/gdpr-storage.d.ts +1 -1
- package/dist/engine/boot-validator/global-tenancy.d.ts +1 -1
- package/dist/engine/boot-validator/handler-field-references.d.ts +1 -1
- package/dist/engine/boot-validator/i18n-keys.d.ts +1 -1
- package/dist/engine/boot-validator/index.d.ts +7 -7
- package/dist/engine/boot-validator/nav.d.ts +1 -1
- package/dist/engine/boot-validator/ownership.d.ts +2 -2
- package/dist/engine/boot-validator/parent-ref.d.ts +1 -1
- package/dist/engine/boot-validator/pii-retention.d.ts +2 -2
- package/dist/engine/boot-validator/projection-list-screens.d.ts +1 -1
- package/dist/engine/boot-validator/query-output-columns.d.ts +1 -1
- package/dist/engine/boot-validator/query-refs.d.ts +1 -1
- package/dist/engine/boot-validator/record-owned.d.ts +1 -1
- package/dist/engine/boot-validator/screens.d.ts +2 -2
- package/dist/engine/boot-validator/security-baseline.d.ts +1 -1
- package/dist/engine/boot-validator/selector-owner-panels.d.ts +1 -1
- package/dist/engine/boot-validator/transfer-graph.d.ts +2 -2
- package/dist/engine/boot-validator/url-prefill-fields.d.ts +1 -1
- package/dist/engine/boot-validator/workspaces.d.ts +1 -1
- package/dist/engine/boot-validator.d.ts +1 -1
- package/dist/engine/bridge-stub.d.ts +1 -1
- package/dist/engine/build-app-schema.d.ts +2 -2
- package/dist/engine/build-config-feature-schema.d.ts +5 -5
- package/dist/engine/build-target.d.ts +2 -2
- package/dist/engine/changeset-changes.d.ts +1 -1
- package/dist/engine/codemod/index.d.ts +2 -2
- package/dist/engine/config-helpers.d.ts +1 -1
- package/dist/engine/constants.d.ts +1 -1
- package/dist/engine/create-app.d.ts +2 -2
- package/dist/engine/cross-tenant.d.ts +2 -2
- package/dist/engine/dedupe-features.d.ts +1 -1
- package/dist/engine/define-feature.d.ts +1 -1
- package/dist/engine/define-feature.js +2 -2
- package/dist/engine/define-handler.d.ts +4 -4
- package/dist/engine/define-step.d.ts +1 -1
- package/dist/engine/define-workflow.d.ts +2 -2
- package/dist/engine/effective-features.d.ts +1 -1
- package/dist/engine/embedded-derived.d.ts +1 -1
- package/dist/engine/entity-handlers.d.ts +6 -5
- package/dist/engine/entity-handlers.js +6 -3
- package/dist/engine/event-def.d.ts +15 -0
- package/dist/engine/event-def.js +123 -0
- package/dist/engine/event-helpers.d.ts +1 -1
- package/dist/engine/extension-names.d.ts +8 -8
- package/dist/engine/extension-selector-plugins.d.ts +2 -2
- package/dist/engine/extensions/escape-hatch-usage.d.ts +1 -1
- package/dist/engine/extensions/storage-provider.d.ts +1 -1
- package/dist/engine/extensions/tenant-data.d.ts +3 -3
- package/dist/engine/extensions/tenant-resource.d.ts +2 -2
- package/dist/engine/extensions/user-data.d.ts +2 -2
- package/dist/engine/factories.d.ts +1 -1
- package/dist/engine/feature-ast/extractors/ai-steps.d.ts +2 -2
- package/dist/engine/feature-ast/extractors/events.d.ts +2 -2
- package/dist/engine/feature-ast/extractors/handlers.d.ts +4 -4
- package/dist/engine/feature-ast/extractors/hooks.d.ts +5 -5
- package/dist/engine/feature-ast/extractors/index.d.ts +14 -14
- package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +3 -3
- package/dist/engine/feature-ast/extractors/projections-screens.d.ts +3 -3
- package/dist/engine/feature-ast/extractors/round1.d.ts +2 -2
- package/dist/engine/feature-ast/extractors/round2.d.ts +2 -2
- package/dist/engine/feature-ast/extractors/round3.d.ts +4 -4
- package/dist/engine/feature-ast/extractors/round5.d.ts +2 -2
- package/dist/engine/feature-ast/extractors/round6.d.ts +2 -2
- package/dist/engine/feature-ast/extractors/shared.d.ts +2 -2
- package/dist/engine/feature-ast/index.d.ts +16 -16
- package/dist/engine/feature-ast/parse.d.ts +2 -2
- package/dist/engine/feature-ast/patch.d.ts +1 -1
- package/dist/engine/feature-ast/patcher.d.ts +15 -15
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +10 -10
- package/dist/engine/feature-ast/patterns.d.ts +15 -15
- package/dist/engine/feature-ast/render.d.ts +1 -1
- package/dist/engine/feature-builder-state.d.ts +5 -5
- package/dist/engine/feature-config-events-jobs.d.ts +3 -3
- package/dist/engine/feature-config-events-jobs.js +8 -130
- package/dist/engine/feature-entity-handlers.d.ts +4 -4
- package/dist/engine/feature-entity-handlers.js +11 -5
- package/dist/engine/feature-manifest.d.ts +1 -1
- package/dist/engine/feature-ui-extensions.d.ts +7 -7
- package/dist/engine/feature-ui-extensions.js +2 -2
- package/dist/engine/field-access.d.ts +1 -1
- package/dist/engine/field-helpers.d.ts +1 -1
- package/dist/engine/handler-helpers.d.ts +1 -1
- package/dist/engine/index.d.ts +89 -88
- package/dist/engine/index.js +1 -0
- package/dist/engine/instruction-fields.d.ts +1 -1
- package/dist/engine/object-form.d.ts +1 -1
- package/dist/engine/object-form.js +5 -6
- package/dist/engine/ownership.d.ts +3 -3
- package/dist/engine/pattern-library/index.d.ts +2 -2
- package/dist/engine/pattern-library/library.d.ts +2 -2
- package/dist/engine/pattern-library/mixed-schemas.d.ts +1 -1
- package/dist/engine/pattern-library/opaque-schemas.d.ts +1 -1
- package/dist/engine/pattern-library/shared-fields.d.ts +1 -1
- package/dist/engine/pattern-library/static-schemas.d.ts +1 -1
- package/dist/engine/pattern-library/types.d.ts +1 -1
- package/dist/engine/personal-data-fields.d.ts +2 -2
- package/dist/engine/pipeline.d.ts +2 -2
- package/dist/engine/project-app-schema-for-roles.d.ts +1 -1
- package/dist/engine/projection-helpers.d.ts +4 -4
- package/dist/engine/read-claim.d.ts +1 -1
- package/dist/engine/registry-facade.d.ts +2 -2
- package/dist/engine/registry-ingest.d.ts +2 -2
- package/dist/engine/registry-state.d.ts +2 -2
- package/dist/engine/registry-validate.d.ts +3 -3
- package/dist/engine/registry.d.ts +1 -1
- package/dist/engine/resolve-config-or-param.d.ts +2 -2
- package/dist/engine/role-assignment.d.ts +1 -1
- package/dist/engine/run-in.d.ts +1 -1
- package/dist/engine/run-pipeline.d.ts +3 -3
- package/dist/engine/schema-builder.d.ts +1 -1
- package/dist/engine/screen-filter-ops.d.ts +1 -1
- package/dist/engine/screen-helpers.d.ts +2 -2
- package/dist/engine/soft-delete-cleanup.d.ts +2 -2
- package/dist/engine/steps/_event-match.d.ts +1 -1
- package/dist/engine/steps/_no-return-guard.d.ts +1 -1
- package/dist/engine/steps/_read-source.d.ts +4 -4
- package/dist/engine/steps/_resolver-utils.d.ts +1 -1
- package/dist/engine/steps/aggregate-append-event.d.ts +1 -1
- package/dist/engine/steps/aggregate-create.d.ts +2 -2
- package/dist/engine/steps/aggregate-update.d.ts +3 -3
- package/dist/engine/steps/branch.d.ts +1 -1
- package/dist/engine/steps/call-feature.d.ts +2 -2
- package/dist/engine/steps/compute.d.ts +1 -1
- package/dist/engine/steps/for-each.d.ts +1 -1
- package/dist/engine/steps/mail-send.d.ts +1 -1
- package/dist/engine/steps/read-find-many.d.ts +2 -2
- package/dist/engine/steps/read-find-one.d.ts +2 -2
- package/dist/engine/steps/retry.d.ts +1 -1
- package/dist/engine/steps/return.d.ts +2 -2
- package/dist/engine/steps/unsafe-projection-delete.d.ts +2 -2
- package/dist/engine/steps/unsafe-projection-upsert.d.ts +1 -1
- package/dist/engine/steps/wait-for-event.d.ts +1 -1
- package/dist/engine/steps/wait.d.ts +1 -1
- package/dist/engine/steps/webhook-send.d.ts +1 -1
- package/dist/engine/strip-disabled-features-from-app-schema.d.ts +4 -4
- package/dist/engine/system-user.d.ts +2 -2
- package/dist/engine/template-variables.d.ts +1 -1
- package/dist/engine/tier-resolver-extension.d.ts +4 -4
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/index.d.ts +6 -6
- package/dist/engine/validate-projection-allowlist.d.ts +1 -1
- package/dist/engine/validation.d.ts +1 -1
- package/dist/entrypoint/index.d.ts +12 -12
- package/dist/env/dry-run.d.ts +14 -1
- package/dist/env/dry-run.js +50 -0
- package/dist/env/index.d.ts +54 -16
- package/dist/env/index.js +60 -6
- package/dist/errors/classes.d.ts +3 -3
- package/dist/errors/docs-url.d.ts +1 -1
- package/dist/errors/index.d.ts +18 -18
- package/dist/errors/member-resolution.d.ts +1 -1
- package/dist/errors/serialize.d.ts +2 -2
- package/dist/errors/subject-erased.d.ts +1 -1
- package/dist/errors/to-kumiko-error.d.ts +1 -1
- package/dist/errors/write-error-info.d.ts +1 -1
- package/dist/errors/zod-bridge.d.ts +1 -1
- package/dist/es-ops/context.d.ts +4 -4
- package/dist/es-ops/index.d.ts +4 -4
- package/dist/es-ops/operations-schema.d.ts +1 -1
- package/dist/es-ops/runner.d.ts +3 -3
- package/dist/es-ops/runner.js +9 -1
- package/dist/es-ops/types.d.ts +2 -2
- package/dist/event-store/admin-api.d.ts +3 -3
- package/dist/event-store/archive.d.ts +2 -2
- package/dist/event-store/event-store.d.ts +2 -2
- package/dist/event-store/events-schema.d.ts +1 -1
- package/dist/event-store/index.d.ts +15 -15
- package/dist/event-store/provenance-append.d.ts +3 -3
- package/dist/event-store/rebuild-dead-letter.d.ts +2 -2
- package/dist/event-store/row-to-stored-event.d.ts +2 -2
- package/dist/event-store/snapshot.d.ts +2 -2
- package/dist/event-store/tenant-db-append.d.ts +2 -2
- package/dist/event-store/transfer.d.ts +3 -3
- package/dist/event-store/upcaster-dead-letter.d.ts +2 -2
- package/dist/event-store/upcaster.d.ts +3 -3
- package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -2
- package/dist/files/bind-pending-file-refs.d.ts +3 -3
- package/dist/files/create-file-ref-from-bytes.d.ts +4 -4
- package/dist/files/create-file-ref.d.ts +3 -3
- package/dist/files/dispose-removed-file-refs.d.ts +2 -2
- package/dist/files/feature.d.ts +3 -3
- package/dist/files/file-handle.d.ts +1 -1
- package/dist/files/file-ref-entity.d.ts +1 -1
- package/dist/files/file-ref-table.d.ts +1 -1
- package/dist/files/file-routes.d.ts +5 -5
- package/dist/files/in-memory-provider.d.ts +1 -1
- package/dist/files/index.d.ts +20 -20
- package/dist/files/load-save-file-refs.d.ts +2 -2
- package/dist/files/local-provider.d.ts +1 -1
- package/dist/files/provider-resolver.d.ts +5 -5
- package/dist/files/purge-expired-file-ref-bytes.d.ts +2 -2
- package/dist/files/record-read-check.d.ts +1 -1
- package/dist/files/record-write-check.d.ts +3 -3
- package/dist/files/storage-tracking.d.ts +2 -2
- package/dist/files/types.d.ts +1 -1
- package/dist/files/zip-stream.d.ts +1 -1
- package/dist/i18n/index.d.ts +4 -4
- package/dist/i18n/mail-registry.d.ts +1 -1
- package/dist/i18n/required-surface-keys.d.ts +1 -1
- package/dist/i18n/settings-hub-keys.d.ts +1 -1
- package/dist/internal/stack-support.d.ts +12 -12
- package/dist/internal/testing.d.ts +4 -4
- package/dist/jobs/index.d.ts +2 -2
- package/dist/jobs/job-runner.d.ts +1 -1
- package/dist/jobs/max-per-tenant.d.ts +1 -1
- package/dist/lifecycle/index.d.ts +2 -2
- package/dist/lifecycle/lifecycle.d.ts +1 -1
- package/dist/lifecycle/signal-handlers.d.ts +1 -1
- package/dist/logging/index.d.ts +4 -4
- package/dist/logging/pino-logger.d.ts +1 -1
- package/dist/logging/utils.d.ts +1 -1
- package/dist/migrations/index.d.ts +4 -4
- package/dist/migrations/kumiko-drift.d.ts +1 -1
- package/dist/migrations/pending-rebuilds.d.ts +5 -5
- package/dist/migrations/pii-event-backfill.d.ts +4 -4
- package/dist/migrations/projection-table-index.d.ts +1 -1
- package/dist/observability/console-provider.d.ts +1 -1
- package/dist/observability/context.d.ts +1 -1
- package/dist/observability/escape-hatch-report.d.ts +3 -3
- package/dist/observability/fallback.d.ts +1 -1
- package/dist/observability/index.d.ts +16 -16
- package/dist/observability/metric-validator.d.ts +1 -1
- package/dist/observability/metrics-handle.d.ts +1 -1
- package/dist/observability/metrics-wiring.d.ts +2 -2
- package/dist/observability/noop-provider.d.ts +1 -1
- package/dist/observability/prometheus-meter.d.ts +1 -1
- package/dist/observability/recording-meter.d.ts +1 -1
- package/dist/observability/recording-tracer.d.ts +1 -1
- package/dist/observability/redis-wrapper.d.ts +1 -1
- package/dist/observability/sensitive-filter.d.ts +1 -1
- package/dist/observability/standard-metrics.d.ts +1 -1
- package/dist/pipeline/active-membership.d.ts +4 -4
- package/dist/pipeline/append-event-core.d.ts +3 -3
- package/dist/pipeline/auth-claims-resolver.d.ts +2 -2
- package/dist/pipeline/cascade-handler.d.ts +3 -3
- package/dist/pipeline/dispatch-batch.d.ts +2 -2
- package/dist/pipeline/dispatch-query.d.ts +4 -4
- package/dist/pipeline/dispatch-shared.d.ts +17 -17
- package/dist/pipeline/dispatch-stream.d.ts +2 -2
- package/dist/pipeline/dispatch-write.d.ts +4 -4
- package/dist/pipeline/dispatcher-utils.d.ts +2 -2
- package/dist/pipeline/dispatcher.d.ts +12 -12
- package/dist/pipeline/event-consumer-state.d.ts +1 -1
- package/dist/pipeline/event-dispatcher-admin.d.ts +1 -1
- package/dist/pipeline/event-dispatcher-delivery.d.ts +7 -7
- package/dist/pipeline/event-dispatcher.d.ts +7 -7
- package/dist/pipeline/event-retention.d.ts +1 -1
- package/dist/pipeline/handler-access-error.d.ts +2 -2
- package/dist/pipeline/index.d.ts +42 -42
- package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
- package/dist/pipeline/lifecycle-pipeline.d.ts +2 -2
- package/dist/pipeline/member-read-only-transaction.d.ts +2 -2
- package/dist/pipeline/member-reader.d.ts +5 -5
- package/dist/pipeline/msp-rebuild.d.ts +4 -4
- package/dist/pipeline/multi-stream-apply-context.d.ts +3 -3
- package/dist/pipeline/notify-scope.d.ts +3 -3
- package/dist/pipeline/pending-gap-ranges.d.ts +2 -2
- package/dist/pipeline/pre-handler-gates.d.ts +3 -3
- package/dist/pipeline/pre-transaction-reservations.d.ts +4 -4
- package/dist/pipeline/projection-rebuild.d.ts +3 -3
- package/dist/pipeline/projection-state.d.ts +1 -1
- package/dist/pipeline/projections-runner.d.ts +3 -3
- package/dist/pipeline/projections-runner.js +3 -4
- package/dist/pipeline/system-hooks.d.ts +4 -4
- package/dist/pipeline/system-identity-switch.d.ts +3 -3
- package/dist/pipeline/tenant-timezone-cache.d.ts +1 -1
- package/dist/pipeline/write-origin.d.ts +3 -3
- package/dist/pipeline/write-result-masking.d.ts +2 -2
- package/dist/random/index.d.ts +2 -2
- package/dist/rate-limit/bucket.d.ts +1 -1
- package/dist/rate-limit/index.d.ts +3 -3
- package/dist/rate-limit/middleware.d.ts +3 -3
- package/dist/redis/cache-sync-bus.d.ts +2 -2
- package/dist/redis/cache-sync-topics.d.ts +1 -1
- package/dist/redis/index.d.ts +8 -8
- package/dist/redis/pubsub-signal.d.ts +1 -1
- package/dist/schema-cli.d.ts +1 -1
- package/dist/schema-cli.js +9 -1
- package/dist/search/derive-search-adapter-config.d.ts +2 -2
- package/dist/search/in-memory-adapter.d.ts +1 -1
- package/dist/search/index.d.ts +6 -6
- package/dist/search/meilisearch-adapter.d.ts +2 -2
- package/dist/search/purge-subject.d.ts +4 -4
- package/dist/search/reindex-entity.d.ts +3 -3
- package/dist/secrets/dek-cache.d.ts +1 -1
- package/dist/secrets/env-master-key-provider.d.ts +1 -1
- package/dist/secrets/env-master-key-provider.js +26 -11
- package/dist/secrets/envelope-cipher.d.ts +2 -2
- package/dist/secrets/envelope.d.ts +1 -1
- package/dist/secrets/index.d.ts +9 -9
- package/dist/secrets/rotation.d.ts +1 -1
- package/dist/secrets/stored-envelope.d.ts +1 -1
- package/dist/seeding/entity-seed.d.ts +1 -1
- package/dist/seeding/index.d.ts +3 -3
- package/dist/seeding/seed-users.d.ts +1 -1
- package/dist/time/index.d.ts +6 -6
- package/dist/ui-types/app-schema.d.ts +5 -5
- package/dist/ui-types/index.d.ts +23 -23
- package/dist/upgrade-cli.js +13 -3
- package/dist/utils/index.d.ts +9 -9
- package/package.json +19 -66
- package/presets/biome-app.json +80 -0
- package/presets/tsconfig.app.json +19 -0
- package/src/changes.json +78 -2
- package/src/scripts/codemod/README.md +18 -0
- package/src/scripts/codemod/codemod-support.ts +1 -1
- package/src/scripts/codemod/db-factory.ts +1 -1
- package/src/scripts/codemod/feature-factory.ts +1 -1
- package/src/scripts/codemod/import-extensions.ts +118 -0
- package/src/scripts/codemod/migrate-cross-tenant.ts +2 -2
- package/src/scripts/codemod/migrate-db-raw.ts +1 -1
- package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
- package/src/scripts/codemod/object-form.ts +1 -1
- package/src/scripts/codemod/s3-imports.ts +1 -1
- package/src/scripts/codemod/tenant-db-options.ts +1 -1
- package/src/scripts/codemod/testing-move.ts +2 -2
- package/dist/db/bun-db-deprecated.d.ts +0 -10
- package/dist/db/bun-db-deprecated.js +0 -5
- package/dist/stack/index.d.ts +0 -10
- package/dist/stack/index.js +0 -11
- package/dist/testing/e2e-generator.d.ts +0 -5
- package/dist/testing/e2e-generator.js +0 -5
- package/dist/testing/handler-context.d.ts +0 -5
- package/dist/testing/handler-context.js +0 -5
- package/dist/testing/index.d.ts +0 -10
- package/dist/testing/index.js +0 -10
- package/dist/testing/real-providers.d.ts +0 -5
- package/dist/testing/real-providers.js +0 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { DbRunner } from "../../db/connection.
|
|
2
|
-
import type { WhereObject } from "../../db/query.
|
|
3
|
-
import { type TenantDb } from "../../db/tenant-db.
|
|
4
|
-
import type { PipelineCtx } from "../types/step.
|
|
1
|
+
import type { DbRunner } from "../../db/connection.ts";
|
|
2
|
+
import type { WhereObject } from "../../db/query.ts";
|
|
3
|
+
import { type TenantDb } from "../../db/tenant-db.ts";
|
|
4
|
+
import type { PipelineCtx } from "../types/step.ts";
|
|
5
5
|
export declare function readSourceFor(ctx: PipelineCtx, unsafeAllTenants: {
|
|
6
6
|
readonly reason: string;
|
|
7
7
|
} | undefined): TenantDb | DbRunner;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PipelineCtx, StepResolver } from "../types/step.
|
|
1
|
+
import type { PipelineCtx, StepResolver } from "../types/step.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Resolve a required StepResolver — either a static value or a function.
|
|
4
4
|
* Throws if `arg` is undefined; caller must guarantee presence.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EventStoreExecutor } from "../../db/event-store-executor.
|
|
2
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import type { EventStoreExecutor } from "../../db/event-store-executor.ts";
|
|
2
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
3
3
|
export declare function buildAggregateCreateStep(name: string, opts: {
|
|
4
4
|
readonly executor: EventStoreExecutor;
|
|
5
5
|
readonly data: StepResolver<Record<string, unknown>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EventStoreExecutor } from "../../db/event-store-executor.
|
|
2
|
-
import type { EntityId } from "../types/identifiers.
|
|
3
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import type { EventStoreExecutor } from "../../db/event-store-executor.ts";
|
|
2
|
+
import type { EntityId } from "../types/identifiers.ts";
|
|
3
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
4
4
|
export declare function buildAggregateUpdateStep(name: string, opts: {
|
|
5
5
|
readonly executor: EventStoreExecutor;
|
|
6
6
|
readonly id: StepResolver<EntityId>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SessionUser } from "../types/index.
|
|
2
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import type { SessionUser } from "../types/index.ts";
|
|
2
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
3
3
|
export declare function buildCallFeatureStep(name: string, opts: {
|
|
4
4
|
readonly handler: string;
|
|
5
5
|
readonly payload: StepResolver<unknown>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { PipelineCtx, StepInstance } from "../types/step.
|
|
1
|
+
import type { PipelineCtx, StepInstance } from "../types/step.ts";
|
|
2
2
|
export declare function buildComputeStep<TResult>(name: string, fn: (ctx: PipelineCtx) => TResult): StepInstance;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type WhereObject } from "../../db/query.
|
|
2
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import { type WhereObject } from "../../db/query.ts";
|
|
2
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
3
3
|
export declare function buildReadFindManyStep(name: string, opts: {
|
|
4
4
|
readonly table: unknown;
|
|
5
5
|
readonly where?: StepResolver<WhereObject | undefined>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type WhereObject } from "../../db/query.
|
|
2
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import { type WhereObject } from "../../db/query.ts";
|
|
2
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
3
3
|
export declare function buildReadFindOneStep(name: string, opts: {
|
|
4
4
|
readonly table: unknown;
|
|
5
5
|
readonly where: StepResolver<WhereObject | undefined>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WriteResult } from "../types/handlers.
|
|
2
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import type { WriteResult } from "../types/handlers.ts";
|
|
2
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
3
3
|
export declare const RETURN_RESULT_KEY = "__return";
|
|
4
4
|
export declare function buildReturnStep<TData>(resolver: StepResolver<WriteResult<TData>>): StepInstance;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type WhereObject } from "../../db/query.
|
|
2
|
-
import type { StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import { type WhereObject } from "../../db/query.ts";
|
|
2
|
+
import type { StepInstance, StepResolver } from "../types/step.ts";
|
|
3
3
|
type UnsafeProjectionDeleteArgs = {
|
|
4
4
|
readonly table: unknown;
|
|
5
5
|
readonly where: StepResolver<WhereObject>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AwaitedEventType, EventMatch, StepInstance, StepResolver } from "../types/step.
|
|
1
|
+
import type { AwaitedEventType, EventMatch, StepInstance, StepResolver } from "../types/step.ts";
|
|
2
2
|
type WaitForEventArgs = {
|
|
3
3
|
readonly event: AwaitedEventType;
|
|
4
4
|
readonly match?: StepResolver<EventMatch>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AppSchema } from "../ui-types/app-schema.
|
|
2
|
-
import type { EffectiveFeaturesResolver } from "./tier-resolver-extension.
|
|
3
|
-
import type { Registry } from "./types/feature.
|
|
4
|
-
import type { TenantId } from "./types/identifiers.
|
|
1
|
+
import type { AppSchema } from "../ui-types/app-schema.ts";
|
|
2
|
+
import type { EffectiveFeaturesResolver } from "./tier-resolver-extension.ts";
|
|
3
|
+
import type { Registry } from "./types/feature.ts";
|
|
4
|
+
import type { TenantId } from "./types/identifiers.ts";
|
|
5
5
|
export declare function resolveDisabledFeatureNames(registry: Registry, effectiveFeatures: EffectiveFeaturesResolver, tenantId: TenantId): Promise<readonly string[]>;
|
|
6
6
|
export declare function stripDisabledFeaturesFromAppSchema(schema: AppSchema, registry: Registry, disabledFeatureNames: readonly string[]): AppSchema;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SYSTEM_USER_ID, type TenantId } from "./types/identifiers.
|
|
2
|
-
import type { SessionUser } from "./types/index.
|
|
1
|
+
import { SYSTEM_USER_ID, type TenantId } from "./types/identifiers.ts";
|
|
2
|
+
import type { SessionUser } from "./types/index.ts";
|
|
3
3
|
export { SYSTEM_USER_ID };
|
|
4
4
|
export declare const SYSTEM_ROLE: "system";
|
|
5
5
|
export declare function createSystemUser(tenantId: TenantId, extraRoles?: readonly string[]): SessionUser;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
-
import type { Registry, TemplateListVariableDef, TemplateScalarVariableDef, TemplateVariables } from "./types/index.
|
|
2
|
+
import type { Registry, TemplateListVariableDef, TemplateScalarVariableDef, TemplateVariables } from "./types/index.ts";
|
|
3
3
|
type CommonOptions = {
|
|
4
4
|
readonly label?: string;
|
|
5
5
|
readonly required?: boolean;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { CacheSyncBus } from "@cosmicdrift/kumiko-types/cache-sync-types";
|
|
2
|
-
import type { DbConnection } from "../db/connection.
|
|
3
|
-
import type { RegistrarExtensionRegistration } from "./types/config.
|
|
4
|
-
import type { FeatureDefinition, Registry } from "./types/feature.
|
|
5
|
-
import type { TenantId } from "./types/identifiers.
|
|
2
|
+
import type { DbConnection } from "../db/connection.ts";
|
|
3
|
+
import type { RegistrarExtensionRegistration } from "./types/config.ts";
|
|
4
|
+
import type { FeatureDefinition, Registry } from "./types/feature.ts";
|
|
5
|
+
import type { TenantId } from "./types/identifiers.ts";
|
|
6
6
|
/**
|
|
7
7
|
* Extension-name unter dem ein tier-resolver-plugin im registry registriert
|
|
8
8
|
* werden muss. Konstante damit `r.useExtension(TENANT_TIER_RESOLVER_EXT, ...)`
|
|
@@ -4,7 +4,7 @@ export type { QueryHandlerDefinition, StreamHandlerDefinition, WriteHandlerDefin
|
|
|
4
4
|
export type { EntityCrudRegistrar, EntityCrudVerb, EntityHandlerOptions, EntityQueryHandlerOptions, EntityWriteHandlerOptions, RegisterEntityCrudOptions, } from "@cosmicdrift/kumiko-types/entity-handlers";
|
|
5
5
|
export type { KumikoEntityTypeMap, KumikoEventTypeMap, KumikoHandlerPayloadMap, KumikoHandlerResultMap, } from "@cosmicdrift/kumiko-types/event-type-map";
|
|
6
6
|
export type { ExtensionOptionsArgs, ExtensionOptionsFor, KumikoExtensionOptionsMap, } from "@cosmicdrift/kumiko-types/extension-options-map";
|
|
7
|
-
export type { BootCheckContext, BootCheckFn, EntityObjectDefinition, FeatureDefinition, FeatureMetricDef, FeatureMetricType, FeatureRegistrar, HookDefinition, MetricOptions, Registry, SecretKeyDefinition, SecretKeyHandle, SecretNamespaceDefinition, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, StoreTableDef, StoreTableEntry, StoreTableOptions, UiHintOption, UiHints, } from "@cosmicdrift/kumiko-types/feature";
|
|
7
|
+
export type { BootCheckContext, BootCheckFn, BootOptionName, EntityObjectDefinition, FeatureDefinition, FeatureMetricDef, FeatureMetricType, FeatureRegistrar, HookDefinition, MetricOptions, Registry, SecretKeyDefinition, SecretKeyHandle, SecretNamespaceDefinition, SecretNamespaceHandle, SecretNamespaceOptions, SecretOptions, StackBootRequirement, StoreTableDef, StoreTableEntry, StoreTableOptions, UiHintOption, UiHints, } from "@cosmicdrift/kumiko-types/feature";
|
|
8
8
|
export type { FieldIconKey } from "@cosmicdrift/kumiko-types/field-icon";
|
|
9
9
|
export type { AnyFileFieldDef, BigIntFieldDef, BooleanFieldDef, ClientDerivedFieldDef, DateFieldDef, DecimalFieldDef, DefaultCurrency, DeriveContext, DerivedFieldDef, DerivedFieldsMap, DerivedValueType, EmbeddedDerivedCellDef, EmbeddedFieldDef, EmbeddedSubFieldDef, EntityDefinition, EntityEventMigration, EntityIndexDef, FieldAccess, FieldDefinition, FieldsMap, FileFieldDef, FilesFieldDef, Findability, ImageFieldDef, ImagesFieldDef, JsonbFieldDef, LocatedTimestampFieldDef, LongTextFieldDef, LongTextFindability, MoneyCurrencySource, MoneyFieldDef, MultiSelectFieldDef, NumberFieldDef, OptionsQueryPayload, OptionsQueryPayloadValue, ParentRefDef, PersonalAnnotations, PersonalAnnotationsLongText, PersonalAnnotationsNoFind, PersonalSubject, ReferenceFieldDef, ResolvedPiiFlags, RetentionDef, SelectFieldDef, SelectOptionTone, TextFieldDef, TimestampFieldDef, TransitionMap, TzFieldDef, } from "@cosmicdrift/kumiko-types/fields";
|
|
10
10
|
export type { AccessRule, ActiveMembership, ActiveMembershipRejection, ActiveMembershipResult, AgentExposure, AgentHandlerHints, AgentRisk, AggregateStreamHandle, AppContext, AppendEventArgs, AppendEventFn, AuthClaimsContext, AuthClaimsFn, AuthClaimsHookDef, BeforeTransactionPhase, BeforeTransactionResult, CamelToKebab, ChatSendFailureCode, ClaimKeyDefinition, ClaimKeyHandle, ClaimKeyJsType, ClaimKeyType, DeclarativeEventMigration, DeliveryErrorCode, DeliveryFailureCode, DeliverySkipReason, DispatchWriteRef, EntityRef, EscapeHatchAuditSink, EscapeHatchDeclaration, EscapeHatchKind, EscapeHatchReporter, EscapeHatchTarget, EscapeHatchUseEvent, EventDef, EventMigrationDef, EventPiiFields, EventPiiStance, EventUpcastCtx, EventUpcastFn, FetchForWritingArgs, HandlerContext, HandlerRef, JobContext, JobRunnerRef, JobTriggerEvent, MemberReader, NameOrRef, NotifyDeferred, NotifyDelivery, NotifyDeliveryStatus, NotifyDispatched, NotifyFactory, NotifyFn, NotifyJobDispatcher, NotifyOptions, NotifyPriority, NotifyResult, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, PayloadBucketNormalization, PayloadRateLimitOption, PreparedWriteEvent, QualifiedEventName, QueryEvent, QueryHandlerDef, QueryHandlerFn, RateLimitDeclaration, RateLimitDisabled, RateLimitOption, RateLimitPer, RoleAccessPersonalData, RoleAccessRule, SessionUser, SessionUserOrigin, StreamHandlerDef, StreamHandlerFn, TenantWriteTarget, TryAppendEventFn, TryAppendEventResult, UnsafeAppendEventFn, WriteEvent, WriteHandlerDef, WriteHandlerFn, WriteResult, } from "@cosmicdrift/kumiko-types/handlers";
|
|
@@ -23,8 +23,8 @@ export type { TargetRef } from "@cosmicdrift/kumiko-types/target-ref";
|
|
|
23
23
|
export type { Subscribe, TreeAction, TreeActionDef, TreeActionsHandle, TreeChildrenSubscribe, TreeNode, TreeNodeState, } from "@cosmicdrift/kumiko-types/tree-node";
|
|
24
24
|
export type { WebSocketConnection, WebSocketMessageData, WebSocketRouteConnectDeps, WebSocketRouteDefinition, WebSocketSessionHandlers, } from "@cosmicdrift/kumiko-types/websocket-route";
|
|
25
25
|
export type { WorkspaceDefinition } from "@cosmicdrift/kumiko-types/workspace";
|
|
26
|
-
export type { ConcurrencyMode, ConfigScope, LifecycleHookType, OnDeleteStrategy, } from "../constants.
|
|
27
|
-
export { DEFAULT_CURRENCIES, DEFAULT_LOCALES, isFileField } from "../field-helpers.
|
|
28
|
-
export { resolveName, withResponseData } from "../handler-helpers.
|
|
29
|
-
export { HookPhases } from "../hook-helpers.
|
|
30
|
-
export { isExtensionEditSection, isFormatSpec, normalizeEditField, normalizeListColumn, } from "../screen-helpers.
|
|
26
|
+
export type { ConcurrencyMode, ConfigScope, LifecycleHookType, OnDeleteStrategy, } from "../constants.ts";
|
|
27
|
+
export { DEFAULT_CURRENCIES, DEFAULT_LOCALES, isFileField } from "../field-helpers.ts";
|
|
28
|
+
export { resolveName, withResponseData } from "../handler-helpers.ts";
|
|
29
|
+
export { HookPhases } from "../hook-helpers.ts";
|
|
30
|
+
export { isExtensionEditSection, isFormatSpec, normalizeEditField, normalizeListColumn, } from "../screen-helpers.ts";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Registry, ValidationError } from "./types/index.
|
|
1
|
+
import type { Registry, ValidationError } from "./types/index.ts";
|
|
2
2
|
export type { ValidationError };
|
|
3
3
|
export declare function runValidation(registry: Registry, hookName: string, data: Readonly<Record<string, unknown>>): readonly ValidationError[] | null;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import type { Hono } from "hono";
|
|
2
|
-
import type { AuthRoutesConfig } from "../api/auth-routes.
|
|
3
|
-
import type { JwtHelper, JwtKeyring } from "../api/jwt.
|
|
4
|
-
import type { ServerOptions } from "../api/server.
|
|
5
|
-
import type { SseBroker } from "../api/sse-broker.
|
|
6
|
-
import type { PgClient, PgListenClient } from "../db/connection.
|
|
7
|
-
import type { AppContext, Registry } from "../engine/types/index.
|
|
8
|
-
import type { JobRunner, JobRunnerOptions } from "../jobs/job-runner.
|
|
9
|
-
import type { Lifecycle } from "../lifecycle/index.
|
|
10
|
-
import type { ObservabilityOptions, ObservabilityProvider } from "../observability/index.
|
|
11
|
-
import type { Dispatcher, DispatcherOptions } from "../pipeline/dispatcher.
|
|
12
|
-
import type { EventDedup, EventDispatcher } from "../pipeline/index.
|
|
13
|
-
import type { SystemHooks } from "../pipeline/lifecycle-pipeline.
|
|
2
|
+
import type { AuthRoutesConfig } from "../api/auth-routes.ts";
|
|
3
|
+
import type { JwtHelper, JwtKeyring } from "../api/jwt.ts";
|
|
4
|
+
import type { ServerOptions } from "../api/server.ts";
|
|
5
|
+
import type { SseBroker } from "../api/sse-broker.ts";
|
|
6
|
+
import type { PgClient, PgListenClient } from "../db/connection.ts";
|
|
7
|
+
import type { AppContext, Registry } from "../engine/types/index.ts";
|
|
8
|
+
import type { JobRunner, JobRunnerOptions } from "../jobs/job-runner.ts";
|
|
9
|
+
import type { Lifecycle } from "../lifecycle/index.ts";
|
|
10
|
+
import type { ObservabilityOptions, ObservabilityProvider } from "../observability/index.ts";
|
|
11
|
+
import type { Dispatcher, DispatcherOptions } from "../pipeline/dispatcher.ts";
|
|
12
|
+
import type { EventDedup, EventDispatcher } from "../pipeline/index.ts";
|
|
13
|
+
import type { SystemHooks } from "../pipeline/lifecycle-pipeline.ts";
|
|
14
14
|
export type BaseEntrypointOptions = {
|
|
15
15
|
readonly registry: Registry;
|
|
16
16
|
readonly context: AppContext;
|
package/dist/env/dry-run.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import { type ComposedEnvSchema } from "./index.
|
|
1
|
+
import { type ComposedEnvSchema, type EnvFieldInspection } from "./index.ts";
|
|
2
2
|
export type DryRunMode = "human" | "json" | "pulumi" | "k8s";
|
|
3
|
+
/** `boot` runs the boot validators without connecting anywhere; the other
|
|
4
|
+
* modes only render the env inventory. */
|
|
5
|
+
export type DryRunEnvMode = DryRunMode | "boot";
|
|
6
|
+
export declare const DRY_RUN_ENV_VAR = "KUMIKO_DRY_RUN_ENV";
|
|
7
|
+
/** Reads `KUMIKO_DRY_RUN_ENV`. `1` and `true` mean `human`; an unknown value
|
|
8
|
+
* returns undefined, so the caller decides whether to warn or boot. */
|
|
9
|
+
export declare function parseDryRunEnvMode(raw: string | undefined): DryRunEnvMode | undefined;
|
|
10
|
+
/** True while any dry-run mode is requested, for code that runs at module
|
|
11
|
+
* load (key providers, secret derivation) and must not throw on missing env. */
|
|
12
|
+
export declare function isDryRunEnvActive(env: Readonly<Record<string, string | undefined>>): boolean;
|
|
3
13
|
export type DryRunOptions = {
|
|
4
14
|
/** From composeEnvSchema. Drives the per-row feature-attribution. */
|
|
5
15
|
readonly sources?: Readonly<Record<string, string>>;
|
|
@@ -11,3 +21,6 @@ export type DryRunOptions = {
|
|
|
11
21
|
readonly k8sNamespace?: string;
|
|
12
22
|
};
|
|
13
23
|
export declare function renderDryRun(composed: ComposedEnvSchema, mode: DryRunMode, options?: DryRunOptions): string;
|
|
24
|
+
/** Table for `KUMIKO_DRY_RUN_ENV=boot`: one row per variable with its source,
|
|
25
|
+
* whether it is required, and whether it is set. Values are never printed. */
|
|
26
|
+
export declare function renderEnvInspection(rows: readonly EnvFieldInspection[]): string;
|
package/dist/env/dry-run.js
CHANGED
|
@@ -9,6 +9,24 @@
|
|
|
9
9
|
// by parseEnv drives the output here — single source of truth.
|
|
10
10
|
import { zodShape } from "./_zod-introspect.js";
|
|
11
11
|
import { classifyField, getDefaultValue, getFieldDescription, pulumiConfigKey, readKumikoMeta, } from "./index.js";
|
|
12
|
+
export const DRY_RUN_ENV_VAR = "KUMIKO_DRY_RUN_ENV";
|
|
13
|
+
/** Reads `KUMIKO_DRY_RUN_ENV`. `1` and `true` mean `human`; an unknown value
|
|
14
|
+
* returns undefined, so the caller decides whether to warn or boot. */
|
|
15
|
+
export function parseDryRunEnvMode(raw) {
|
|
16
|
+
if (!raw)
|
|
17
|
+
return undefined;
|
|
18
|
+
const value = raw.toLowerCase();
|
|
19
|
+
if (value === "1" || value === "true" || value === "human")
|
|
20
|
+
return "human";
|
|
21
|
+
if (value === "json" || value === "pulumi" || value === "k8s" || value === "boot")
|
|
22
|
+
return value;
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/** True while any dry-run mode is requested, for code that runs at module
|
|
26
|
+
* load (key providers, secret derivation) and must not throw on missing env. */
|
|
27
|
+
export function isDryRunEnvActive(env) {
|
|
28
|
+
return parseDryRunEnvMode(env[DRY_RUN_ENV_VAR]) !== undefined;
|
|
29
|
+
}
|
|
12
30
|
function collectFields(schema, sources) {
|
|
13
31
|
const out = [];
|
|
14
32
|
for (const [name, field] of Object.entries(zodShape(schema))) {
|
|
@@ -163,3 +181,35 @@ function renderK8s(fields, options) {
|
|
|
163
181
|
}
|
|
164
182
|
return `${lines.join("\n")}\n`;
|
|
165
183
|
}
|
|
184
|
+
function inspectionStatus(row) {
|
|
185
|
+
return row.status === "invalid" ? `invalid: ${row.message ?? "invalid value"}` : row.status;
|
|
186
|
+
}
|
|
187
|
+
/** Table for `KUMIKO_DRY_RUN_ENV=boot`: one row per variable with its source,
|
|
188
|
+
* whether it is required, and whether it is set. Values are never printed. */
|
|
189
|
+
export function renderEnvInspection(rows) {
|
|
190
|
+
const header = { name: "VARIABLE", source: "SOURCE", klass: "KIND" };
|
|
191
|
+
const nameWidth = Math.max(header.name.length, ...rows.map((r) => r.name.length));
|
|
192
|
+
const sourceWidth = Math.max(header.source.length, ...rows.map((r) => r.source.length));
|
|
193
|
+
const klassWidth = Math.max(header.klass.length, ...rows.map((r) => r.klass.length));
|
|
194
|
+
const line = (name, source, klass, status) => ` ${name.padEnd(nameWidth)} ${source.padEnd(sourceWidth)} ${klass.padEnd(klassWidth)} ${status}`;
|
|
195
|
+
const order = { required: 0, optional: 1, withDefault: 2 };
|
|
196
|
+
const sorted = [...rows].sort((a, b) => order[a.klass] - order[b.klass] ||
|
|
197
|
+
a.source.localeCompare(b.source) ||
|
|
198
|
+
a.name.localeCompare(b.name));
|
|
199
|
+
const missing = rows.filter((r) => r.status === "missing").length;
|
|
200
|
+
const invalid = rows.filter((r) => r.status === "invalid").length;
|
|
201
|
+
const lines = [
|
|
202
|
+
"Env check (values are not printed):",
|
|
203
|
+
line(header.name, header.source, header.klass, "STATUS"),
|
|
204
|
+
...sorted.map((r) => line(r.name, r.source, r.klass, inspectionStatus(r))),
|
|
205
|
+
"",
|
|
206
|
+
];
|
|
207
|
+
if (invalid > 0)
|
|
208
|
+
lines.push(`${invalid} variable(s) invalid.`);
|
|
209
|
+
if (missing > 0) {
|
|
210
|
+
lines.push(`${missing} required variable(s) missing. Feature wiring was NOT validated; set them and rerun to check it.`);
|
|
211
|
+
}
|
|
212
|
+
if (invalid === 0 && missing === 0)
|
|
213
|
+
lines.push("All variables present.");
|
|
214
|
+
return `${lines.join("\n")}\n`;
|
|
215
|
+
}
|
package/dist/env/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
-
import type { FeatureDefinition } from "../engine/types/feature.
|
|
2
|
+
import type { FeatureDefinition } from "../engine/types/feature.ts";
|
|
3
3
|
export type KumikoEnvMeta = {
|
|
4
4
|
readonly pulumi?: {
|
|
5
5
|
/** Override the auto-derived camelCase Pulumi-config-key name. Apps
|
|
@@ -28,31 +28,54 @@ export type EnvFieldClass = "required" | "optional" | "withDefault";
|
|
|
28
28
|
export declare function classifyField(field: z.ZodType): EnvFieldClass;
|
|
29
29
|
export declare function getDefaultValue(field: z.ZodType): unknown;
|
|
30
30
|
export declare function getFieldDescription(field: z.ZodType): string | undefined;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
/** A feature whose registered env schema is visible in its type, so
|
|
32
|
+
* `composeEnvSchema` can type the merged schema from the feature list. */
|
|
33
|
+
export type FeatureWithEnvSchema<TFeature extends FeatureDefinition, TShape extends z.ZodRawShape> = TFeature & {
|
|
34
|
+
readonly envSchema: z.ZodObject<TShape>;
|
|
35
|
+
};
|
|
36
|
+
/** Returns `feature` typed with the env schema it registered via
|
|
37
|
+
* `r.envSchema(schema)`. Throws when the feature registered another
|
|
38
|
+
* instance, so the type never claims fields the runtime schema lacks. */
|
|
39
|
+
export declare function featureWithEnvSchema<TFeature extends FeatureDefinition, TShape extends z.ZodRawShape>(feature: TFeature, schema: z.ZodObject<TShape>): FeatureWithEnvSchema<TFeature, TShape>;
|
|
40
|
+
type EmptyShape = Record<never, never>;
|
|
41
|
+
type DeclaredEnvShape<TFeature> = TFeature extends {
|
|
42
|
+
readonly envSchema: z.ZodObject<infer TShape extends z.ZodRawShape>;
|
|
43
|
+
} ? string extends keyof TShape ? EmptyShape : TShape : EmptyShape;
|
|
44
|
+
type UnionToIntersection<TUnion> = (TUnion extends unknown ? (value: TUnion) => void : never) extends (value: infer TIntersection) => void ? TIntersection : never;
|
|
45
|
+
type OptionalShape<TShape extends z.ZodRawShape> = {
|
|
46
|
+
[Key in keyof TShape]: z.ZodOptional<TShape[Key]>;
|
|
47
|
+
};
|
|
48
|
+
type FeaturesEnvShape<TFeatures extends readonly FeatureDefinition[]> = UnionToIntersection<DeclaredEnvShape<TFeatures[number]>>;
|
|
49
|
+
type FlattenShape<TShape> = {
|
|
50
|
+
[Key in keyof TShape]: TShape[Key];
|
|
51
|
+
} & {};
|
|
52
|
+
type KnownShape<TShape extends z.ZodRawShape> = string extends keyof TShape ? EmptyShape : TShape;
|
|
53
|
+
/** The merged shape `composeEnvSchema` returns. With `optionalFeatures`
|
|
54
|
+
* every feature field is typed optional: the type cannot tell which feature
|
|
55
|
+
* a name refers to, and over-reporting `undefined` is the safe side. */
|
|
56
|
+
export type ComposedEnvShape<TFeatures extends readonly FeatureDefinition[], TCore extends z.ZodRawShape, TExtend extends z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined> = Extract<FlattenShape<KnownShape<TCore> & (TOptionalFeatures extends readonly string[] ? OptionalShape<FeaturesEnvShape<TFeatures> & z.ZodRawShape> : FeaturesEnvShape<TFeatures>) & KnownShape<TExtend>>, z.ZodRawShape>;
|
|
57
|
+
export type ComposeEnvSchemaOptions<TFeatures extends readonly FeatureDefinition[] = readonly FeatureDefinition[], TCore extends z.ZodRawShape = z.ZodRawShape, TExtend extends z.ZodRawShape = z.ZodRawShape, TOptionalFeatures extends readonly string[] | undefined = readonly string[] | undefined> = {
|
|
58
|
+
/** All features whose envSchemas should be merged. Bundled features type
|
|
59
|
+
* their fragment, so passing the list inline types the merged schema. */
|
|
60
|
+
readonly features: TFeatures;
|
|
34
61
|
/** App-specific env-vars (e.g. `STUDIO_ADMIN_EMAIL`). Keys here are
|
|
35
62
|
* tagged as source "app" in the resulting sources map. */
|
|
36
|
-
readonly extend?: z.ZodObject<
|
|
63
|
+
readonly extend?: z.ZodObject<TExtend>;
|
|
37
64
|
/** Feature-names whose env-vars should be auto-`.optional()`-wrapped.
|
|
38
65
|
* Lets an app opt out of e.g. `channel-email-smtp`'s vars without
|
|
39
66
|
* manually `.partial()`-ing each shape at the call-site. */
|
|
40
|
-
readonly optionalFeatures?:
|
|
67
|
+
readonly optionalFeatures?: TOptionalFeatures;
|
|
41
68
|
/** Framework-core env-vars (PORT, DATABASE_URL, REDIS_URL, …) from
|
|
42
69
|
* `@cosmicdrift/kumiko-dev-server`. Keys here are tagged as source
|
|
43
70
|
* "framework-core" in error output. Conflict-detection runs across
|
|
44
71
|
* core/features/extend as one merged pool — same key declared in two
|
|
45
72
|
* layers throws KumikoBootError at compose-time. */
|
|
46
|
-
readonly core?: z.ZodObject<
|
|
73
|
+
readonly core?: z.ZodObject<TCore>;
|
|
47
74
|
};
|
|
48
|
-
export type ComposedEnvSchema = {
|
|
49
|
-
/** The merged Zod schema
|
|
50
|
-
*
|
|
51
|
-
|
|
52
|
-
* parallel typed schema manually (see Plan-Doc
|
|
53
|
-
* `kumiko-studio/docs/plans/sprint-9-env-schemas.md` → API-Design)
|
|
54
|
-
* and only pass `composed.schema` to `runProdApp` for validation. */
|
|
55
|
-
readonly schema: z.ZodObject<z.ZodRawShape>;
|
|
75
|
+
export type ComposedEnvSchema<TShape extends z.ZodRawShape = z.ZodRawShape> = {
|
|
76
|
+
/** The merged Zod schema, typed from core, the typed feature fragments and
|
|
77
|
+
* extend; `parseEnv(composed.schema, env)` returns the typed env. */
|
|
78
|
+
readonly schema: z.ZodObject<TShape>;
|
|
56
79
|
/** env-var-name → declaring source-name: feature-name from `r.envSchema()`,
|
|
57
80
|
* "app" from `extend`, or "framework-core" from `core`. */
|
|
58
81
|
readonly sources: Readonly<Record<string, string>>;
|
|
@@ -60,7 +83,7 @@ export type ComposedEnvSchema = {
|
|
|
60
83
|
/** Makes the named env keys optional while keeping their `kms` meta. Keys
|
|
61
84
|
* missing from the schema shape are ignored. */
|
|
62
85
|
export declare function withOptionalEnvKeys(schema: z.ZodObject<z.ZodRawShape>, keys: readonly string[]): z.ZodObject<z.ZodRawShape>;
|
|
63
|
-
export declare function composeEnvSchema(options: ComposeEnvSchemaOptions): ComposedEnvSchema
|
|
86
|
+
export declare function composeEnvSchema<const TFeatures extends readonly FeatureDefinition[], TCore extends z.ZodRawShape = EmptyShape, TExtend extends z.ZodRawShape = EmptyShape, const TOptionalFeatures extends readonly string[] | undefined = undefined>(options: ComposeEnvSchemaOptions<TFeatures, TCore, TExtend, TOptionalFeatures>): ComposedEnvSchema<ComposedEnvShape<TFeatures, TCore, TExtend, TOptionalFeatures>>;
|
|
64
87
|
export type EnvErrorKind = "missing" | "invalid";
|
|
65
88
|
export type EnvError = {
|
|
66
89
|
readonly name: string;
|
|
@@ -100,6 +123,21 @@ export declare function parseEnv<S extends z.ZodObject<z.ZodRawShape>>(schema: S
|
|
|
100
123
|
* scheitern. Ersetzt das `({} as Shape)`-Muster, bei dem JEDER Zugriff
|
|
101
124
|
* silent undefined war und das Compile-Level nichts davon wusste. */
|
|
102
125
|
export declare function parseEnvDryRun<S extends z.ZodObject<z.ZodRawShape>>(schema: S, env: Record<string, string | undefined>): Partial<z.infer<S>>;
|
|
126
|
+
export type EnvFieldStatus = "set" | "unset" | "missing" | "invalid";
|
|
127
|
+
export type EnvFieldInspection = {
|
|
128
|
+
readonly name: string;
|
|
129
|
+
readonly klass: EnvFieldClass;
|
|
130
|
+
readonly source: string;
|
|
131
|
+
readonly status: EnvFieldStatus;
|
|
132
|
+
/** Zod's issue text for an invalid value; never the value itself. */
|
|
133
|
+
readonly message?: string;
|
|
134
|
+
};
|
|
135
|
+
/** Checks every field of `schema` on its own against `env`, for the boot dry
|
|
136
|
+
* run: a missing required value is reported, not thrown, so the inventory
|
|
137
|
+
* renders on an empty env. Object-level refinements do not run here; once
|
|
138
|
+
* nothing is missing or invalid, parseEnv validates the whole object. */
|
|
139
|
+
export declare function inspectEnv(schema: z.ZodObject<z.ZodRawShape>, env: Readonly<Record<string, string | undefined>>, options?: Pick<ParseEnvOptions, "sources">): readonly EnvFieldInspection[];
|
|
103
140
|
export declare function camelCase(snakeShout: string): string;
|
|
104
141
|
export declare function pulumiConfigKey(envName: string, field: z.ZodType | undefined, prefix: string | undefined): string;
|
|
105
142
|
export declare function buildPulumiSuggestion(envName: string, field: z.ZodType, prefix: string | undefined): string | undefined;
|
|
143
|
+
export {};
|
package/dist/env/index.js
CHANGED
|
@@ -115,6 +115,18 @@ export function getDefaultValue(field) {
|
|
|
115
115
|
export function getFieldDescription(field) {
|
|
116
116
|
return zodDescription(field);
|
|
117
117
|
}
|
|
118
|
+
function registersEnvSchema(feature, schema) {
|
|
119
|
+
return feature.envSchema === schema;
|
|
120
|
+
}
|
|
121
|
+
/** Returns `feature` typed with the env schema it registered via
|
|
122
|
+
* `r.envSchema(schema)`. Throws when the feature registered another
|
|
123
|
+
* instance, so the type never claims fields the runtime schema lacks. */
|
|
124
|
+
export function featureWithEnvSchema(feature, schema) {
|
|
125
|
+
if (!registersEnvSchema(feature, schema)) {
|
|
126
|
+
throw new Error(`[Feature ${feature.name}] featureWithEnvSchema: the feature did not register this schema instance via r.envSchema().`);
|
|
127
|
+
}
|
|
128
|
+
return feature;
|
|
129
|
+
}
|
|
118
130
|
// `.optional()` returns a new Zod instance that drops `.meta()`, which would
|
|
119
131
|
// hide the slot from `kmsSlotsOf` on the composed schema.
|
|
120
132
|
function optionalKeepingKmsMeta(field) {
|
|
@@ -214,13 +226,17 @@ export function composeEnvSchema(options) {
|
|
|
214
226
|
}
|
|
215
227
|
if (options.extend) {
|
|
216
228
|
for (const [key, field] of Object.entries(zodShape(options.extend))) {
|
|
229
|
+
// An app spreading a feature's own fragment into extend re-declares the
|
|
230
|
+
// same instance; that is the feature's variable, not a second owner.
|
|
231
|
+
if (featureFields.get(key) === field)
|
|
232
|
+
continue;
|
|
217
233
|
if (merged[key] !== undefined) {
|
|
218
234
|
throw new KumikoBootError([
|
|
219
235
|
{
|
|
220
236
|
name: key,
|
|
221
237
|
kind: "invalid",
|
|
222
|
-
message: `env-var conflict: "${key}" declared by
|
|
223
|
-
`
|
|
238
|
+
message: `env-var conflict: "${key}" is declared by "${sources[key]}" and again in the app's extend block — ` +
|
|
239
|
+
`drop it from extend, the declaring source already owns it.`,
|
|
224
240
|
},
|
|
225
241
|
]);
|
|
226
242
|
}
|
|
@@ -230,10 +246,9 @@ export function composeEnvSchema(options) {
|
|
|
230
246
|
}
|
|
231
247
|
}
|
|
232
248
|
declareKmsCiphertextTwins(merged, sources, kmsFields);
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
};
|
|
249
|
+
// @cast-boundary schema-walk — the loops above merge exactly the core, feature and extend shapes the type names; a key clash throws instead of overwriting.
|
|
250
|
+
const schema = z.object(merged);
|
|
251
|
+
return { schema, sources };
|
|
237
252
|
}
|
|
238
253
|
function formatBootError(errors) {
|
|
239
254
|
const lines = [
|
|
@@ -346,6 +361,45 @@ export function parseEnvDryRun(schema, env) {
|
|
|
346
361
|
// per-Feld-safeParse; jeder enthaltene Wert hat seinen Feld-Parse bestanden.
|
|
347
362
|
return out;
|
|
348
363
|
}
|
|
364
|
+
/** Checks every field of `schema` on its own against `env`, for the boot dry
|
|
365
|
+
* run: a missing required value is reported, not thrown, so the inventory
|
|
366
|
+
* renders on an empty env. Object-level refinements do not run here; once
|
|
367
|
+
* nothing is missing or invalid, parseEnv validates the whole object. */
|
|
368
|
+
export function inspectEnv(schema, env, options = {}) {
|
|
369
|
+
const cleaned = {};
|
|
370
|
+
for (const [k, v] of Object.entries(env)) {
|
|
371
|
+
if (v !== undefined)
|
|
372
|
+
cleaned[k] = v;
|
|
373
|
+
}
|
|
374
|
+
const relaxed = relaxCiphertextOnlySlots(schema, cleaned);
|
|
375
|
+
return Object.entries(zodShape(relaxed)).map(([name, field]) => {
|
|
376
|
+
const klass = classifyField(field);
|
|
377
|
+
const source = options.sources?.[name] ?? "unknown";
|
|
378
|
+
const raw = cleaned[name];
|
|
379
|
+
if (raw === undefined) {
|
|
380
|
+
return { name, klass, source, status: klass === "required" ? "missing" : "unset" };
|
|
381
|
+
}
|
|
382
|
+
const issue = firstFieldIssue(field, raw);
|
|
383
|
+
return issue === undefined
|
|
384
|
+
? { name, klass, source, status: "set" }
|
|
385
|
+
: { name, klass, source, status: "invalid", message: issue };
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
function firstFieldIssue(field, raw) {
|
|
389
|
+
try {
|
|
390
|
+
const result = field.safeParse(raw);
|
|
391
|
+
if (result.success)
|
|
392
|
+
return undefined;
|
|
393
|
+
const message = result.error.issues[0]?.message ?? "invalid value";
|
|
394
|
+
// A custom refine message may interpolate the input; the table must not
|
|
395
|
+
// carry it, so such a message is replaced as a whole.
|
|
396
|
+
return raw.length > 0 && message.includes(raw) ? "invalid value" : message;
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
// The thrown message may quote the value, so it is not passed on.
|
|
400
|
+
return "a field refinement threw while checking the value";
|
|
401
|
+
}
|
|
402
|
+
}
|
|
349
403
|
export function camelCase(snakeShout) {
|
|
350
404
|
const parts = snakeShout.toLowerCase().split("_").filter(Boolean);
|
|
351
405
|
if (parts.length === 0)
|
package/dist/errors/classes.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FieldIssue } from "./field-issue.
|
|
2
|
-
import { type ErrorOpts, KumikoError } from "./kumiko-error.
|
|
3
|
-
export type { FieldIssue } from "./field-issue.
|
|
1
|
+
import type { FieldIssue } from "./field-issue.ts";
|
|
2
|
+
import { type ErrorOpts, KumikoError } from "./kumiko-error.ts";
|
|
3
|
+
export type { FieldIssue } from "./field-issue.ts";
|
|
4
4
|
export type ValidationDetails = {
|
|
5
5
|
readonly fields: readonly FieldIssue[];
|
|
6
6
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { KumikoError } from "./kumiko-error.
|
|
1
|
+
import type { KumikoError } from "./kumiko-error.ts";
|
|
2
2
|
/** Links an app's own error reasons to its own docs; without it only framework reasons carry a docsUrl. */
|
|
3
3
|
export type ErrorDocsConfig = {
|
|
4
4
|
readonly baseUrl: string;
|