@cosmicdrift/kumiko-framework 0.388.0 → 0.390.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 +12 -4
- package/README.md +1 -1
- package/agents/examples/apex-surface-auth.md +2 -3
- package/agents/examples/api-worker-split.md +9 -2
- package/agents/examples/auth-claims.md +1 -1
- package/agents/examples/cross-feature-events.md +12 -12
- package/agents/examples/crypto-shredding-hr.md +2 -2
- package/agents/examples/encrypted-tenant-config.md +1 -1
- package/agents/examples/error-contract.md +12 -7
- package/agents/examples/event-sourcing.md +29 -29
- package/agents/examples/files-post-processing.md +10 -8
- package/agents/examples/golden-path.md +13 -1
- package/agents/examples/inbound-mail-triage.md +1 -0
- package/agents/examples/lane-routing.md +2 -1
- package/agents/examples/legal-pages.md +2 -2
- package/agents/examples/lifecycle-hooks.md +55 -2
- package/agents/examples/list-table-options.md +466 -0
- package/agents/examples/managed-config.md +4 -4
- package/agents/examples/managed-pages.md +1 -1
- package/agents/examples/pdf-audit-export.md +4 -2
- package/agents/examples/relations.md +19 -4
- package/agents/examples/search.md +4 -4
- package/agents/examples/secrets-demo.md +9 -6
- package/agents/examples/state-machine.md +5 -4
- package/agents/examples/tenant-isolation.md +73 -1
- package/agents/examples/tenant-settings.md +1 -1
- package/agents/examples/user-data-rights.md +3 -6
- package/agents/examples/workflow-engine.md +53 -47
- package/agents/examples.md +5 -4
- package/agents/features.md +1 -1
- package/agents/widgets.md +1 -0
- package/dist/api/api-constants.d.ts +1 -0
- package/dist/api/api-constants.js +2 -0
- package/dist/api/auth-middleware.js +1 -1
- package/dist/api/auth-routes-invite.js +2 -1
- package/dist/api/auth-routes-shared.d.ts +2 -0
- package/dist/api/auth-routes-shared.js +5 -0
- package/dist/api/client-error-route.js +2 -3
- package/dist/api/entity-read-access.d.ts +4 -1
- package/dist/api/entity-read-access.js +14 -0
- package/dist/api/export/export-cells-reference.d.ts +9 -0
- package/dist/api/export/export-cells-reference.js +21 -0
- package/dist/api/export/export-cells.d.ts +11 -0
- package/dist/api/export/export-cells.js +136 -0
- package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
- package/dist/api/export/export-ciphertext-guard.js +27 -0
- package/dist/api/export/export-columns.d.ts +31 -0
- package/dist/api/export/export-columns.js +85 -0
- package/dist/api/export/export-errors.d.ts +4 -0
- package/dist/api/export/export-errors.js +14 -0
- package/dist/api/export/export-route.d.ts +4 -0
- package/dist/api/export/export-route.js +75 -0
- package/dist/api/export/export-rows.d.ts +13 -0
- package/dist/api/export/export-rows.js +62 -0
- package/dist/api/export/export-screen.d.ts +13 -0
- package/dist/api/export/export-screen.js +47 -0
- package/dist/api/export/export-xlsx-writer.d.ts +4 -0
- package/dist/api/export/export-xlsx-writer.js +21 -0
- package/dist/api/extra-route.d.ts +7 -1
- package/dist/api/index.d.ts +23 -27
- package/dist/api/index.js +13 -15
- package/dist/api/jwt.js +1 -1
- package/dist/api/observability-middleware.d.ts +1 -1
- package/dist/api/observability-middleware.js +2 -1
- package/dist/api/pii-leak-guard.d.ts +3 -0
- package/dist/api/pii-leak-guard.js +3 -2
- package/dist/api/request-context-internals.d.ts +31 -0
- package/dist/api/request-context-internals.js +11 -0
- package/dist/api/request-context-scopes.d.ts +14 -0
- package/dist/api/request-context-scopes.js +69 -0
- package/dist/api/request-context.d.ts +1 -40
- package/dist/api/request-context.js +22 -51
- package/dist/api/request-id-middleware.d.ts +1 -1
- package/dist/api/route-registrars.d.ts +2 -1
- package/dist/api/route-registrars.js +1 -1
- package/dist/api/routes.d.ts +16 -0
- package/dist/api/routes.js +9 -5
- package/dist/api/server-boot-checks.d.ts +1 -1
- package/dist/api/server-boot-checks.js +2 -2
- package/dist/api/server-event-dispatcher.d.ts +6 -1
- package/dist/api/server-event-dispatcher.js +3 -4
- package/dist/api/server-extra-routes.d.ts +1 -1
- package/dist/api/server-extra-routes.js +5 -1
- package/dist/api/server-middleware.js +3 -1
- package/dist/api/server-routes.d.ts +3 -2
- package/dist/api/server-routes.js +8 -2
- package/dist/api/server-wiring.js +8 -4
- package/dist/api/server.d.ts +2 -1
- package/dist/api/sse-route.d.ts +3 -1
- package/dist/api/sse-route.js +11 -1
- package/dist/api/tenant-scoped-secrets.d.ts +2 -0
- package/dist/api/tenant-scoped-secrets.js +13 -0
- package/dist/api/websocket-route.d.ts +1 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/roles.d.ts +0 -5
- package/dist/compliance/duration-spec.d.ts +0 -1
- package/dist/compliance/duration-spec.js +0 -5
- package/dist/compliance/index.d.ts +4 -4
- package/dist/compliance/index.js +2 -2
- package/dist/compliance/profiles.d.ts +0 -15
- package/dist/compliance/profiles.js +0 -23
- package/dist/config/index.d.ts +11 -9
- package/dist/config/index.js +13 -1
- package/dist/config/internals.d.ts +9 -0
- package/dist/config/internals.js +1 -0
- package/dist/consumer-cli-internals.d.ts +4 -0
- package/dist/consumer-cli-internals.js +1 -0
- package/dist/consumer-cli.d.ts +1 -4
- package/dist/consumer-cli.js +5 -1
- package/dist/crypto/event-pii.js +1 -1
- package/dist/crypto/index.d.ts +8 -9
- package/dist/crypto/index.js +7 -8
- package/dist/crypto/pg-kms-adapter.d.ts +1 -0
- package/dist/crypto/pg-kms-adapter.js +17 -18
- package/dist/db/aggregate-sql.d.ts +2 -0
- package/dist/db/aggregate-sql.js +10 -0
- package/dist/db/apply-entity-event.d.ts +1 -1
- package/dist/db/apply-entity-event.js +15 -47
- package/dist/db/blind-index-cleanup.js +91 -77
- package/dist/db/closed-connection.js +12 -19
- package/dist/db/collect-table-metas.js +1 -1
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +0 -7
- package/dist/db/config-seed.d.ts +2 -1
- package/dist/db/config-seed.js +6 -1
- package/dist/db/connection.d.ts +7 -6
- package/dist/db/connection.js +43 -24
- package/dist/db/cross-tenant-reads.d.ts +1 -1
- package/dist/db/cross-tenant-reads.js +1 -1
- package/dist/db/dialect.d.ts +0 -5
- package/dist/db/dialect.js +0 -3
- package/dist/db/driver-row-coercion.js +4 -4
- package/dist/db/driver-value-preparation.js +6 -4
- package/dist/db/eagerload.d.ts +2 -1
- package/dist/db/entity-field-encryption.d.ts +1 -1
- package/dist/db/entity-table-meta.d.ts +1 -1
- package/dist/db/event-store-executor-context.d.ts +3 -1
- package/dist/db/event-store-executor-context.js +4 -3
- package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
- package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
- package/dist/db/event-store-executor-read-aggregate.js +36 -5
- package/dist/db/event-store-executor-read-filter.d.ts +1 -1
- package/dist/db/event-store-executor-read-filter.js +6 -3
- package/dist/db/event-store-executor-read-rows.d.ts +2 -1
- package/dist/db/event-store-executor-read-search.d.ts +2 -1
- package/dist/db/event-store-executor-read-sort.d.ts +2 -1
- package/dist/db/event-store-executor-read.js +2 -2
- package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
- package/dist/db/event-store-executor-write-atomic.js +42 -0
- package/dist/db/event-store-executor-write-steps.d.ts +3 -5
- package/dist/db/event-store-executor-write-steps.js +0 -5
- package/dist/db/event-store-executor-write.js +22 -19
- package/dist/db/event-store-executor.d.ts +1 -1
- package/dist/db/event-store-executor.js +2 -1
- package/dist/db/executor-managed-tables.d.ts +7 -1
- package/dist/db/executor-managed-tables.js +12 -3
- package/dist/db/index.d.ts +29 -28
- package/dist/db/index.js +22 -20
- package/dist/db/known-table-names.d.ts +6 -0
- package/dist/db/known-table-names.js +21 -0
- package/dist/db/list-aggregate-labels.d.ts +1 -1
- package/dist/db/located-timestamp.d.ts +1 -1
- package/dist/db/located-timestamp.js +0 -5
- package/dist/db/migrate-generator.d.ts +17 -1
- package/dist/db/migrate-generator.js +50 -20
- package/dist/db/migrate-primary-key.d.ts +12 -0
- package/dist/db/migrate-primary-key.js +45 -0
- package/dist/db/migrate-rls-diff.d.ts +20 -0
- package/dist/db/migrate-rls-diff.js +61 -0
- package/dist/db/migrate-runner.js +7 -3
- package/dist/db/money.d.ts +1 -1
- package/dist/db/money.js +1 -1
- package/dist/db/parent-ref-clause.d.ts +2 -1
- package/dist/db/pg-error.d.ts +2 -0
- package/dist/db/pg-error.js +37 -21
- package/dist/db/queries/backfill-pii.js +3 -6
- package/dist/db/queries/database-now.js +2 -1
- package/dist/db/queries/ddl.d.ts +3 -0
- package/dist/db/queries/ddl.js +34 -1
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/event-tenants.d.ts +2 -0
- package/dist/db/queries/event-tenants.js +17 -0
- package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
- package/dist/db/queries/rebuild-rls-guard.js +29 -0
- package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
- package/dist/db/queries/rls-boot-catalog.js +39 -0
- package/dist/db/queries/rls-catalog.d.ts +6 -0
- package/dist/db/queries/rls-catalog.js +82 -0
- package/dist/db/queries/rls-scope.d.ts +3 -0
- package/dist/db/queries/rls-scope.js +17 -0
- package/dist/db/queries/rls-shape.d.ts +10 -0
- package/dist/db/queries/rls-shape.js +42 -0
- package/dist/db/queries/session-advisory-lock.d.ts +2 -0
- package/dist/db/queries/session-advisory-lock.js +23 -0
- package/dist/db/queries/shadow-swap.d.ts +1 -2
- package/dist/db/queries/shadow-swap.js +11 -28
- package/dist/db/queries/test-stack.d.ts +4 -1
- package/dist/db/queries/test-stack.js +83 -2
- package/dist/db/query.d.ts +14 -0
- package/dist/db/query.js +77 -48
- package/dist/db/reference-data.d.ts +1 -1
- package/dist/db/reference-data.js +20 -3
- package/dist/db/render-ddl.d.ts +6 -2
- package/dist/db/render-ddl.js +7 -7
- package/dist/db/render-rls-ddl.d.ts +35 -0
- package/dist/db/render-rls-ddl.js +127 -0
- package/dist/db/replay-migration-sql.d.ts +3 -1
- package/dist/db/replay-migration-sql.js +22 -5
- package/dist/db/replay-rls.d.ts +25 -0
- package/dist/db/replay-rls.js +156 -0
- package/dist/db/row-level-security-boot-check.d.ts +5 -0
- package/dist/db/row-level-security-boot-check.js +85 -0
- package/dist/db/row-level-security-connection.d.ts +3 -0
- package/dist/db/row-level-security-connection.js +213 -0
- package/dist/db/row-level-security-scope.d.ts +33 -0
- package/dist/db/row-level-security-scope.js +127 -0
- package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
- package/dist/db/scope-tenant-db-to-tenant.js +14 -0
- package/dist/db/sql-identifier.d.ts +1 -0
- package/dist/db/sql-identifier.js +3 -0
- package/dist/db/statement-timeout.js +2 -1
- package/dist/db/table-builder.d.ts +2 -1
- package/dist/db/table-builder.js +1 -1
- package/dist/db/table-info.js +1 -1
- package/dist/db/table-push.d.ts +11 -2
- package/dist/db/table-push.js +15 -2
- package/dist/db/tenant-db-runner.d.ts +3 -1
- package/dist/db/tenant-db-runner.js +4 -3
- package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
- package/dist/db/tenant-db-scoped-rebind.js +33 -0
- package/dist/db/tenant-db-statement-runner.d.ts +13 -0
- package/dist/db/tenant-db-statement-runner.js +48 -0
- package/dist/db/tenant-db-upsert.d.ts +5 -0
- package/dist/db/tenant-db-upsert.js +91 -0
- package/dist/db/tenant-db.d.ts +17 -12
- package/dist/db/tenant-db.js +60 -121
- package/dist/db/tenant-id-filter.d.ts +3 -0
- package/dist/db/tenant-id-filter.js +30 -0
- package/dist/db/transaction-serialization.d.ts +6 -0
- package/dist/db/transaction-serialization.js +60 -0
- package/dist/derivatives/delete-stored-file.js +1 -1
- package/dist/derivatives/index.d.ts +2 -5
- package/dist/derivatives/index.js +2 -3
- package/dist/engine/access.d.ts +2 -1
- package/dist/engine/access.js +1 -1
- package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
- package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
- package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
- package/dist/engine/boot-validator/entity-handler.js +1 -1
- package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
- package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
- package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
- package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
- package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
- package/dist/engine/boot-validator/list-column-layout.js +41 -0
- package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
- package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
- package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
- package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
- package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
- package/dist/engine/boot-validator/list-table-export-options.js +27 -0
- package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
- package/dist/engine/boot-validator/list-table-options.js +77 -0
- package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
- package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
- package/dist/engine/boot-validator/nav.d.ts +3 -1
- package/dist/engine/boot-validator/nav.js +1 -1
- package/dist/engine/boot-validator/ownership.d.ts +2 -1
- package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
- package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
- package/dist/engine/boot-validator/projection-list-screens.js +3 -13
- package/dist/engine/boot-validator/query-refs.d.ts +2 -1
- package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
- package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
- package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
- package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
- package/dist/engine/boot-validator/screens-lists.js +12 -2
- package/dist/engine/boot-validator/screens.d.ts +2 -1
- package/dist/engine/boot-validator/workspaces.d.ts +3 -1
- package/dist/engine/bridge-stub.d.ts +5 -2
- package/dist/engine/bridge-stub.js +39 -24
- package/dist/engine/build-app-schema.d.ts +2 -1
- package/dist/engine/build-app-schema.js +9 -1
- package/dist/engine/build-config-feature-schema.js +6 -1
- package/dist/engine/config-helpers.d.ts +2 -2
- package/dist/engine/config-helpers.js +0 -9
- package/dist/engine/constants.d.ts +0 -10
- package/dist/engine/constants.js +0 -8
- package/dist/engine/create-app.js +1 -1
- package/dist/engine/define-feature.d.ts +2 -1
- package/dist/engine/define-feature.js +5 -2
- package/dist/engine/define-handler.d.ts +1 -1
- package/dist/engine/define-step.d.ts +0 -1
- package/dist/engine/define-step.js +0 -3
- package/dist/engine/embedded-derived.d.ts +1 -1
- package/dist/engine/entity-handlers.d.ts +2 -1
- package/dist/engine/entity-handlers.js +7 -7
- package/dist/engine/entity-list-runtime-options.js +3 -1
- package/dist/engine/entity-list-searchability.d.ts +2 -1
- package/dist/engine/event-def.d.ts +2 -1
- package/dist/engine/event-helpers.d.ts +3 -1
- package/dist/engine/event-helpers.js +3 -3
- package/dist/engine/extension-names.d.ts +2 -8
- package/dist/engine/extension-names.js +2 -2
- package/dist/engine/extension-selector-plugins.d.ts +1 -1
- package/dist/engine/extensions/storage-provider.d.ts +1 -2
- package/dist/engine/extensions/user-data.d.ts +0 -8
- package/dist/engine/factories.d.ts +2 -1
- package/dist/engine/feature-builder-state.d.ts +9 -1
- package/dist/engine/feature-builder-state.js +1 -0
- package/dist/engine/feature-changelog.d.ts +1 -1
- package/dist/engine/feature-config-events-jobs.d.ts +4 -1
- package/dist/engine/feature-entity-handlers.d.ts +5 -1
- package/dist/engine/feature-manifest.d.ts +1 -0
- package/dist/engine/feature-manifest.js +2 -1
- package/dist/engine/feature-ui-extensions.d.ts +7 -1
- package/dist/engine/feature-ui-extensions.js +6 -4
- package/dist/engine/field-access.d.ts +3 -1
- package/dist/engine/field-access.js +12 -0
- package/dist/engine/handler-field-references.d.ts +0 -4
- package/dist/engine/index.d.ts +58 -55
- package/dist/engine/index.js +23 -28
- package/dist/engine/instruction-fields.d.ts +1 -1
- package/dist/engine/personal-data-fields.d.ts +1 -1
- package/dist/engine/qualified-name.d.ts +0 -1
- package/dist/engine/read-claim.d.ts +2 -1
- package/dist/engine/registry-facade.js +0 -3
- package/dist/engine/registry-ingest.d.ts +2 -1
- package/dist/engine/registry-ingest.js +1 -2
- package/dist/engine/registry-state.d.ts +12 -2
- package/dist/engine/registry-state.js +2 -3
- package/dist/engine/registry-validate.d.ts +3 -1
- package/dist/engine/registry-validate.js +7 -7
- package/dist/engine/run-in.d.ts +1 -1
- package/dist/engine/run-in.js +0 -1
- package/dist/engine/schema-builder.d.ts +1 -1
- package/dist/engine/schema-builder.js +1 -1
- package/dist/engine/screen-filter-ops.d.ts +2 -1
- package/dist/engine/screen-filter-ops.js +2 -5
- package/dist/engine/soft-delete-cleanup.d.ts +1 -1
- package/dist/engine/soft-delete-cleanup.js +4 -4
- package/dist/engine/state-machine.js +2 -1
- package/dist/engine/steps/_read-source.js +1 -1
- package/dist/engine/steps/aggregate-append-event.js +2 -2
- package/dist/engine/steps/call-feature.js +2 -2
- package/dist/engine/steps/mail-send.js +1 -1
- package/dist/engine/steps/retry.js +1 -1
- package/dist/engine/steps/wait-for-event.js +1 -1
- package/dist/engine/steps/wait.js +1 -1
- package/dist/engine/steps/webhook-send.js +1 -1
- package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
- package/dist/engine/template-variables.d.ts +2 -1
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/feature.d.ts +1 -0
- package/dist/engine/types/index.d.ts +8 -30
- package/dist/engine/types/index.js +2 -10
- package/dist/engine/types/screen.d.ts +1 -1
- package/dist/engine/types/screen.js +1 -1
- package/dist/engine/validation.d.ts +2 -1
- package/dist/entrypoint/index.d.ts +9 -35
- package/dist/entrypoint/index.js +10 -1
- package/dist/entrypoint/internals.d.ts +40 -0
- package/dist/entrypoint/internals.js +1 -0
- package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
- package/dist/entrypoint/row-level-security-mode-check.js +19 -0
- package/dist/env/dry-run-internals.d.ts +10 -0
- package/dist/env/dry-run-internals.js +1 -0
- package/dist/env/dry-run.d.ts +1 -10
- package/dist/env/dry-run.js +2 -1
- package/dist/env/index.d.ts +1 -85
- package/dist/env/index.js +6 -50
- package/dist/env/internals.d.ts +87 -0
- package/dist/env/internals.js +53 -0
- package/dist/errors/classes.js +2 -2
- package/dist/errors/index.d.ts +5 -14
- package/dist/errors/index.js +4 -9
- package/dist/errors/member-resolution.js +1 -1
- package/dist/errors/reasons.d.ts +0 -1
- package/dist/errors/reasons.js +7 -7
- package/dist/errors/serialize.d.ts +0 -18
- package/dist/errors/serialize.js +0 -27
- package/dist/es-ops/index.d.ts +4 -4
- package/dist/es-ops/index.js +2 -2
- package/dist/es-ops/operations-schema.d.ts +1 -1
- package/dist/es-ops/types.d.ts +4 -5
- package/dist/event-store/admin-api-internals.d.ts +14 -0
- package/dist/event-store/admin-api-internals.js +1 -0
- package/dist/event-store/admin-api.d.ts +1 -14
- package/dist/event-store/admin-api.js +11 -6
- package/dist/event-store/archive.js +4 -2
- package/dist/event-store/errors.js +2 -2
- package/dist/event-store/event-store.d.ts +1 -0
- package/dist/event-store/event-store.js +42 -32
- package/dist/event-store/events-schema.js +4 -1
- package/dist/event-store/index.d.ts +11 -13
- package/dist/event-store/index.js +7 -9
- package/dist/event-store/provenance-append.js +1 -1
- package/dist/event-store/rebuild-dead-letter.js +4 -2
- package/dist/event-store/snapshot.js +4 -3
- package/dist/event-store/stream-scope.d.ts +2 -0
- package/dist/event-store/stream-scope.js +6 -0
- package/dist/event-store/upcaster-dead-letter.js +4 -2
- package/dist/event-store/upcaster.d.ts +2 -1
- package/dist/files/action-form-upload.d.ts +2 -1
- package/dist/files/action-form-upload.js +1 -1
- package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
- package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
- package/dist/files/bind-pending-file-refs.d.ts +2 -1
- package/dist/files/bind-pending-file-refs.js +2 -1
- package/dist/files/bind-referenced-files.write.js +1 -1
- package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
- package/dist/files/create-file-ref-from-bytes.js +6 -3
- package/dist/files/create-file-ref.d.ts +6 -2
- package/dist/files/create-file-ref.js +13 -4
- package/dist/files/dispose-removed-file-refs.d.ts +2 -1
- package/dist/files/dispose-removed-file-refs.js +1 -1
- package/dist/files/feature.js +2 -2
- package/dist/files/file-handle.js +1 -1
- package/dist/files/file-routes.d.ts +3 -1
- package/dist/files/file-routes.js +41 -4
- package/dist/files/index.d.ts +11 -13
- package/dist/files/index.js +5 -7
- package/dist/files/load-save-file-refs.d.ts +2 -1
- package/dist/files/load-save-file-refs.js +1 -1
- package/dist/files/provider-resolver.d.ts +6 -4
- package/dist/files/provider-resolver.js +5 -5
- package/dist/files/record-write-check.d.ts +6 -0
- package/dist/files/record-write-check.js +13 -0
- package/dist/files/storage-tracking.js +4 -2
- package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
- package/dist/files/sweep-orphaned-uploads.js +1 -1
- package/dist/files/upload-ledger.d.ts +2 -2
- package/dist/files/upload-ledger.js +4 -4
- package/dist/i18n/index.d.ts +2 -8
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/internals.d.ts +7 -0
- package/dist/i18n/internals.js +1 -0
- package/dist/i18n/required-surface-keys.d.ts +4 -1
- package/dist/i18n/required-surface-keys.js +7 -2
- package/dist/internal/row-level-security.d.ts +3 -0
- package/dist/internal/row-level-security.js +3 -0
- package/dist/internal/stack-support.d.ts +1 -1
- package/dist/internal/stack-support.js +1 -1
- package/dist/internal/testing.d.ts +1 -0
- package/dist/internal/testing.js +10 -6
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/job-append-event.d.ts +12 -0
- package/dist/jobs/job-append-event.js +30 -0
- package/dist/jobs/job-runner-context.d.ts +2 -2
- package/dist/jobs/job-runner-context.js +46 -16
- package/dist/jobs/job-runner-execution.d.ts +1 -1
- package/dist/jobs/job-runner-execution.js +6 -4
- package/dist/jobs/job-runner-gates.d.ts +1 -1
- package/dist/jobs/job-runner-gates.js +0 -1
- package/dist/jobs/job-runner-helpers.d.ts +11 -4
- package/dist/jobs/job-runner-helpers.js +10 -1
- package/dist/jobs/job-runner-scope.d.ts +5 -2
- package/dist/jobs/job-runner-scope.js +6 -6
- package/dist/jobs/job-runner-types.d.ts +2 -1
- package/dist/jobs/job-runner.js +22 -6
- package/dist/jobs/max-per-tenant.d.ts +1 -1
- package/dist/logging/index.d.ts +1 -2
- package/dist/logging/index.js +1 -1
- package/dist/logging/pino-logger.js +1 -1
- package/dist/logging/utils.d.ts +1 -0
- package/dist/logging/utils.js +6 -0
- package/dist/migrations/index.d.ts +3 -3
- package/dist/migrations/index.js +3 -3
- package/dist/migrations/pending-rebuilds.d.ts +1 -1
- package/dist/migrations/pending-rebuilds.js +1 -1
- package/dist/migrations/pii-event-backfill.js +4 -1
- package/dist/observability/escape-hatch-report.d.ts +2 -1
- package/dist/observability/escape-hatch-report.js +9 -2
- package/dist/observability/index.d.ts +7 -15
- package/dist/observability/index.js +4 -12
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.d.ts +0 -1
- package/dist/observability/metrics-handle.js +2 -15
- package/dist/observability/recording-tracer.d.ts +1 -2
- package/dist/observability/recording-tracer.js +0 -6
- package/dist/observability/sensitive-filter.d.ts +0 -2
- package/dist/observability/sensitive-filter.js +0 -29
- package/dist/pipeline/active-membership.d.ts +2 -1
- package/dist/pipeline/active-membership.js +6 -2
- package/dist/pipeline/after-rollback-sink.d.ts +6 -0
- package/dist/pipeline/after-rollback-sink.js +32 -0
- package/dist/pipeline/append-event-core.d.ts +2 -1
- package/dist/pipeline/append-event-core.js +2 -2
- package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
- package/dist/pipeline/attach-outside-transaction.js +13 -0
- package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
- package/dist/pipeline/cascade-handler.d.ts +2 -1
- package/dist/pipeline/cascade-handler.js +3 -2
- package/dist/pipeline/config-accessor-factory.d.ts +1 -1
- package/dist/pipeline/config-accessor-factory.js +1 -1
- package/dist/pipeline/context-services.d.ts +56 -0
- package/dist/pipeline/context-services.js +73 -0
- package/dist/pipeline/dispatch-batch.d.ts +2 -1
- package/dist/pipeline/dispatch-batch.js +39 -19
- package/dist/pipeline/dispatch-query.js +5 -4
- package/dist/pipeline/dispatch-scope.d.ts +6 -0
- package/dist/pipeline/dispatch-scope.js +27 -0
- package/dist/pipeline/dispatch-shared.d.ts +13 -9
- package/dist/pipeline/dispatch-shared.js +75 -194
- package/dist/pipeline/dispatch-stream.js +8 -4
- package/dist/pipeline/dispatch-write.d.ts +2 -1
- package/dist/pipeline/dispatch-write.js +10 -8
- package/dist/pipeline/dispatcher-utils.d.ts +3 -1
- package/dist/pipeline/dispatcher-utils.js +8 -2
- package/dist/pipeline/dispatcher.d.ts +3 -2
- package/dist/pipeline/dispatcher.js +4 -3
- package/dist/pipeline/event-consumer-state.d.ts +0 -1
- package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
- package/dist/pipeline/event-dispatcher-delivery.js +7 -3
- package/dist/pipeline/event-dispatcher.d.ts +3 -2
- package/dist/pipeline/event-dispatcher.js +13 -12
- package/dist/pipeline/event-retention.js +59 -56
- package/dist/pipeline/handler-access-error.js +2 -1
- package/dist/pipeline/handler-context-auth.d.ts +5 -6
- package/dist/pipeline/handler-context-auth.js +7 -4
- package/dist/pipeline/handler-context-config.d.ts +2 -5
- package/dist/pipeline/handler-context-config.js +2 -2
- package/dist/pipeline/handler-context-db.d.ts +32 -7
- package/dist/pipeline/handler-context-db.js +26 -17
- package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
- package/dist/pipeline/handler-context-dispatch.js +18 -5
- package/dist/pipeline/handler-context-events.d.ts +22 -38
- package/dist/pipeline/handler-context-events.js +42 -35
- package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
- package/dist/pipeline/handler-context-member-resolution.js +110 -0
- package/dist/pipeline/handler-context-notify.d.ts +3 -2
- package/dist/pipeline/handler-context-notify.js +1 -1
- package/dist/pipeline/handler-context-observability.d.ts +2 -4
- package/dist/pipeline/handler-context-observability.js +7 -5
- package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
- package/dist/pipeline/handler-context-phase-denials.js +98 -0
- package/dist/pipeline/handler-context-scope.d.ts +7 -10
- package/dist/pipeline/handler-context-scope.js +18 -20
- package/dist/pipeline/index.d.ts +9 -21
- package/dist/pipeline/index.js +5 -7
- package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
- package/dist/pipeline/irreversible-operation-gate.js +2 -2
- package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
- package/dist/pipeline/lifecycle-pipeline.js +9 -15
- package/dist/pipeline/member-read-only-transaction.js +11 -3
- package/dist/pipeline/member-reader.d.ts +1 -1
- package/dist/pipeline/member-reader.js +2 -2
- package/dist/pipeline/msp-rebuild.js +5 -3
- package/dist/pipeline/multi-stream-apply-context.js +3 -2
- package/dist/pipeline/notify-scope.d.ts +2 -1
- package/dist/pipeline/pre-handler-gates.d.ts +2 -1
- package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
- package/dist/pipeline/pre-transaction-reservations.js +9 -7
- package/dist/pipeline/projection-rebuild.js +12 -5
- package/dist/pipeline/projection-state.d.ts +0 -6
- package/dist/pipeline/projection-state.js +0 -5
- package/dist/pipeline/projections-runner.d.ts +2 -1
- package/dist/pipeline/projections-runner.js +10 -6
- package/dist/pipeline/system-hooks.d.ts +6 -2
- package/dist/pipeline/system-hooks.js +61 -10
- package/dist/pipeline/system-identity-switch.d.ts +4 -2
- package/dist/pipeline/system-identity-switch.js +51 -36
- package/dist/pipeline/typed-append-event.d.ts +2 -0
- package/dist/pipeline/typed-append-event.js +4 -0
- package/dist/pipeline/write-origin.js +2 -2
- package/dist/pipeline/write-result-masking.d.ts +1 -1
- package/dist/pipeline/write-result-masking.js +13 -10
- package/dist/random/index.d.ts +1 -2
- package/dist/random/index.js +1 -2
- package/dist/rate-limit/bucket.d.ts +2 -1
- package/dist/rate-limit/middleware.js +2 -1
- package/dist/redis/index.d.ts +3 -4
- package/dist/redis/index.js +2 -2
- package/dist/schema-cli/apply-command.js +5 -2
- package/dist/schema-cli/baseline-command.js +7 -2
- package/dist/schema-cli/generate-command.js +7 -9
- package/dist/schema-cli/shared.d.ts +4 -0
- package/dist/schema-cli/shared.js +21 -2
- package/dist/schema-cli/status-command.js +8 -2
- package/dist/schema-cli/validate-command.js +52 -4
- package/dist/schema-cli.d.ts +0 -1
- package/dist/search/configure-tenant-index.d.ts +1 -3
- package/dist/search/configure-tenant-index.js +0 -4
- package/dist/search/index.d.ts +1 -4
- package/dist/search/index.js +0 -2
- package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
- package/dist/search/meilisearch-adapter-internals.js +9 -0
- package/dist/search/meilisearch-adapter.d.ts +1 -8
- package/dist/search/meilisearch-adapter.js +6 -7
- package/dist/search/meilisearch-peer.d.ts +2 -0
- package/dist/search/meilisearch-peer.js +5 -0
- package/dist/search/reindex-entity.js +107 -91
- package/dist/secrets/index.d.ts +3 -4
- package/dist/secrets/index.js +2 -3
- package/dist/seeding/index.d.ts +2 -2
- package/dist/seeding/index.js +1 -2
- package/dist/time/index.d.ts +2 -2
- package/dist/time/index.js +1 -1
- package/dist/time/tz-context.d.ts +0 -5
- package/dist/time/tz-context.js +0 -9
- package/dist/ui-types/index.d.ts +8 -11
- package/dist/ui-types/index.js +3 -3
- package/dist/upgrade-changelog.d.ts +3 -0
- package/dist/upgrade-changelog.js +18 -0
- package/dist/upgrade-cli-internals.d.ts +8 -0
- package/dist/upgrade-cli-internals.js +63 -0
- package/dist/upgrade-cli.d.ts +1 -18
- package/dist/upgrade-cli.js +29 -137
- package/dist/upgrade-marker-parse.d.ts +32 -0
- package/dist/upgrade-marker-parse.js +73 -0
- package/dist/utils/import-optional-peer.d.ts +6 -0
- package/dist/utils/import-optional-peer.js +19 -0
- package/dist/utils/index.d.ts +1 -4
- package/dist/utils/index.js +1 -4
- package/package.json +27 -20
- package/src/changes.json +451 -0
- package/dist/crypto/request-kms-cache.d.ts +0 -8
- package/dist/crypto/request-kms-cache.js +0 -21
- package/dist/engine/codemod/index.d.ts +0 -2
- package/dist/engine/codemod/index.js +0 -1
- package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
- package/dist/engine/codemod/pipeline-codemod.js +0 -536
- package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
- package/dist/engine/feature-ast/entity-field-types.js +0 -35
- package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
- package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
- package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
- package/dist/engine/feature-ast/extractors/events.js +0 -275
- package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/handlers.js +0 -358
- package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/hooks.js +0 -248
- package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
- package/dist/engine/feature-ast/extractors/index.js +0 -13
- package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
- package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
- package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
- package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
- package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
- package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
- package/dist/engine/feature-ast/extractors/round1.js +0 -81
- package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/round2.js +0 -191
- package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
- package/dist/engine/feature-ast/extractors/round3.js +0 -292
- package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
- package/dist/engine/feature-ast/extractors/round5.js +0 -68
- package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
- package/dist/engine/feature-ast/extractors/round6.js +0 -17
- package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
- package/dist/engine/feature-ast/extractors/shared.js +0 -343
- package/dist/engine/feature-ast/index.d.ts +0 -16
- package/dist/engine/feature-ast/index.js +0 -10
- package/dist/engine/feature-ast/parse.d.ts +0 -31
- package/dist/engine/feature-ast/parse.js +0 -483
- package/dist/engine/feature-ast/patch.d.ts +0 -210
- package/dist/engine/feature-ast/patch.js +0 -610
- package/dist/engine/feature-ast/patcher.d.ts +0 -217
- package/dist/engine/feature-ast/patcher.js +0 -281
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
- package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
- package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
- package/dist/engine/feature-ast/patterns.d.ts +0 -318
- package/dist/engine/feature-ast/patterns.js +0 -106
- package/dist/engine/feature-ast/render.d.ts +0 -47
- package/dist/engine/feature-ast/render.js +0 -662
- package/dist/engine/feature-ast/source-location.d.ts +0 -17
- package/dist/engine/feature-ast/source-location.js +0 -27
- package/dist/engine/pattern-library/index.d.ts +0 -2
- package/dist/engine/pattern-library/index.js +0 -3
- package/dist/engine/pattern-library/library.d.ts +0 -14
- package/dist/engine/pattern-library/library.js +0 -93
- package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
- package/dist/engine/pattern-library/mixed-schemas.js +0 -559
- package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
- package/dist/engine/pattern-library/opaque-schemas.js +0 -115
- package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
- package/dist/engine/pattern-library/shared-fields.js +0 -88
- package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
- package/dist/engine/pattern-library/static-schemas.js +0 -478
- package/dist/engine/pattern-library/types.d.ts +0 -158
- package/dist/engine/pattern-library/types.js +0 -36
- package/dist/engine/provider-plugin-context.d.ts +0 -3
- package/dist/engine/provider-plugin-context.js +0 -28
- package/dist/engine/resolve-config-or-param.d.ts +0 -18
- package/dist/engine/resolve-config-or-param.js +0 -76
- package/src/scripts/codemod/README.md +0 -187
- package/src/scripts/codemod/codemod-support.ts +0 -334
- package/src/scripts/codemod/collect-source-files.ts +0 -48
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
- package/src/scripts/codemod/db-factory.ts +0 -810
- package/src/scripts/codemod/feature-factory.ts +0 -429
- package/src/scripts/codemod/feature-layout.ts +0 -424
- package/src/scripts/codemod/import-extensions.ts +0 -118
- package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
- package/src/scripts/codemod/migrate-db-raw.ts +0 -401
- package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
- package/src/scripts/codemod/object-form.ts +0 -746
- package/src/scripts/codemod/package-merge.ts +0 -299
- package/src/scripts/codemod/pii-personal-migration.ts +0 -816
- package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
- package/src/scripts/codemod/s3-imports.ts +0 -236
- package/src/scripts/codemod/tenant-db-options.ts +0 -454
- package/src/scripts/codemod/testing-injection.ts +0 -215
- package/src/scripts/codemod/testing-move-targets.ts +0 -161
- package/src/scripts/codemod/testing-move.ts +0 -542
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isListQueryWithoutSearchableFields, resolveEntityBehindListQuery, } from "../entity-list-searchability.js";
|
|
2
2
|
import { QnTypes, qualifyEntityName } from "../qualified-name.js";
|
|
3
3
|
import { isEditLayoutScreen } from "../screen-helpers.js";
|
|
4
|
-
import { relatedListGroupHeaderLabel, relatedListGroupKey, } from "../types/index.js";
|
|
5
4
|
import { SEARCHABLE_FALSE_WHITELIST } from "./entity-list-screens.js";
|
|
5
|
+
import { validateListTableAggregateQuery } from "./list-table-aggregate-query.js";
|
|
6
6
|
import { findEntity } from "./parent-ref.js";
|
|
7
7
|
import { getZodObjectShape } from "./zod-shape.js";
|
|
8
8
|
// Sibling to entity-list-screens.ts rather than an extension of it:
|
|
@@ -66,6 +66,7 @@ function validateOneProjectionListScreen(feature, screen, queryHandlers, feature
|
|
|
66
66
|
}
|
|
67
67
|
validateProjectionListFilterSchemaAcceptance(prefix, screen, schema);
|
|
68
68
|
validateProjectionListFacetsSchemaAcceptance(prefix, screen, schema);
|
|
69
|
+
validateListTableAggregateQuery({ prefix, ...screen, handler, featureMap });
|
|
69
70
|
}
|
|
70
71
|
// filter sends `payload.filter` — same 422 footgun as facets below
|
|
71
72
|
// if the handler's schema doesn't accept it.
|
|
@@ -190,17 +191,6 @@ function validateRelatedListParentFilter(prefix, section, schema, handler, featu
|
|
|
190
191
|
`entity behind query "${section.query}". Known fields: ${Object.keys(entity.fields).sort().join(", ")}.`);
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
|
-
// A collapsed group without a header has no toggle, so its rows could never be opened.
|
|
194
|
-
function validateRelatedListGroupBy(prefix, section) {
|
|
195
|
-
const groupBy = section.groupBy;
|
|
196
|
-
const collapsedKey = groupBy?.collapsedWhen === undefined ? undefined : relatedListGroupKey(groupBy.collapsedWhen);
|
|
197
|
-
if (groupBy !== undefined &&
|
|
198
|
-
collapsedKey !== undefined &&
|
|
199
|
-
relatedListGroupHeaderLabel(groupBy, collapsedKey) === undefined) {
|
|
200
|
-
throw new Error(`${prefix}: groupBy.collapsedWhen "${collapsedKey}" names a group without a header; ` +
|
|
201
|
-
`set groupBy.label or groupBy.labels["${collapsedKey}"], or drop collapsedWhen.`);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
194
|
// relatedList sections declare search/facets the same way a projectionList
|
|
205
195
|
// screen does, and hit the same 422 footgun: definePagedQueryHandler doesn't
|
|
206
196
|
// auto-merge params into the handler's own Zod schema, so an
|
|
@@ -217,7 +207,7 @@ export function validateRelatedListSectionQueries(features) {
|
|
|
217
207
|
validateRelatedListSearchable(prefix, section, schema);
|
|
218
208
|
validateRelatedListFacets(prefix, section, schema);
|
|
219
209
|
validateRelatedListParentFilter(prefix, section, schema, handler, featureMap);
|
|
220
|
-
|
|
210
|
+
validateListTableAggregateQuery({ prefix, ...section, handler, featureMap });
|
|
221
211
|
};
|
|
222
212
|
for (const feature of features) {
|
|
223
213
|
for (const screen of Object.values(feature.screens)) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { QueryHandlerDef } from "@cosmicdrift/kumiko-types/handlers";
|
|
2
|
+
import type { FeatureDefinition } from "../types/index.ts";
|
|
2
3
|
export declare function checkQueryRef(queryHandlers: ReadonlyMap<string, QueryHandlerDef>, query: string, buildPrefix: () => string): void;
|
|
3
4
|
export declare function validateQueryRefs(features: readonly FeatureDefinition[]): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
|
|
2
|
+
const EXPANDABLE_ROW_TABLE_KEYS = new Set(["grouping"]);
|
|
3
|
+
const EXPANDABLE_ROW_REJECTED_GROUPING_KEYS = ["userChoice", "fields"];
|
|
4
|
+
// `groupBy` grouped the loaded page on the client; it is gone, and a screen
|
|
5
|
+
// still carrying it fails at boot instead of silently losing its groups.
|
|
6
|
+
function rejectRemovedGroupBy(prefix, section) {
|
|
7
|
+
if (Object.hasOwn(section, "groupBy")) {
|
|
8
|
+
throw new Error(`${prefix} uses groupBy, which was removed. Use table.grouping: { field, label?, labels?, collapsedWhen? }; ` +
|
|
9
|
+
`groups and counts come from the server, so the bound query must accept aggregate.`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function rejectExpandableRowTableOptions(prefix, table) {
|
|
13
|
+
if (isPlainObject(table)) {
|
|
14
|
+
rejectUnsupportedTableKeys(prefix, table);
|
|
15
|
+
rejectGroupingChoice(prefix, table["grouping"]);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function rejectUnsupportedTableKeys(prefix, table) {
|
|
19
|
+
const unsupported = Object.keys(table).filter((key) => !EXPANDABLE_ROW_TABLE_KEYS.has(key));
|
|
20
|
+
if (unsupported.length > 0) {
|
|
21
|
+
throw new Error(`${prefix} supports only table.grouping, not table.${unsupported.join(", table.")}. ` +
|
|
22
|
+
`Put the other table options on the entityList screen itself.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function rejectGroupingChoice(prefix, grouping) {
|
|
26
|
+
const choiceKey = isPlainObject(grouping)
|
|
27
|
+
? EXPANDABLE_ROW_REJECTED_GROUPING_KEYS.find((key) => Object.hasOwn(grouping, key))
|
|
28
|
+
: undefined;
|
|
29
|
+
if (choiceKey !== undefined) {
|
|
30
|
+
throw new Error(`${prefix} does not support table.grouping.${choiceKey}: an expanded row has no view menu. ` +
|
|
31
|
+
`Set a fixed table.grouping.field.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Grouping rules of a relatedList section or entityList.expandableRow, before the shared table checks. */
|
|
35
|
+
export function validateRelatedListGroupingRules(prefix, section, isExpandableRow) {
|
|
36
|
+
rejectRemovedGroupBy(prefix, section);
|
|
37
|
+
if (isExpandableRow && Object.hasOwn(section, "bulkActions")) {
|
|
38
|
+
throw new Error(`${prefix} does not support bulkActions. Put bulkActions on the entityList screen itself.`);
|
|
39
|
+
}
|
|
40
|
+
if (isExpandableRow)
|
|
41
|
+
rejectExpandableRowTableOptions(prefix, section.table);
|
|
42
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { EntityDefinition, FieldDefinition } from "@cosmicdrift/kumiko-types/fields";
|
|
1
2
|
import type { FieldsOrGroupsSection } from "../screen-helpers.ts";
|
|
2
|
-
import type {
|
|
3
|
+
import type { FeatureDefinition } from "../types/index.ts";
|
|
3
4
|
import type { ActionFormScreenDefinition, ConfigEditScreenDefinition, EditFieldSpec, EditLayout, SecretMintScreenDefinition } from "../types/screen.ts";
|
|
4
5
|
import type { NavigateTargetLookups } from "./screens-actions.ts";
|
|
5
6
|
export declare function validateEditFieldExtras(featureName: string, screenId: string, entityDef: EntityDefinition, fieldSpec: Exclude<EditFieldSpec, string>): void;
|
|
@@ -3,7 +3,10 @@ import { rowMetaFieldNames } from "../../db/table-builder.js";
|
|
|
3
3
|
import { qualifyEntityName } from "../qualified-name.js";
|
|
4
4
|
import { getAllowedFilterOps, isFieldFilterable } from "../screen-filter-ops.js";
|
|
5
5
|
import { normalizeListColumn } from "../screen-helpers.js";
|
|
6
|
+
import { validateEntityListAggregateOptions } from "./entity-list-aggregate-options.js";
|
|
6
7
|
import { LIST_ROW_META_COLUMN_NAMES } from "./entity-list-screens.js";
|
|
8
|
+
import { validateListBulkActions } from "./list-bulk-actions.js";
|
|
9
|
+
import { validateListTableOptions } from "./list-table-options.js";
|
|
7
10
|
import { assertWriteHandlerRegistered, rejectRedirectOnListRowAction, resolveRowActionNavigateTarget, validateActionFieldRefs, validateAtMostOneRowClick, validateDrawerTargetAction, validateRowActionNavigateParams, } from "./screens-actions.js";
|
|
8
11
|
import { buildUnknownFieldMessage, listActionContext, rejectEmptyColumns, rejectNonArrayInFilter, resolveScreenEntity, validateListColumnRendering, } from "./screens-kind-shared.js";
|
|
9
12
|
import { validateRelatedListSection, validateRowActionTarget } from "./screens-lists.js";
|
|
@@ -201,6 +204,9 @@ export function validateEntityListScreen(ctx, screenId, screen) {
|
|
|
201
204
|
throw new Error(`[Feature ${featureName}] Screen "${screenId}" (entityList) has pageSize=${screen.pageSize} — ` +
|
|
202
205
|
`must be a positive integer.`);
|
|
203
206
|
}
|
|
207
|
+
const where = `[Feature ${featureName}] Screen "${screenId}" (entityList)`;
|
|
208
|
+
validateListTableOptions(where, screen.table, screen.columns, true);
|
|
209
|
+
validateEntityListAggregateOptions(where, screen, fields.entityDef);
|
|
204
210
|
if (screen.defaultSort !== undefined) {
|
|
205
211
|
validateEntityListDefaultSort(featureName, screenId, screen.defaultSort, fields);
|
|
206
212
|
}
|
|
@@ -219,6 +225,7 @@ export function validateEntityListScreen(ctx, screenId, screen) {
|
|
|
219
225
|
}
|
|
220
226
|
validateAtMostOneRowClick(featureName, screenId, "entityList", screen.rowActions);
|
|
221
227
|
}
|
|
228
|
+
validateListBulkActions(`[Feature ${featureName}] Screen "${screenId}" (entityList)`, screen.bulkActions, screen.rowActions);
|
|
222
229
|
for (const action of screen.toolbarActions ?? []) {
|
|
223
230
|
validateEntityListToolbarAction(ctx, screenId, fields, action);
|
|
224
231
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { normalizeListColumn } from "../screen-helpers.js";
|
|
2
|
+
import { validateListBulkActions } from "./list-bulk-actions.js";
|
|
3
|
+
import { validateListTableOptions } from "./list-table-options.js";
|
|
2
4
|
import { assertWriteHandlerRegistered, resolveRowActionNavigateTarget, validateAtMostOneRowClick, validateDrawerTargetAction, } from "./screens-actions.js";
|
|
3
5
|
import { listActionContext, rejectEmptyColumns, rejectMissingQuery, rejectNonArrayInFilter, validateListColumnRendering, } from "./screens-kind-shared.js";
|
|
4
6
|
import { validateListActionTargets, validateListFacets } from "./screens-lists.js";
|
|
@@ -34,6 +36,7 @@ export function validateProjectionListScreen(ctx, screenId, screen) {
|
|
|
34
36
|
for (const col of screen.columns) {
|
|
35
37
|
validateListColumnRendering(ctx, screenId, "projectionList", normalizeListColumn(col));
|
|
36
38
|
}
|
|
39
|
+
validateListTableOptions(`[Feature ${featureName}] Screen "${screenId}" (projectionList)`, screen.table, screen.columns, true);
|
|
37
40
|
// Screen filter: field existence can't be checked without an entity (columns
|
|
38
41
|
// aren't a complete field inventory of the underlying query), so only the
|
|
39
42
|
// structure is pinned: "in" requires an array.
|
|
@@ -46,6 +49,7 @@ export function validateProjectionListScreen(ctx, screenId, screen) {
|
|
|
46
49
|
if (screen.rowActions !== undefined) {
|
|
47
50
|
validateProjectionListRowActions(ctx, screenId, screen.rowActions);
|
|
48
51
|
}
|
|
52
|
+
validateListBulkActions(`[Feature ${featureName}] Screen "${screenId}" (projectionList)`, screen.bulkActions, screen.rowActions);
|
|
49
53
|
if (screen.toolbarActions !== undefined) {
|
|
50
54
|
validateProjectionListToolbarActions(ctx, screenId, screen.toolbarActions);
|
|
51
55
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import type { ConfigKeyDefinition } from "@cosmicdrift/kumiko-types/config";
|
|
2
|
+
import type { EntityDefinition } from "@cosmicdrift/kumiko-types/fields";
|
|
1
3
|
import { type normalizeListColumn } from "../screen-helpers.ts";
|
|
2
|
-
import type {
|
|
4
|
+
import type { FeatureDefinition } from "../types/index.ts";
|
|
3
5
|
import type { EditExtensionSection, EditFieldsSection, EditSectionSpec, RowAction } from "../types/screen.ts";
|
|
4
6
|
import type { NavigateSourceScreenType, NavigateTargetLookups } from "./screens-actions.ts";
|
|
5
7
|
import { type resolveRowActionNavigateTarget } from "./screens-actions.ts";
|
|
@@ -2,6 +2,9 @@ import { REFERENCE_LOOKUP_SOURCES } from "../../ui-types/list-row-meta.js";
|
|
|
2
2
|
import { parseRefTarget } from "../parse-ref-target.js";
|
|
3
3
|
import { qualifyEntityName } from "../qualified-name.js";
|
|
4
4
|
import { explicitListScreenId, normalizeListColumn, resolveNavParentScreen, } from "../screen-helpers.js";
|
|
5
|
+
import { validateListBulkActions } from "./list-bulk-actions.js";
|
|
6
|
+
import { validateListTableOptions } from "./list-table-options.js";
|
|
7
|
+
import { validateRelatedListGroupingRules } from "./related-list-table-rules.js";
|
|
5
8
|
import { assertWriteHandlerRegistered, isRowClickAction, rejectRedirectOnListRowAction, resolveRowActionNavigateTarget, validateClientActionName, validateDrawerTargetAction, validateRowActionNavigateParams, } from "./screens-actions.js";
|
|
6
9
|
// validateScreenHasNavArea runs once per screen; the index is built once per
|
|
7
10
|
// featureMap (immutable during boot) instead of re-scanning every feature each call.
|
|
@@ -70,6 +73,14 @@ export function validateScreenHasNavArea(feature, screenId, screen, featureMap)
|
|
|
70
73
|
}
|
|
71
74
|
// Shared by projectionDetail relatedList sections and entityList.expandableRow:
|
|
72
75
|
// both render a relatedList whose rows come from an arbitrary query.
|
|
76
|
+
function validateRelatedListTableAndBulk(args) {
|
|
77
|
+
const { featureName, where, section } = args;
|
|
78
|
+
validateRelatedListGroupingRules(`[Feature ${featureName}] ${where}`, section, args.screenType === "entityList expandableRow");
|
|
79
|
+
validateListTableOptions(`[Feature ${featureName}] ${where}`, section.table, section.columns);
|
|
80
|
+
if (section.rowActions !== undefined)
|
|
81
|
+
validateRelatedListRowActions(args, section.rowActions);
|
|
82
|
+
validateListBulkActions(`[Feature ${featureName}] ${where}`, section.bulkActions, section.rowActions);
|
|
83
|
+
}
|
|
73
84
|
export function validateRelatedListSection(args) {
|
|
74
85
|
const { featureName, featureMap, where, section } = args;
|
|
75
86
|
if (!section.query || typeof section.query !== "string") {
|
|
@@ -93,8 +104,7 @@ export function validateRelatedListSection(args) {
|
|
|
93
104
|
`detailFor: "${targetEntity}". Add detailFor: "${targetEntity}" to the screen that shows it.`);
|
|
94
105
|
}
|
|
95
106
|
}
|
|
96
|
-
|
|
97
|
-
validateRelatedListRowActions(args, section.rowActions);
|
|
107
|
+
validateRelatedListTableAndBulk(args);
|
|
98
108
|
if (section.defaultSort !== undefined)
|
|
99
109
|
validateRelatedListDefaultSort(args, section.defaultSort);
|
|
100
110
|
if (section.facets !== undefined) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ConfigKeyDefinition
|
|
1
|
+
import type { ConfigKeyDefinition } from "@cosmicdrift/kumiko-types/config";
|
|
2
|
+
import type { FeatureDefinition } from "../types/index.ts";
|
|
2
3
|
import type { ScreenDefinition } from "../types/screen.ts";
|
|
3
4
|
export { readsNavigateParamsAsFormPrefill, resolveScreenTargetQn, rowFieldExtractorKeys, validateActionFieldRefs, validateActionHasIcon, validateDrawerPrefillKeys, validateScreenShortIdCollisions, } from "./screens-actions.ts";
|
|
4
5
|
export { validateDashboardCustomPanel, validateDashboardScreenPanel } from "./screens-dashboard.ts";
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NavDefinition } from "@cosmicdrift/kumiko-types/nav";
|
|
2
|
+
import type { WorkspaceDefinition } from "@cosmicdrift/kumiko-types/workspace";
|
|
3
|
+
import type { FeatureDefinition } from "../types/index.ts";
|
|
2
4
|
export declare function collectWorkspaceQns(features: readonly FeatureDefinition[]): Map<string, WorkspaceDefinition & {
|
|
3
5
|
readonly featureName: string;
|
|
4
6
|
}>;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { HandlerContext, SessionUser } from "./types/index.ts";
|
|
1
|
+
import type { ContextServices, HandlerContext, HandlerDispatch, HandlerObservability, SessionUser } from "./types/index.ts";
|
|
2
2
|
export declare function bridgeStub(opts?: {
|
|
3
3
|
readonly user?: SessionUser;
|
|
4
|
-
|
|
4
|
+
readonly log?: HandlerObservability["log"];
|
|
5
|
+
readonly dispatch?: Partial<HandlerDispatch>;
|
|
6
|
+
readonly services?: Partial<ContextServices>;
|
|
7
|
+
}): Pick<HandlerContext, "dispatch" | "events" | "auth" | "obs" | "hasFeature" | "tz" | "locale" | "user" | "services" | "lifecycle" | "tenants">;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { DEFAULT_LOCALE } from "../i18n/request-locale.js";
|
|
2
|
-
import {
|
|
2
|
+
import { createFallbackFullLogger } from "../logging/utils.js";
|
|
3
|
+
import { getFallbackTracer } from "../observability/fallback.js";
|
|
4
|
+
import { createNoopMetricsHandle } from "../observability/index.js";
|
|
3
5
|
import { createTzContext } from "../time/index.js";
|
|
4
6
|
import { createAnonymousUser } from "./system-user.js";
|
|
5
7
|
// Test/service helper: cross-feature bridge methods that throw on use.
|
|
@@ -7,7 +9,7 @@ import { createAnonymousUser } from "./system-user.js";
|
|
|
7
9
|
// Production code always receives a full HandlerContext from the Dispatcher's
|
|
8
10
|
// buildHandlerContext (with real query/write closures). Some internal services
|
|
9
11
|
// and tests construct a mini-context manually (typically just `{ db, registry }`)
|
|
10
|
-
// to invoke a single handler. Those call sites don't use ctx.query/write —
|
|
12
|
+
// to invoke a single handler. Those call sites don't use ctx.dispatch.query/write —
|
|
11
13
|
// the stubs make the TypeScript shape match while still failing loudly if
|
|
12
14
|
// anything downstream accidentally reaches for them.
|
|
13
15
|
//
|
|
@@ -15,7 +17,7 @@ import { createAnonymousUser } from "./system-user.js";
|
|
|
15
17
|
const notAvailable = (what) => async (..._args) => {
|
|
16
18
|
throw new Error(`ctx.${what} not available in this context — use the dispatcher, not a stubbed handler context`);
|
|
17
19
|
};
|
|
18
|
-
// Noop observability — hand back the shared fallback tracer so ctx.tracer has
|
|
20
|
+
// Noop observability — hand back the shared fallback tracer so ctx.obs.tracer has
|
|
19
21
|
// a valid Tracer shape. No allocations per call.
|
|
20
22
|
const noopTracer = getFallbackTracer();
|
|
21
23
|
export function bridgeStub(opts) {
|
|
@@ -27,35 +29,48 @@ export function bridgeStub(opts) {
|
|
|
27
29
|
const stubUser = opts?.user ?? createAnonymousUser("00000000-0000-0000-0000-000000000000");
|
|
28
30
|
return {
|
|
29
31
|
user: stubUser,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
32
|
+
dispatch: {
|
|
33
|
+
query: notAvailable("dispatch.query"),
|
|
34
|
+
queryAs: notAvailable("dispatch.queryAs"),
|
|
35
|
+
write: notAvailable("dispatch.write"),
|
|
36
|
+
writeAs: notAvailable("dispatch.writeAs"),
|
|
37
|
+
queryAsMember: notAvailable("dispatch.queryAsMember"),
|
|
38
|
+
queryProjection: notAvailable("dispatch.queryProjection"),
|
|
39
|
+
...opts?.dispatch,
|
|
40
|
+
},
|
|
41
|
+
events: {
|
|
42
|
+
append: notAvailable("events.append"),
|
|
43
|
+
unsafeAppend: notAvailable("events.unsafeAppend"),
|
|
44
|
+
tryAppend: notAvailable("events.tryAppend"),
|
|
45
|
+
fetchForWriting: notAvailable("events.fetchForWriting"),
|
|
46
|
+
load: notAvailable("events.load"),
|
|
47
|
+
archive: notAvailable("events.archive"),
|
|
48
|
+
restore: notAvailable("events.restore"),
|
|
49
|
+
isArchived: notAvailable("events.isArchived"),
|
|
50
|
+
snapshot: notAvailable("events.snapshot"),
|
|
51
|
+
loadWithSnapshot: notAvailable("events.loadWithSnapshot"),
|
|
52
|
+
},
|
|
53
|
+
auth: {
|
|
54
|
+
resolveClaims: notAvailable("auth.resolveClaims"),
|
|
55
|
+
resolveActiveMembership: notAvailable("auth.resolveActiveMembership"),
|
|
56
|
+
},
|
|
48
57
|
// Stub defaults to always-enabled — matches the dispatcher's behaviour
|
|
49
58
|
// when no effectiveFeatures resolver is wired (tests without toggles).
|
|
50
59
|
hasFeature: async () => true,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
60
|
+
obs: {
|
|
61
|
+
log: opts?.log ?? createFallbackFullLogger("bridge-stub"),
|
|
62
|
+
tracer: noopTracer,
|
|
63
|
+
metrics: createNoopMetricsHandle(),
|
|
64
|
+
metricsFor: () => createNoopMetricsHandle(),
|
|
65
|
+
},
|
|
54
66
|
// Real TzContext, not notAvailable — test code uses ctx.tz routinely,
|
|
55
67
|
// it isn't a "bridge" concept. Defaults to UTC.
|
|
56
68
|
tz: createTzContext(),
|
|
57
69
|
// Same reasoning as tz above — ctx.locale is always-present, not a
|
|
58
70
|
// bridge method. Defaults to DEFAULT_LOCALE.
|
|
59
71
|
locale: DEFAULT_LOCALE,
|
|
72
|
+
services: { extensions: {}, ...opts?.services },
|
|
73
|
+
lifecycle: {},
|
|
74
|
+
tenants: {},
|
|
60
75
|
};
|
|
61
76
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { AppSchema } from "../ui-types/index.ts";
|
|
1
|
+
import type { AppSchema, WorkspaceSchema } from "../ui-types/index.ts";
|
|
2
2
|
import type { Registry } from "./types/feature.ts";
|
|
3
|
+
export declare function workspaceOwnerOf(definition: WorkspaceSchema["definition"]): string | undefined;
|
|
3
4
|
export type BuildAppSchemaOptions = {
|
|
4
5
|
/** Dev-server authoring hints (Settings-Hub placement). Default off — only
|
|
5
6
|
* `createKumikoServer` opts in; prod boot + unit tests stay silent. */
|
|
@@ -31,6 +31,12 @@ import { isEncryptedAtRest } from "./config-helpers.js";
|
|
|
31
31
|
import { isListQueryWithoutSearchableFields } from "./entity-list-searchability.js";
|
|
32
32
|
import { QnTypes, qualifyEntityName } from "./qualified-name.js";
|
|
33
33
|
const log = createFallbackLogger("kumiko");
|
|
34
|
+
// Workspace ids are only unique per feature, and the schema carries the short id. The owner stays
|
|
35
|
+
// off the serialized schema; the tenant-level feature strip reads it from here by object identity.
|
|
36
|
+
const workspaceOwnerByDefinition = new WeakMap();
|
|
37
|
+
export function workspaceOwnerOf(definition) {
|
|
38
|
+
return workspaceOwnerByDefinition.get(definition);
|
|
39
|
+
}
|
|
34
40
|
export function buildAppSchema(registry, options = {}) {
|
|
35
41
|
const features = [];
|
|
36
42
|
const urlPrefillFieldsByScreenQn = collectUrlPrefillFieldsByScreenQn([
|
|
@@ -74,8 +80,10 @@ export function buildAppSchema(registry, options = {}) {
|
|
|
74
80
|
for (const [featureName, feature] of registry.features) {
|
|
75
81
|
for (const [shortId, definition] of Object.entries(feature.workspaces)) {
|
|
76
82
|
const qualified = `${featureName}:workspace:${shortId}`;
|
|
83
|
+
const projectedDefinition = { ...definition, id: shortId };
|
|
84
|
+
workspaceOwnerByDefinition.set(projectedDefinition, featureName);
|
|
77
85
|
workspaces.push({
|
|
78
|
-
definition:
|
|
86
|
+
definition: projectedDefinition,
|
|
79
87
|
navMembers: registry.getWorkspaceNavs(qualified),
|
|
80
88
|
});
|
|
81
89
|
}
|
|
@@ -656,8 +656,13 @@ function buildScreen(shortId, scope, feature, keys, access, hub, options = {}) {
|
|
|
656
656
|
// feature's group (100% of today's apps — byte-identical output). Only a
|
|
657
657
|
// cross-feature `group` (feature !== ownerFeature) needs the owner prefix,
|
|
658
658
|
// to keep two features sharing a group from clobbering the same shortKey.
|
|
659
|
+
// A selector's option labels hang on its field id in one global key space
|
|
660
|
+
// (`config:entity:__config-edit__:field:<id>:option:<value>`), so two owners
|
|
661
|
+
// whose selector is both named `provider` need distinct ids.
|
|
659
662
|
const fieldId = options.fieldIdOf ??
|
|
660
|
-
((k) =>
|
|
663
|
+
((k) => k.feature === k.ownerFeature && !hub.selectorOptions.has(k.qn)
|
|
664
|
+
? k.shortKey
|
|
665
|
+
: qualifiedFieldId(k));
|
|
661
666
|
const seenFieldIds = new Map();
|
|
662
667
|
for (const k of keys) {
|
|
663
668
|
const id = fieldId(k);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ConfigBacking, ConfigBounds, ConfigComputedFn, ConfigKeyDefinition, ConfigKeyType, ConfigMask, ConfigSeedDef, ConfigValidateFn, ConfigValue, CreateSeedOptions, CreateTenantSeedOptions
|
|
1
|
+
import type { ConfigBacking, ConfigBounds, ConfigComputedFn, ConfigKeyDefinition, ConfigKeyType, ConfigMask, ConfigSeedDef, ConfigValidateFn, ConfigValue, CreateSeedOptions, CreateTenantSeedOptions } from "@cosmicdrift/kumiko-types/config";
|
|
2
|
+
import type { OptionsQueryPayload } from "@cosmicdrift/kumiko-types/fields";
|
|
2
3
|
export declare function isEncryptedAtRest(def: Pick<ConfigKeyDefinition, "encrypted" | "backing">): boolean;
|
|
3
4
|
export declare const access: {
|
|
4
5
|
readonly all: readonly string[];
|
|
@@ -41,5 +42,4 @@ export declare function createUserConfig<T extends ConfigKeyType>(type: T, opts?
|
|
|
41
42
|
export declare function createSeed(opts: CreateSeedOptions): ConfigSeedDef;
|
|
42
43
|
export declare function createSystemSeed(opts: CreateSeedOptions): ConfigSeedDef;
|
|
43
44
|
export declare function createTenantSeed(opts: CreateSeedOptions, options?: CreateTenantSeedOptions): ConfigSeedDef;
|
|
44
|
-
export declare function createUserSeed(opts: CreateSeedOptions, options: CreateUserSeedOptions): ConfigSeedDef;
|
|
45
45
|
export {};
|
|
@@ -114,12 +114,3 @@ export function createTenantSeed(opts, options) {
|
|
|
114
114
|
// User-scope seed. Both tenantId AND userId are required — the resolver
|
|
115
115
|
// matches against the user's actual tenantId, so a seed under
|
|
116
116
|
// SYSTEM_TENANT_ID would never resolve.
|
|
117
|
-
export function createUserSeed(opts, options) {
|
|
118
|
-
return {
|
|
119
|
-
value: opts.value,
|
|
120
|
-
scope: "user",
|
|
121
|
-
key: "",
|
|
122
|
-
tenantId: options.tenantId,
|
|
123
|
-
userId: options.userId,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
@@ -5,24 +5,14 @@ import type { TenantId } from "./types/identifiers.ts";
|
|
|
5
5
|
export declare const SystemHookNames: {
|
|
6
6
|
readonly cascadeDelete: "system:hook:cascade-delete";
|
|
7
7
|
};
|
|
8
|
-
export type SystemHookName = (typeof SystemHookNames)[keyof typeof SystemHookNames];
|
|
9
8
|
export declare const SystemHookPriorities: {
|
|
10
9
|
readonly cascadeDelete: 500;
|
|
11
10
|
};
|
|
12
|
-
export declare const MessageKind: {
|
|
13
|
-
readonly write: "write";
|
|
14
|
-
readonly query: "query";
|
|
15
|
-
readonly command: "command";
|
|
16
|
-
readonly shared: "shared";
|
|
17
|
-
readonly broadcast: "broadcast";
|
|
18
|
-
};
|
|
19
|
-
export type MessageKind = (typeof MessageKind)[keyof typeof MessageKind];
|
|
20
11
|
export declare const LifecycleHookTypes: {
|
|
21
12
|
readonly preSave: "preSave";
|
|
22
13
|
readonly postSave: "postSave";
|
|
23
14
|
readonly preDelete: "preDelete";
|
|
24
15
|
readonly postDelete: "postDelete";
|
|
25
|
-
readonly preQuery: "preQuery";
|
|
26
16
|
readonly postQuery: "postQuery";
|
|
27
17
|
};
|
|
28
18
|
export type LifecycleHookType = (typeof LifecycleHookTypes)[keyof typeof LifecycleHookTypes];
|
package/dist/engine/constants.js
CHANGED
|
@@ -12,20 +12,12 @@ export const SystemHookPriorities = {
|
|
|
12
12
|
cascadeDelete: 500,
|
|
13
13
|
};
|
|
14
14
|
// --- Message Kinds ---
|
|
15
|
-
export const MessageKind = {
|
|
16
|
-
write: "write",
|
|
17
|
-
query: "query",
|
|
18
|
-
command: "command",
|
|
19
|
-
shared: "shared",
|
|
20
|
-
broadcast: "broadcast",
|
|
21
|
-
};
|
|
22
15
|
// --- Lifecycle Hook Types ---
|
|
23
16
|
export const LifecycleHookTypes = {
|
|
24
17
|
preSave: "preSave",
|
|
25
18
|
postSave: "postSave",
|
|
26
19
|
preDelete: "preDelete",
|
|
27
20
|
postDelete: "postDelete",
|
|
28
|
-
preQuery: "preQuery",
|
|
29
21
|
postQuery: "postQuery",
|
|
30
22
|
};
|
|
31
23
|
// --- Config Scopes ---
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { validateBoot } from "./boot-validator.js";
|
|
2
2
|
import { dedupeFeatures } from "./dedupe-features.js";
|
|
3
|
+
import { DEFAULT_CURRENCIES } from "./field-helpers.js";
|
|
3
4
|
import { createRegistry } from "./registry.js";
|
|
4
|
-
import { DEFAULT_CURRENCIES } from "./types/index.js";
|
|
5
5
|
// Every field map an entity-less inline form screen renders: actionForm's and
|
|
6
6
|
// secretMint's own fields, plus a secretMint's separate `confirm` step.
|
|
7
7
|
function inlineFormFieldMaps(screen) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FeatureRegistrar } from "@cosmicdrift/kumiko-types/feature-registrar";
|
|
2
|
+
import type { FeatureDefinition } from "./types/index.ts";
|
|
2
3
|
export type DefineFeatureSettings = {
|
|
3
4
|
readonly dedupeOptions?: Readonly<Record<string, unknown>>;
|
|
4
5
|
};
|
|
@@ -12,7 +12,7 @@ import { isObjectArgument, throwObjectArgumentRequired, unwrapArrayForm } from "
|
|
|
12
12
|
// the call-site (`defineFeature("driverOrders", ...)` → TName="driverOrders").
|
|
13
13
|
// The literal threads into the FeatureRegistrar so r.defineEvent's return
|
|
14
14
|
// carries `name: "driver-orders:event:foo"` as a literal — strict-mode
|
|
15
|
-
// for `ctx.
|
|
15
|
+
// for `ctx.events.append({ type: eventDef.name, ... })` lights up. Apps
|
|
16
16
|
// that don't care can keep the default-string and use the wrapper-based
|
|
17
17
|
// strict-mode (string-literal types per call-site) like before.
|
|
18
18
|
// optionalRequires accepts either variadic strings or a single `{ features }` object; requires
|
|
@@ -77,6 +77,9 @@ export function defineFeature(name, setup, settings) {
|
|
|
77
77
|
}
|
|
78
78
|
state.toggleableDefault = options.default;
|
|
79
79
|
},
|
|
80
|
+
adoptsBundledLists() {
|
|
81
|
+
state.adoptsBundledLists = true;
|
|
82
|
+
},
|
|
80
83
|
uiHints(hints) {
|
|
81
84
|
if (state.uiHints !== undefined) {
|
|
82
85
|
throw new Error(`[Feature ${name}] r.uiHints() called twice — UI hints are declared once`);
|
|
@@ -98,6 +101,7 @@ export function defineFeature(name, setup, settings) {
|
|
|
98
101
|
requiredProjections: state.requiredProjections,
|
|
99
102
|
requiredSteps: state.requiredSteps,
|
|
100
103
|
...(state.toggleableDefault !== undefined && { toggleableDefault: state.toggleableDefault }),
|
|
104
|
+
...(state.adoptsBundledLists && { adoptsBundledLists: true }),
|
|
101
105
|
...(state.uiHints !== undefined && { uiHints: state.uiHints }),
|
|
102
106
|
entities: state.entities,
|
|
103
107
|
entityTables: state.entityTables,
|
|
@@ -112,7 +116,6 @@ export function defineFeature(name, setup, settings) {
|
|
|
112
116
|
postSave: state.phasedLifecycleHooks.postSave,
|
|
113
117
|
preDelete: state.phasedLifecycleHooks.preDelete,
|
|
114
118
|
postDelete: state.phasedLifecycleHooks.postDelete,
|
|
115
|
-
preQuery: state.lifecycleHooks["preQuery"] ?? {},
|
|
116
119
|
postQuery: state.lifecycleHooks["postQuery"] ?? {},
|
|
117
120
|
// @cast-boundary engine-bridge — hook registration erases the per-slot
|
|
118
121
|
// signatures to LifecycleHookFn (a union; see the cast in
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { CursorResult } from "@cosmicdrift/kumiko-types/cursor-types";
|
|
2
|
+
import type { KumikoEventTypeMap } from "@cosmicdrift/kumiko-types/event-type-map";
|
|
2
3
|
import type { ZodType } from "zod";
|
|
3
4
|
import type { ContainsSecret } from "../secrets/types.ts";
|
|
4
5
|
import type { QueryHandlerDefinition, WriteHandlerDefinition, WriteHandlerInput } from "./types/define-handler.ts";
|
|
5
|
-
import type { KumikoEventTypeMap } from "./types/index.ts";
|
|
6
6
|
export type { QueryHandlerDefinition, StreamHandlerDefinition, WriteHandlerDefinition, WriteHandlerInput, } from "./types/define-handler.ts";
|
|
7
7
|
export declare function defineWriteHandler<const TName extends string, TSchema extends ZodType, TData = unknown, TMap extends object = KumikoEventTypeMap, TPrepared = undefined>(def: WriteHandlerInput<TName, TSchema, TData, TMap, TPrepared>, ..._noSecretInResponse: true extends ContainsSecret<TData> ? [
|
|
8
8
|
secretLeak: "A handler response must not contain a Secret<> — call .reveal() and return the plaintext, or drop the field."
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { StepDef, StepKind } from "./types/step.ts";
|
|
2
2
|
export declare function defineStep<TArgs, TResult>(def: StepDef<TArgs, TResult>): StepDef<TArgs, TResult>;
|
|
3
3
|
export declare function getStep(kind: StepKind): StepDef | undefined;
|
|
4
|
-
export declare function listStepKinds(): readonly StepKind[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EmbeddedDerivedCellDef, EmbeddedSubFieldDef } from "
|
|
1
|
+
import type { EmbeddedDerivedCellDef, EmbeddedSubFieldDef } from "@cosmicdrift/kumiko-types/fields";
|
|
2
2
|
/** Computes a derived cell from its source values. Missing/non-numeric
|
|
3
3
|
* sources: "multiply"/"percent" with any missing source → undefined; "sum"/"subtract"
|
|
4
4
|
* treat missing as 0 only when at least one source is present — if every
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { EntityDefinition } from "@cosmicdrift/kumiko-types/fields";
|
|
2
|
+
import type { AccessRule, EscapeHatchDeclaration, QueryHandlerDef, WriteHandlerDef } from "@cosmicdrift/kumiko-types/handlers";
|
|
1
3
|
import * as z from "zod";
|
|
2
4
|
import { type EventStoreExecutor } from "../db/event-store-executor.ts";
|
|
3
5
|
import { type EntityRow, type EntityTable } from "../db/table-builder.ts";
|
|
4
6
|
import type { EntityCrudRegistrar, EntityHandlerOptions, EntityQueryHandlerOptions, EntityWriteHandlerOptions, RegisterEntityCrudOptions } from "./types/entity-handlers.ts";
|
|
5
|
-
import type { AccessRule, EntityDefinition, EscapeHatchDeclaration, QueryHandlerDef, WriteHandlerDef } from "./types/index.ts";
|
|
6
7
|
export type { EntityCrudHandlerDefaults, EntityCrudRegistrar, EntityCrudVerb, EntityHandlerOptions, EntityQueryHandlerOptions, EntityWriteHandlerOptions, RegisterEntityCrudOptions, } from "./types/entity-handlers.ts";
|
|
7
8
|
export declare function assertEscapeHatchAccessIsSystemAdminOnly(name: string, kind: "write" | "query", access: AccessRule): void;
|
|
8
9
|
export declare const MAX_LIST_LIMIT = 200;
|
|
@@ -41,7 +41,7 @@ import { parseTenantId } from "./types/identifiers.js";
|
|
|
41
41
|
// r.queryHandler(defineEntityDetailHandler("note", noteEntity, { access }))
|
|
42
42
|
//
|
|
43
43
|
// For custom logic (default values, business rules, side effects, custom
|
|
44
|
-
// executors with ctx.searchAdapter, ...) write the handler explicitly with
|
|
44
|
+
// executors with ctx.services.searchAdapter, ...) write the handler explicitly with
|
|
45
45
|
// r.writeHandler / r.queryHandler — these helpers cover the standard path only.
|
|
46
46
|
//
|
|
47
47
|
// Note on the `as` casts in the handler bodies: WriteHandlerDef.handler's
|
|
@@ -252,7 +252,7 @@ export function defineEntityWriteHandler(name, entity, options) {
|
|
|
252
252
|
case "create":
|
|
253
253
|
schema = buildInsertSchema(entity, undefined, excludedFields, { allowCallerId: true });
|
|
254
254
|
handler = async (event, ctx) => {
|
|
255
|
-
const { runPreSave } = ctx;
|
|
255
|
+
const { lifecycle: { runPreSave }, } = ctx;
|
|
256
256
|
// A caller-chosen id (deterministic-id idempotent creates) is only
|
|
257
257
|
// honored for a system-identity caller (jobs/hooks via
|
|
258
258
|
// createSystemUser) — an HTTP-authenticated end user can never
|
|
@@ -273,7 +273,7 @@ export function defineEntityWriteHandler(name, entity, options) {
|
|
|
273
273
|
changes: buildUpdateSchema(entity, undefined, excludedFields),
|
|
274
274
|
});
|
|
275
275
|
handler = async (event, ctx) => {
|
|
276
|
-
const { runPreSave } = ctx;
|
|
276
|
+
const { lifecycle: { runPreSave }, } = ctx;
|
|
277
277
|
const db = dbFor(ctx);
|
|
278
278
|
const submitted = event.payload; // @cast-boundary engine-payload
|
|
279
279
|
const payload = {
|
|
@@ -509,7 +509,7 @@ export function createEntityExecutor(entityName, entity) {
|
|
|
509
509
|
// );
|
|
510
510
|
//
|
|
511
511
|
// For anything more involved (filters, joins, custom shaping), write the
|
|
512
|
-
// query-handler explicitly with ctx.queryProjection or a raw select.
|
|
512
|
+
// query-handler explicitly with ctx.dispatch.queryProjection or a raw select.
|
|
513
513
|
export function defineProjectionQueryHandler(name, projectionQualifiedName, options) {
|
|
514
514
|
if (typeof options.unsafeAllTenants === "object") {
|
|
515
515
|
assertReason(`"${name}": unsafeAllTenants`, options.unsafeAllTenants.reason);
|
|
@@ -521,11 +521,11 @@ export function defineProjectionQueryHandler(name, projectionQualifiedName, opti
|
|
|
521
521
|
return {
|
|
522
522
|
name,
|
|
523
523
|
schema: z.object({}),
|
|
524
|
-
// Returns the raw row array — matches ctx.queryProjection's shape so the
|
|
525
|
-
// helper is a drop-in for the inline `async (_q, ctx) => ctx.queryProjection(...)`
|
|
524
|
+
// Returns the raw row array — matches ctx.dispatch.queryProjection's shape so the
|
|
525
|
+
// helper is a drop-in for the inline `async (_q, ctx) => ctx.dispatch.queryProjection(...)`
|
|
526
526
|
// handler. Wrap the result in the caller's handler when you need
|
|
527
527
|
// pagination envelopes or added metadata.
|
|
528
|
-
handler: async (_query, ctx) => ctx.queryProjection(projectionQualifiedName, options.unsafeAllTenants ? { unsafeAllTenants: true } : undefined), // @wrapper-known semantic-alias
|
|
528
|
+
handler: async (_query, ctx) => ctx.dispatch.queryProjection(projectionQualifiedName, options.unsafeAllTenants ? { unsafeAllTenants: true } : undefined), // @wrapper-known semantic-alias
|
|
529
529
|
access: options.access,
|
|
530
530
|
...(escapeHatch && { escapeHatch }),
|
|
531
531
|
};
|