@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1
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 +9 -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/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 +3 -3
- package/agents/examples/managed-config.md +4 -4
- package/agents/examples/managed-pages.md +1 -1
- 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 +2 -2
- 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 +4 -4
- package/agents/features.md +1 -1
- package/dist/api/auth-middleware.js +1 -1
- package/dist/api/auth-routes-invite.js +2 -1
- package/dist/api/entity-read-access.d.ts +3 -1
- package/dist/api/export/export-columns.d.ts +3 -1
- package/dist/api/export/export-route.js +3 -2
- package/dist/api/export/export-screen.d.ts +2 -1
- package/dist/api/extra-route.d.ts +3 -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/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.js +7 -3
- 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 +2 -1
- package/dist/api/server-middleware.js +3 -1
- package/dist/api/server-routes.d.ts +2 -1
- package/dist/api/server-wiring.js +6 -4
- package/dist/api/server.d.ts +2 -1
- package/dist/api/sse-route.d.ts +2 -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 +10 -10
- 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.js +6 -1
- 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/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 +3 -1
- package/dist/db/connection.js +15 -5
- 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-value-preparation.js +23 -2
- 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-filter.d.ts +1 -1
- 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.js +8 -7
- package/dist/db/event-store-executor-write-steps.d.ts +3 -2
- package/dist/db/event-store-executor-write.js +7 -4
- package/dist/db/event-store-executor.d.ts +1 -1
- package/dist/db/executor-managed-tables.d.ts +7 -1
- package/dist/db/executor-managed-tables.js +11 -2
- 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 +4 -0
- 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 +11 -0
- 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 +9 -25
- package/dist/db/queries/test-stack.d.ts +4 -1
- package/dist/db/queries/test-stack.js +84 -2
- package/dist/db/query.js +11 -7
- package/dist/db/reference-data.d.ts +1 -1
- package/dist/db/reference-data.js +6 -1
- 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 +6 -0
- package/dist/db/row-level-security-boot-check.js +86 -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/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.d.ts +17 -12
- package/dist/db/tenant-db.js +49 -120
- 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/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 +1 -1
- package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
- package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
- 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/query-refs.d.ts +2 -1
- package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
- 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/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 +1 -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 +8 -1
- 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.js +1 -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 +2 -1
- package/dist/engine/handler-field-references.d.ts +0 -4
- package/dist/engine/index.d.ts +57 -54
- package/dist/engine/index.js +22 -27
- 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 +0 -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/template-variables.d.ts +2 -1
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/index.d.ts +8 -31
- package/dist/engine/types/index.js +2 -10
- package/dist/engine/validation.d.ts +2 -1
- package/dist/entrypoint/index.d.ts +7 -35
- package/dist/entrypoint/index.js +7 -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.js +41 -34
- 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/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 +3 -3
- package/dist/files/create-file-ref.d.ts +3 -2
- package/dist/files/create-file-ref.js +2 -2
- 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 +1 -1
- package/dist/files/file-routes.js +12 -2
- 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 +5 -4
- package/dist/files/provider-resolver.js +4 -4
- 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/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/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 +9 -5
- 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-types.d.ts +2 -1
- package/dist/jobs/job-runner.js +19 -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/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/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 +31 -18
- 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 -198
- 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 +4 -2
- package/dist/pipeline/event-dispatcher.d.ts +2 -2
- package/dist/pipeline/event-dispatcher.js +7 -3
- 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 +13 -7
- package/dist/pipeline/handler-context-dispatch.js +9 -8
- package/dist/pipeline/handler-context-events.d.ts +22 -36
- package/dist/pipeline/handler-context-events.js +36 -31
- 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 +3 -1
- package/dist/pipeline/system-hooks.js +6 -4
- 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/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 +12 -2
- package/dist/schema-cli/shared.js +24 -2
- package/dist/schema-cli/status-command.js +8 -2
- package/dist/schema-cli/validate-command.js +48 -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 +93 -87
- 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 -2
- package/dist/upgrade-changelog.js +12 -8
- package/dist/upgrade-cli-internals.d.ts +8 -0
- package/dist/upgrade-cli-internals.js +63 -0
- package/dist/upgrade-cli.d.ts +2 -9
- package/dist/upgrade-cli.js +28 -70
- 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 +23 -19
- package/src/changes.json +236 -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 -11
- package/dist/engine/feature-ast/extractors/round1.js +0 -87
- 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 -485
- package/dist/engine/feature-ast/patch.d.ts +0 -212
- package/dist/engine/feature-ast/patch.js +0 -611
- 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 -1238
- package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
- package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
- package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
- package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
- package/dist/engine/feature-ast/patterns.d.ts +0 -322
- package/dist/engine/feature-ast/patterns.js +0 -107
- package/dist/engine/feature-ast/render.d.ts +0 -47
- package/dist/engine/feature-ast/render.js +0 -666
- 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 -94
- 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 -21
- package/dist/engine/pattern-library/static-schemas.js +0 -487
- package/dist/engine/pattern-library/types.d.ts +0 -158
- package/dist/engine/pattern-library/types.js +0 -36
- 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,358 +0,0 @@
|
|
|
1
|
-
import { ENTITY_CONVENTION_QUERY_BRAND } from "@cosmicdrift/kumiko-types/handlers";
|
|
2
|
-
import { SyntaxKind } from "ts-morph";
|
|
3
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
4
|
-
import { readHeaderValueOrRaw, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalEscapeHatch, readOptionalRateLimit, } from "./hooks.js";
|
|
5
|
-
import { fail, findFunctionLiteral, isPlainObject, isRawRefSentinel, ok, readBooleanProperty, readDataLiteralNode, readNameLiteral, readObjectPropertyInitializer, readPropertyKey, } from "./shared.js";
|
|
6
|
-
export const AGENT_RISK_VALUES = ["low", "mid", "high"];
|
|
7
|
-
function isAgentRisk(value) {
|
|
8
|
-
return typeof value === "string" && AGENT_RISK_VALUES.includes(value);
|
|
9
|
-
}
|
|
10
|
-
export function readOptionalAgentHints(value) {
|
|
11
|
-
if (!isPlainObject(value))
|
|
12
|
-
return undefined;
|
|
13
|
-
const expose = typeof value["expose"] === "boolean" ? value["expose"] : undefined;
|
|
14
|
-
const risk = isAgentRisk(value["risk"]) ? value["risk"] : undefined;
|
|
15
|
-
if (expose === undefined && risk === undefined)
|
|
16
|
-
return undefined;
|
|
17
|
-
return {
|
|
18
|
-
...(expose !== undefined && { expose }),
|
|
19
|
-
...(risk !== undefined && { risk }),
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
// Record<keyof Def, ...> instead of a looser map: adding a field to
|
|
23
|
-
// WriteHandlerDef/QueryHandlerDef/StreamHandlerDef without classifying it
|
|
24
|
-
// here is a compile error, not a silent drop on render.
|
|
25
|
-
const WRITE_HANDLER_KEY_KINDS = {
|
|
26
|
-
name: "modeled",
|
|
27
|
-
schema: "modeled",
|
|
28
|
-
handler: "modeled",
|
|
29
|
-
access: "modeled",
|
|
30
|
-
description: "modeled",
|
|
31
|
-
agent: "modeled",
|
|
32
|
-
excludedFields: "opaque",
|
|
33
|
-
unsafeSkipTransitionGuard: "modeled",
|
|
34
|
-
rateLimit: "modeled",
|
|
35
|
-
additionalRateLimits: "modeled",
|
|
36
|
-
rateLimitCost: "opaque",
|
|
37
|
-
escapeHatch: "modeled",
|
|
38
|
-
tenantlessAnonymous: "opaque",
|
|
39
|
-
reserveBeforeTransaction: "opaque",
|
|
40
|
-
beforeTransaction: "opaque",
|
|
41
|
-
transaction: "opaque",
|
|
42
|
-
perform: "opaque",
|
|
43
|
-
};
|
|
44
|
-
const QUERY_HANDLER_KEY_KINDS = {
|
|
45
|
-
name: "modeled",
|
|
46
|
-
schema: "modeled",
|
|
47
|
-
handler: "modeled",
|
|
48
|
-
[ENTITY_CONVENTION_QUERY_BRAND]: "opaque",
|
|
49
|
-
access: "modeled",
|
|
50
|
-
description: "modeled",
|
|
51
|
-
agent: "modeled",
|
|
52
|
-
rateLimit: "modeled",
|
|
53
|
-
outputSchema: "opaque",
|
|
54
|
-
liveEntities: "opaque",
|
|
55
|
-
escapeHatch: "modeled",
|
|
56
|
-
};
|
|
57
|
-
const STREAM_HANDLER_KEY_KINDS = {
|
|
58
|
-
name: "modeled",
|
|
59
|
-
schema: "modeled",
|
|
60
|
-
handler: "modeled",
|
|
61
|
-
access: "modeled",
|
|
62
|
-
rateLimit: "modeled",
|
|
63
|
-
escapeHatch: "modeled",
|
|
64
|
-
};
|
|
65
|
-
const HANDLER_KEY_KINDS = {
|
|
66
|
-
writeHandler: WRITE_HANDLER_KEY_KINDS,
|
|
67
|
-
queryHandler: QUERY_HANDLER_KEY_KINDS,
|
|
68
|
-
streamHandler: STREAM_HANDLER_KEY_KINDS,
|
|
69
|
-
};
|
|
70
|
-
function lookupClassification(map, key) {
|
|
71
|
-
return key in map ? map[key] : undefined;
|
|
72
|
-
}
|
|
73
|
-
function isStaticStringNode(node) {
|
|
74
|
-
const kind = node.getKind();
|
|
75
|
-
return kind === SyntaxKind.StringLiteral || kind === SyntaxKind.NoSubstitutionTemplateLiteral;
|
|
76
|
-
}
|
|
77
|
-
function isBooleanLiteralNode(node) {
|
|
78
|
-
const kind = node.getKind();
|
|
79
|
-
return kind === SyntaxKind.TrueKeyword || kind === SyntaxKind.FalseKeyword;
|
|
80
|
-
}
|
|
81
|
-
// The literal readers below only understand a static string `description` and
|
|
82
|
-
// a true/false `unsafeSkipTransitionGuard`; any other value shape is lossy.
|
|
83
|
-
function hasUnreadableLiteralValue(key, initializer) {
|
|
84
|
-
if (key === "description")
|
|
85
|
-
return !(initializer && isStaticStringNode(initializer));
|
|
86
|
-
if (key === "unsafeSkipTransitionGuard")
|
|
87
|
-
return !(initializer && isBooleanLiteralNode(initializer));
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
function readStaticStringProperty(obj, key) {
|
|
91
|
-
const initializer = obj.getProperty(key)?.asKind(SyntaxKind.PropertyAssignment)?.getInitializer();
|
|
92
|
-
return (initializer?.asKind(SyntaxKind.StringLiteral) ??
|
|
93
|
-
initializer?.asKind(SyntaxKind.NoSubstitutionTemplateLiteral))?.getLiteralValue();
|
|
94
|
-
}
|
|
95
|
-
// True when the call's object body/options carry a shape the extractor
|
|
96
|
-
// cannot losslessly model property-by-property (a spread, a method/accessor
|
|
97
|
-
// shorthand, a computed key, or a key outside the classification map above).
|
|
98
|
-
// Callers fall back to the opaque whole-call pattern instead of dropping
|
|
99
|
-
// whatever they can't read.
|
|
100
|
-
function hasUnmodeledShape(obj, methodName) {
|
|
101
|
-
const keyKinds = HANDLER_KEY_KINDS[methodName];
|
|
102
|
-
for (const prop of obj.getProperties()) {
|
|
103
|
-
if (prop.getKind() === SyntaxKind.SpreadAssignment)
|
|
104
|
-
return true;
|
|
105
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
106
|
-
if (propAssign) {
|
|
107
|
-
if (propAssign.getNameNode().getKind() === SyntaxKind.ComputedPropertyName)
|
|
108
|
-
return true;
|
|
109
|
-
const key = readPropertyKey(propAssign);
|
|
110
|
-
if (lookupClassification(keyKinds, key) !== "modeled")
|
|
111
|
-
return true;
|
|
112
|
-
const initializer = propAssign.getInitializer();
|
|
113
|
-
if (hasUnreadableLiteralValue(key, initializer))
|
|
114
|
-
return true;
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
const shorthand = prop.asKind(SyntaxKind.ShorthandPropertyAssignment);
|
|
118
|
-
if (shorthand) {
|
|
119
|
-
const key = shorthand.getName();
|
|
120
|
-
if (lookupClassification(keyKinds, key) !== "modeled")
|
|
121
|
-
return true;
|
|
122
|
-
// A shorthand's value is invisible to the literal readers below.
|
|
123
|
-
if (key === "description" || key === "unsafeSkipTransitionGuard")
|
|
124
|
-
return true;
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Resolves an argument standing in for a handler-call's object-form body:
|
|
133
|
-
* either it's already an object literal, or a bare identifier declared
|
|
134
|
-
* locally (same file only) with one as its initializer. Anything else
|
|
135
|
-
* (imported binding, factory call, ...) is not resolvable here.
|
|
136
|
-
*/
|
|
137
|
-
function resolveObjectLiteralArg(node) {
|
|
138
|
-
const direct = node.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
139
|
-
if (direct)
|
|
140
|
-
return direct;
|
|
141
|
-
const identifier = node.asKind(SyntaxKind.Identifier);
|
|
142
|
-
if (!identifier)
|
|
143
|
-
return undefined;
|
|
144
|
-
const varDecl = node.getSourceFile().getVariableDeclaration(identifier.getText());
|
|
145
|
-
return varDecl?.getInitializer()?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
146
|
-
}
|
|
147
|
-
// Deliberately does NOT resolve identifiers (unlike resolveObjectLiteralArg):
|
|
148
|
-
// an options argument authored as a bare reference has no per-property
|
|
149
|
-
// nodes to read, so parseHandlerCall falls back to the opaque whole-call
|
|
150
|
-
// pattern instead of trying to read headers off it.
|
|
151
|
-
function unwrapObjectLiteral(node) {
|
|
152
|
-
const direct = node.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
153
|
-
if (direct)
|
|
154
|
-
return direct;
|
|
155
|
-
const asExpr = node.asKind(SyntaxKind.AsExpression);
|
|
156
|
-
if (asExpr)
|
|
157
|
-
return unwrapObjectLiteral(asExpr.getExpression());
|
|
158
|
-
const satisfiesExpr = node.asKind(SyntaxKind.SatisfiesExpression);
|
|
159
|
-
if (satisfiesExpr)
|
|
160
|
-
return unwrapObjectLiteral(satisfiesExpr.getExpression());
|
|
161
|
-
const paren = node.asKind(SyntaxKind.ParenthesizedExpression);
|
|
162
|
-
if (paren)
|
|
163
|
-
return unwrapObjectLiteral(paren.getExpression());
|
|
164
|
-
return undefined;
|
|
165
|
-
}
|
|
166
|
-
function readHeaderField(init, recognize, methodName, sourceFile, unrecognizedReason) {
|
|
167
|
-
if (!init)
|
|
168
|
-
return ok(undefined);
|
|
169
|
-
const result = readHeaderValueOrRaw(init, recognize);
|
|
170
|
-
if (result.kind === "value")
|
|
171
|
-
return ok(result.value);
|
|
172
|
-
if (result.kind === "raw")
|
|
173
|
-
return ok(result.sentinel);
|
|
174
|
-
return fail(methodName, sourceLocationFromNode(init, sourceFile), unrecognizedReason);
|
|
175
|
-
}
|
|
176
|
-
// Shared by the object-form call body and the positional options object,
|
|
177
|
-
// which carry the same header shape.
|
|
178
|
-
function readHandlerHeaderFields(obj, methodName, sourceFile) {
|
|
179
|
-
const accessResult = readHeaderField(readObjectPropertyInitializer(obj, "access"), readOptionalAccessRule, methodName, sourceFile, "access must be a recognized AccessRule ({ roles: [...] } or { openToAll: { reason } }), or a reference to one");
|
|
180
|
-
if (accessResult.kind === "error")
|
|
181
|
-
return accessResult;
|
|
182
|
-
const rateLimitResult = readHeaderField(readObjectPropertyInitializer(obj, "rateLimit"), readOptionalRateLimit, methodName, sourceFile, "rateLimit must be { per, limit, windowSeconds }, a non-empty list of those, or { disabled: true, reason }, or a reference to one");
|
|
183
|
-
if (rateLimitResult.kind === "error")
|
|
184
|
-
return rateLimitResult;
|
|
185
|
-
const additionalRateLimitsResult = readHeaderField(readObjectPropertyInitializer(obj, "additionalRateLimits"), readOptionalAdditionalRateLimits, methodName, sourceFile, "additionalRateLimits must be an array of { per: { payloadField }, limit, windowSeconds }, or a reference to one");
|
|
186
|
-
if (additionalRateLimitsResult.kind === "error")
|
|
187
|
-
return additionalRateLimitsResult;
|
|
188
|
-
const escapeHatchResult = readHeaderField(readObjectPropertyInitializer(obj, "escapeHatch"), readOptionalEscapeHatch, methodName, sourceFile, "escapeHatch must be { reason: string }, or a reference to one");
|
|
189
|
-
if (escapeHatchResult.kind === "error")
|
|
190
|
-
return escapeHatchResult;
|
|
191
|
-
const agentResult = readHeaderField(readObjectPropertyInitializer(obj, "agent"), readOptionalAgentHints, methodName, sourceFile, 'agent must be { expose?: boolean, risk?: "low" | "mid" | "high" }, or a reference to one');
|
|
192
|
-
if (agentResult.kind === "error")
|
|
193
|
-
return agentResult;
|
|
194
|
-
return ok({
|
|
195
|
-
...(accessResult.pattern !== undefined && { access: accessResult.pattern }),
|
|
196
|
-
...(rateLimitResult.pattern !== undefined && { rateLimit: rateLimitResult.pattern }),
|
|
197
|
-
...(additionalRateLimitsResult.pattern !== undefined && {
|
|
198
|
-
additionalRateLimits: additionalRateLimitsResult.pattern,
|
|
199
|
-
}),
|
|
200
|
-
...(escapeHatchResult.pattern !== undefined && { escapeHatch: escapeHatchResult.pattern }),
|
|
201
|
-
...(agentResult.pattern !== undefined && { agent: agentResult.pattern }),
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
export function parseHandlerCall(call, sourceFile, methodName) {
|
|
205
|
-
const args = call.getArguments();
|
|
206
|
-
const first = args[0];
|
|
207
|
-
if (!first) {
|
|
208
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "expected at least one argument");
|
|
209
|
-
}
|
|
210
|
-
const obj = args.length === 1 ? resolveObjectLiteralArg(first) : undefined;
|
|
211
|
-
if (obj) {
|
|
212
|
-
if (hasUnmodeledShape(obj, methodName)) {
|
|
213
|
-
return ok({ source: sourceLocationFromNode(call, sourceFile) });
|
|
214
|
-
}
|
|
215
|
-
const nameLiteral = obj
|
|
216
|
-
.getProperty("name")
|
|
217
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
218
|
-
?.getInitializer()
|
|
219
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
220
|
-
if (!nameLiteral) {
|
|
221
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `name` property");
|
|
222
|
-
}
|
|
223
|
-
const schemaInit = obj
|
|
224
|
-
.getProperty("schema")
|
|
225
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
226
|
-
?.getInitializer();
|
|
227
|
-
if (!schemaInit) {
|
|
228
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "object form requires a `schema` property");
|
|
229
|
-
}
|
|
230
|
-
const handlerInit = obj
|
|
231
|
-
.getProperty("handler")
|
|
232
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
233
|
-
?.getInitializer();
|
|
234
|
-
if (!handlerInit) {
|
|
235
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "object form requires a `handler` property");
|
|
236
|
-
}
|
|
237
|
-
const fn = findFunctionLiteral(handlerInit);
|
|
238
|
-
if (!fn) {
|
|
239
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "handler must be an inline arrow function or function expression");
|
|
240
|
-
}
|
|
241
|
-
const headerResult = readHandlerHeaderFields(obj, methodName, sourceFile);
|
|
242
|
-
if (headerResult.kind === "error")
|
|
243
|
-
return headerResult;
|
|
244
|
-
const description = readStaticStringProperty(obj, "description");
|
|
245
|
-
const skip = readBooleanProperty(obj, "unsafeSkipTransitionGuard");
|
|
246
|
-
return ok({
|
|
247
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
248
|
-
handlerName: nameLiteral.getLiteralValue(),
|
|
249
|
-
schemaSource: sourceLocationFromNode(schemaInit, sourceFile),
|
|
250
|
-
handlerBody: sourceLocationFromNode(fn, sourceFile),
|
|
251
|
-
...headerResult.pattern,
|
|
252
|
-
...(description !== undefined && { description }),
|
|
253
|
-
...(skip === true && { unsafeSkipTransitionGuard: true }),
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
// A single reference standing in for the whole handler argument set
|
|
257
|
-
// (`r.writeHandler(eventCreateHandler)`, `r.queryHandler(someQuery())`)
|
|
258
|
-
// that resolveObjectLiteralArg above couldn't turn into an object literal
|
|
259
|
-
// (imported binding, factory call, ...). Keep it recognised as this kind
|
|
260
|
-
// instead of ParseErroring. Opaque: renderWriteHandler/
|
|
261
|
-
// renderQueryHandler re-emit `source.raw` verbatim when handlerName is
|
|
262
|
-
// undefined.
|
|
263
|
-
if (args.length === 1 && isRawRefSentinel(readDataLiteralNode(first))) {
|
|
264
|
-
return ok({ source: sourceLocationFromNode(call, sourceFile) });
|
|
265
|
-
}
|
|
266
|
-
const handlerName = readNameLiteral(first);
|
|
267
|
-
if (handlerName === undefined) {
|
|
268
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "first argument must be a string literal handler name, or an identifier resolving to one (or use the object form)");
|
|
269
|
-
}
|
|
270
|
-
const schemaArg = args[1];
|
|
271
|
-
if (!schemaArg) {
|
|
272
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "expected a Zod schema as second argument");
|
|
273
|
-
}
|
|
274
|
-
const handlerArg = args[2];
|
|
275
|
-
if (!handlerArg) {
|
|
276
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "expected a handler function as third argument");
|
|
277
|
-
}
|
|
278
|
-
const fn = findFunctionLiteral(handlerArg);
|
|
279
|
-
if (!fn) {
|
|
280
|
-
return fail(methodName, sourceLocationFromNode(call, sourceFile), "third argument must be an inline arrow function or function expression");
|
|
281
|
-
}
|
|
282
|
-
const optionsArg = args[3];
|
|
283
|
-
let headerFields = {};
|
|
284
|
-
let description;
|
|
285
|
-
let skipTransitionGuard;
|
|
286
|
-
if (optionsArg) {
|
|
287
|
-
const optionsObj = unwrapObjectLiteral(optionsArg);
|
|
288
|
-
if (!optionsObj || hasUnmodeledShape(optionsObj, methodName)) {
|
|
289
|
-
return ok({ source: sourceLocationFromNode(call, sourceFile) });
|
|
290
|
-
}
|
|
291
|
-
const headerResult = readHandlerHeaderFields(optionsObj, methodName, sourceFile);
|
|
292
|
-
if (headerResult.kind === "error")
|
|
293
|
-
return headerResult;
|
|
294
|
-
headerFields = headerResult.pattern;
|
|
295
|
-
description = readStaticStringProperty(optionsObj, "description");
|
|
296
|
-
skipTransitionGuard = readBooleanProperty(optionsObj, "unsafeSkipTransitionGuard");
|
|
297
|
-
}
|
|
298
|
-
return ok({
|
|
299
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
300
|
-
handlerName,
|
|
301
|
-
schemaSource: sourceLocationFromNode(schemaArg, sourceFile),
|
|
302
|
-
handlerBody: sourceLocationFromNode(fn, sourceFile),
|
|
303
|
-
...headerFields,
|
|
304
|
-
...(description !== undefined && { description }),
|
|
305
|
-
...(skipTransitionGuard === true && { unsafeSkipTransitionGuard: true }),
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
export function extractWriteHandler(call, sourceFile) {
|
|
309
|
-
const parsed = parseHandlerCall(call, sourceFile, "writeHandler");
|
|
310
|
-
if (parsed.kind === "error")
|
|
311
|
-
return parsed;
|
|
312
|
-
return ok({
|
|
313
|
-
kind: "writeHandler",
|
|
314
|
-
source: parsed.pattern.source,
|
|
315
|
-
handlerName: parsed.pattern.handlerName,
|
|
316
|
-
schemaSource: parsed.pattern.schemaSource,
|
|
317
|
-
handlerBody: parsed.pattern.handlerBody,
|
|
318
|
-
...(parsed.pattern.access !== undefined && { access: parsed.pattern.access }),
|
|
319
|
-
...(parsed.pattern.description !== undefined && { description: parsed.pattern.description }),
|
|
320
|
-
...(parsed.pattern.agent !== undefined && { agent: parsed.pattern.agent }),
|
|
321
|
-
...(parsed.pattern.rateLimit !== undefined && { rateLimit: parsed.pattern.rateLimit }),
|
|
322
|
-
...(parsed.pattern.additionalRateLimits !== undefined && {
|
|
323
|
-
additionalRateLimits: parsed.pattern.additionalRateLimits,
|
|
324
|
-
}),
|
|
325
|
-
...(parsed.pattern.unsafeSkipTransitionGuard === true && { unsafeSkipTransitionGuard: true }),
|
|
326
|
-
...(parsed.pattern.escapeHatch !== undefined && { escapeHatch: parsed.pattern.escapeHatch }),
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
function readHandlerFields(parsed) {
|
|
330
|
-
return {
|
|
331
|
-
source: parsed.pattern.source,
|
|
332
|
-
handlerName: parsed.pattern.handlerName,
|
|
333
|
-
schemaSource: parsed.pattern.schemaSource,
|
|
334
|
-
handlerBody: parsed.pattern.handlerBody,
|
|
335
|
-
...(parsed.pattern.access !== undefined && { access: parsed.pattern.access }),
|
|
336
|
-
...(parsed.pattern.rateLimit !== undefined && { rateLimit: parsed.pattern.rateLimit }),
|
|
337
|
-
...(parsed.pattern.escapeHatch !== undefined && { escapeHatch: parsed.pattern.escapeHatch }),
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
export function extractQueryHandler(call, sourceFile) {
|
|
341
|
-
const parsed = parseHandlerCall(call, sourceFile, "queryHandler");
|
|
342
|
-
if (parsed.kind === "error")
|
|
343
|
-
return parsed;
|
|
344
|
-
return ok({
|
|
345
|
-
kind: "queryHandler",
|
|
346
|
-
...readHandlerFields(parsed),
|
|
347
|
-
...(parsed.pattern.description !== undefined && { description: parsed.pattern.description }),
|
|
348
|
-
...(parsed.pattern.agent !== undefined && { agent: parsed.pattern.agent }),
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
// StreamHandlerDef has no description/agent at runtime, unlike escapeHatch,
|
|
352
|
-
// so readHandlerFields forwards only access/rateLimit/escapeHatch.
|
|
353
|
-
export function extractStreamHandler(call, sourceFile) {
|
|
354
|
-
const parsed = parseHandlerCall(call, sourceFile, "streamHandler");
|
|
355
|
-
if (parsed.kind === "error")
|
|
356
|
-
return parsed;
|
|
357
|
-
return ok({ kind: "streamHandler", ...readHandlerFields(parsed) });
|
|
358
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, Node, SourceFile } from "ts-morph";
|
|
2
|
-
import type { LifecycleHookType } from "../../constants.ts";
|
|
3
|
-
import type { AccessRule, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.ts";
|
|
4
|
-
import type { HookPhase } from "../../types/hooks.ts";
|
|
5
|
-
import type { AuthClaimsPattern, HookPattern } from "../patterns.ts";
|
|
6
|
-
import { type ExtractOutput, type RawRefSentinel } from "./shared.ts";
|
|
7
|
-
export type HeaderReadResult<T> = {
|
|
8
|
-
readonly kind: "value";
|
|
9
|
-
readonly value: T;
|
|
10
|
-
} | {
|
|
11
|
-
readonly kind: "raw";
|
|
12
|
-
readonly sentinel: RawRefSentinel;
|
|
13
|
-
} | {
|
|
14
|
-
readonly kind: "unrecognized";
|
|
15
|
-
};
|
|
16
|
-
export declare function readHeaderValueOrRaw<T>(init: Node, recognize: (value: unknown) => T | undefined): HeaderReadResult<T>;
|
|
17
|
-
export declare function isHookType(value: string): value is LifecycleHookType | "validation";
|
|
18
|
-
export declare function readOptionalPhase(node: Node | undefined): HookPhase | undefined;
|
|
19
|
-
export declare function readOptionalAccessRule(value: unknown): AccessRule | undefined;
|
|
20
|
-
export declare function readOptionalRateLimit(value: unknown): RateLimitDeclaration | undefined;
|
|
21
|
-
export declare function readOptionalAdditionalRateLimits(value: unknown): readonly PayloadRateLimitOption[] | undefined;
|
|
22
|
-
export declare function readOptionalEscapeHatch(value: unknown): EscapeHatchDeclaration | undefined;
|
|
23
|
-
export declare function extractHook(call: CallExpression, sourceFile: SourceFile): ExtractOutput<HookPattern>;
|
|
24
|
-
export declare function extractAuthClaims(call: CallExpression, sourceFile: SourceFile): ExtractOutput<AuthClaimsPattern>;
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { isEscapeHatchGrant, isRateLimitOption } from "@cosmicdrift/kumiko-types/handlers";
|
|
2
|
-
import { SyntaxKind } from "ts-morph";
|
|
3
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
4
|
-
import { containsRawRefSentinel, fail, findFunctionLiteral, isPlainObject, ok, readDataLiteralNode, readNameLiteral, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, } from "./shared.js";
|
|
5
|
-
// Raw-sentinel check runs before recognize: recognize narrows literals and
|
|
6
|
-
// would silently drop a nested reference (e.g. roles array plus a
|
|
7
|
-
// non-literal personalData) that the whole-object narrowing can't see.
|
|
8
|
-
export function readHeaderValueOrRaw(init, recognize) {
|
|
9
|
-
const value = readDataLiteralNode(init);
|
|
10
|
-
if (value === undefined || containsRawRefSentinel(value)) {
|
|
11
|
-
return { kind: "raw", sentinel: { __raw: init.getText() } };
|
|
12
|
-
}
|
|
13
|
-
const recognized = recognize(value);
|
|
14
|
-
if (recognized === undefined)
|
|
15
|
-
return { kind: "unrecognized" };
|
|
16
|
-
return { kind: "value", value: recognized };
|
|
17
|
-
}
|
|
18
|
-
export function isHookType(value) {
|
|
19
|
-
return (value === "preSave" ||
|
|
20
|
-
value === "postSave" ||
|
|
21
|
-
value === "preDelete" ||
|
|
22
|
-
value === "postDelete" ||
|
|
23
|
-
value === "preQuery" ||
|
|
24
|
-
value === "validation");
|
|
25
|
-
}
|
|
26
|
-
export function readOptionalPhase(node) {
|
|
27
|
-
if (!node)
|
|
28
|
-
return undefined;
|
|
29
|
-
const obj = readDataLiteralNode(node);
|
|
30
|
-
if (!isPlainObject(obj))
|
|
31
|
-
return undefined;
|
|
32
|
-
const phase = obj["phase"];
|
|
33
|
-
if (phase === "inTransaction" || phase === "afterCommit")
|
|
34
|
-
return phase;
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
// `openToAll: true` (deprecated) is not recognised here — isOpenToAllGranted never grants it, so extracting it would round-trip a rule that looks configured but denies everyone.
|
|
38
|
-
export function readOptionalAccessRule(value) {
|
|
39
|
-
if (!isPlainObject(value))
|
|
40
|
-
return undefined;
|
|
41
|
-
if (Array.isArray(value["roles"]) && value["roles"].every((r) => typeof r === "string")) {
|
|
42
|
-
const personalData = value["personalData"] === "public-intake" ? { personalData: "public-intake" } : {};
|
|
43
|
-
return { roles: value["roles"], ...personalData };
|
|
44
|
-
}
|
|
45
|
-
const openToAll = value["openToAll"];
|
|
46
|
-
if (isPlainObject(openToAll) && typeof openToAll["reason"] === "string") {
|
|
47
|
-
const personalData = openToAll["personalData"] === "tenant-members"
|
|
48
|
-
? { personalData: "tenant-members" }
|
|
49
|
-
: {};
|
|
50
|
-
return { openToAll: { reason: openToAll["reason"], ...personalData } };
|
|
51
|
-
}
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
export function readOptionalRateLimit(value) {
|
|
55
|
-
if (Array.isArray(value)) {
|
|
56
|
-
if (!value.every(isRateLimitOption))
|
|
57
|
-
return undefined;
|
|
58
|
-
const [first, ...rest] = value;
|
|
59
|
-
return first === undefined ? undefined : [first, ...rest];
|
|
60
|
-
}
|
|
61
|
-
if (!isPlainObject(value))
|
|
62
|
-
return undefined;
|
|
63
|
-
if (value["disabled"] === true) {
|
|
64
|
-
// Strict shape: exactly { disabled: true, reason } — anything extra
|
|
65
|
-
// isn't RateLimitDisabled and falls through to "unrecognized".
|
|
66
|
-
if (typeof value["reason"] !== "string")
|
|
67
|
-
return undefined;
|
|
68
|
-
if (Object.keys(value).length !== 2)
|
|
69
|
-
return undefined;
|
|
70
|
-
return { disabled: true, reason: value["reason"] };
|
|
71
|
-
}
|
|
72
|
-
return isRateLimitOption(value) ? value : undefined;
|
|
73
|
-
}
|
|
74
|
-
function isPayloadRateLimitOption(value) {
|
|
75
|
-
if (!isPlainObject(value))
|
|
76
|
-
return false;
|
|
77
|
-
const per = value["per"];
|
|
78
|
-
return (isPlainObject(per) &&
|
|
79
|
-
typeof per["payloadField"] === "string" &&
|
|
80
|
-
typeof value["limit"] === "number" &&
|
|
81
|
-
typeof value["windowSeconds"] === "number");
|
|
82
|
-
}
|
|
83
|
-
export function readOptionalAdditionalRateLimits(value) {
|
|
84
|
-
if (!Array.isArray(value) || !value.every(isPayloadRateLimitOption))
|
|
85
|
-
return undefined;
|
|
86
|
-
return value;
|
|
87
|
-
}
|
|
88
|
-
export function readOptionalEscapeHatch(value) {
|
|
89
|
-
if (!isPlainObject(value))
|
|
90
|
-
return undefined;
|
|
91
|
-
if (typeof value["reason"] !== "string")
|
|
92
|
-
return undefined;
|
|
93
|
-
const grants = value["grants"];
|
|
94
|
-
if (grants === undefined)
|
|
95
|
-
return { reason: value["reason"] };
|
|
96
|
-
if (!Array.isArray(grants) || !grants.every(isEscapeHatchGrant))
|
|
97
|
-
return undefined;
|
|
98
|
-
return { reason: value["reason"], grants };
|
|
99
|
-
}
|
|
100
|
-
// Reads the `escapeHatch` sub-property node first, not via readDataLiteralNode
|
|
101
|
-
// on the whole object: a sibling property like `handler` (a closure) isn't
|
|
102
|
-
// representable as plain data, which would make the whole-object read
|
|
103
|
-
// return undefined. undefined means the property is absent, not an error.
|
|
104
|
-
function readOptionalHookEscapeHatch(node) {
|
|
105
|
-
const obj = node?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
106
|
-
if (!obj)
|
|
107
|
-
return undefined;
|
|
108
|
-
const init = readObjectPropertyInitializer(obj, "escapeHatch");
|
|
109
|
-
if (!init)
|
|
110
|
-
return undefined;
|
|
111
|
-
return readHeaderValueOrRaw(init, readOptionalEscapeHatch);
|
|
112
|
-
}
|
|
113
|
-
// Resolves the hook's escapeHatch into either a field to spread into the
|
|
114
|
-
// pattern, or a ParseError for a fully literal but unrecognized shape.
|
|
115
|
-
function readHookEscapeHatch(node, call, sourceFile) {
|
|
116
|
-
const result = readOptionalHookEscapeHatch(node);
|
|
117
|
-
if (!result)
|
|
118
|
-
return {};
|
|
119
|
-
if (result.kind === "unrecognized") {
|
|
120
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "escapeHatch must be { reason: string }, or a reference to one");
|
|
121
|
-
}
|
|
122
|
-
return { escapeHatch: result.kind === "value" ? result.value : result.sentinel };
|
|
123
|
-
}
|
|
124
|
-
// r.hook's target: a NameOrRef, a list of them, or an entity-wide
|
|
125
|
-
// `{ allOf: entityRef }` (replaces the old r.entityHook(type, entity, fn)).
|
|
126
|
-
// Checked first so a malformed `{ allOf }` doesn't silently fall through
|
|
127
|
-
// to being read as some other object shape.
|
|
128
|
-
function readHookTarget(node) {
|
|
129
|
-
const obj = node.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
130
|
-
if (obj) {
|
|
131
|
-
const allOfProp = obj.getProperty("allOf")?.asKind(SyntaxKind.PropertyAssignment);
|
|
132
|
-
if (allOfProp) {
|
|
133
|
-
const initializer = allOfProp.getInitializer();
|
|
134
|
-
const entityName = initializer && readNameOrRef(initializer);
|
|
135
|
-
return entityName ? { allOf: entityName } : undefined;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return readNameOrRefOrList(node);
|
|
139
|
-
}
|
|
140
|
-
export function extractHook(call, sourceFile) {
|
|
141
|
-
const args = call.getArguments();
|
|
142
|
-
const first = args[0];
|
|
143
|
-
if (!first) {
|
|
144
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "expected at least one argument");
|
|
145
|
-
}
|
|
146
|
-
const obj = first.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
147
|
-
if (obj && args.length === 1) {
|
|
148
|
-
const typeInit = obj
|
|
149
|
-
.getProperty("type")
|
|
150
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
151
|
-
?.getInitializer()
|
|
152
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
153
|
-
if (!typeInit) {
|
|
154
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `type` property");
|
|
155
|
-
}
|
|
156
|
-
const hookType = typeInit.getLiteralValue();
|
|
157
|
-
if (!isHookType(hookType)) {
|
|
158
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), `hook type "${hookType}" is not one of the lifecycle types or "validation"`);
|
|
159
|
-
}
|
|
160
|
-
const targetInit = obj
|
|
161
|
-
.getProperty("target")
|
|
162
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
163
|
-
?.getInitializer();
|
|
164
|
-
if (!targetInit) {
|
|
165
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "object form requires a `target` property");
|
|
166
|
-
}
|
|
167
|
-
const target = readHookTarget(targetInit);
|
|
168
|
-
if (!target) {
|
|
169
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "target must be a string literal, an inline { name } object, or an array");
|
|
170
|
-
}
|
|
171
|
-
const handlerInit = obj
|
|
172
|
-
.getProperty("handler")
|
|
173
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
174
|
-
?.getInitializer();
|
|
175
|
-
if (!handlerInit) {
|
|
176
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "object form requires a `handler` property");
|
|
177
|
-
}
|
|
178
|
-
const fn = findFunctionLiteral(handlerInit);
|
|
179
|
-
if (!fn) {
|
|
180
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "handler must be an inline arrow function or function expression");
|
|
181
|
-
}
|
|
182
|
-
const phase = readOptionalPhase(obj);
|
|
183
|
-
const escapeHatchOutcome = readHookEscapeHatch(obj, call, sourceFile);
|
|
184
|
-
if ("kind" in escapeHatchOutcome)
|
|
185
|
-
return escapeHatchOutcome;
|
|
186
|
-
return ok({
|
|
187
|
-
kind: "hook",
|
|
188
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
189
|
-
hookType,
|
|
190
|
-
target,
|
|
191
|
-
fnBody: sourceLocationFromNode(fn, sourceFile),
|
|
192
|
-
...(phase !== undefined && { phase }),
|
|
193
|
-
...escapeHatchOutcome,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
const hookType = readNameLiteral(first);
|
|
197
|
-
if (hookType === undefined) {
|
|
198
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "first argument must be a string literal hook type, or an identifier resolving to one (or use the object form)");
|
|
199
|
-
}
|
|
200
|
-
if (!isHookType(hookType)) {
|
|
201
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), `hook type "${hookType}" is not one of the lifecycle types or "validation"`);
|
|
202
|
-
}
|
|
203
|
-
const targetArg = args[1];
|
|
204
|
-
if (!targetArg) {
|
|
205
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "expected a target (NameOrRef or array) as second argument");
|
|
206
|
-
}
|
|
207
|
-
const target = readHookTarget(targetArg);
|
|
208
|
-
if (!target) {
|
|
209
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "target must be a string literal, an inline { name } object, or an array");
|
|
210
|
-
}
|
|
211
|
-
const fnArg = args[2];
|
|
212
|
-
if (!fnArg) {
|
|
213
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "expected a hook function as third argument");
|
|
214
|
-
}
|
|
215
|
-
const fn = findFunctionLiteral(fnArg);
|
|
216
|
-
if (!fn) {
|
|
217
|
-
return fail("hook", sourceLocationFromNode(call, sourceFile), "third argument must be an inline arrow function or function expression");
|
|
218
|
-
}
|
|
219
|
-
const phase = readOptionalPhase(args[3]);
|
|
220
|
-
const escapeHatchOutcome = readHookEscapeHatch(args[3], call, sourceFile);
|
|
221
|
-
if ("kind" in escapeHatchOutcome)
|
|
222
|
-
return escapeHatchOutcome;
|
|
223
|
-
return ok({
|
|
224
|
-
kind: "hook",
|
|
225
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
226
|
-
hookType,
|
|
227
|
-
target,
|
|
228
|
-
fnBody: sourceLocationFromNode(fn, sourceFile),
|
|
229
|
-
...(phase !== undefined && { phase }),
|
|
230
|
-
...escapeHatchOutcome,
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
// guard:dup-ok — intentional parallel to extractTree; different Feature-AST extractors by design
|
|
234
|
-
export function extractAuthClaims(call, sourceFile) {
|
|
235
|
-
const arg = call.getArguments()[0];
|
|
236
|
-
if (!arg) {
|
|
237
|
-
return fail("authClaims", sourceLocationFromNode(call, sourceFile), "expected a function as first argument");
|
|
238
|
-
}
|
|
239
|
-
const fn = findFunctionLiteral(arg);
|
|
240
|
-
if (!fn) {
|
|
241
|
-
return fail("authClaims", sourceLocationFromNode(call, sourceFile), "first argument must be an inline arrow function or function expression");
|
|
242
|
-
}
|
|
243
|
-
return ok({
|
|
244
|
-
kind: "authClaims",
|
|
245
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
246
|
-
fnBody: sourceLocationFromNode(fn, sourceFile),
|
|
247
|
-
});
|
|
248
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export { extractAiClassify, extractAiExtract, extractAiGenerate, } from "./ai-steps.ts";
|
|
2
|
-
export { extractDefineEvent, extractNotification, } from "./events.ts";
|
|
3
|
-
export { extractQueryHandler, extractStreamHandler, extractWriteHandler, type ParsedHandlerCall, parseHandlerCall, } from "./handlers.ts";
|
|
4
|
-
export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalPhase, readOptionalRateLimit, } from "./hooks.ts";
|
|
5
|
-
export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.ts";
|
|
6
|
-
export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.ts";
|
|
7
|
-
export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.ts";
|
|
8
|
-
export { extractAdoptsBundledLists, extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.ts";
|
|
9
|
-
export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.ts";
|
|
10
|
-
export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, type NamedOptionsResult, readNamedOptions, } from "./round3.ts";
|
|
11
|
-
export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.ts";
|
|
12
|
-
export { extractTreeActions } from "./round6.ts";
|
|
13
|
-
export type { ExtractOutput } from "./shared.ts";
|
|
14
|
-
export { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, readPropertyKey, readStringLiteralArgs, readVarargsOrArrayProp, resolveSameFileObjectLiteral, } from "./shared.ts";
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { extractAiClassify, extractAiExtract, extractAiGenerate, } from "./ai-steps.js";
|
|
2
|
-
export { extractDefineEvent, extractNotification, } from "./events.js";
|
|
3
|
-
export { extractQueryHandler, extractStreamHandler, extractWriteHandler, parseHandlerCall, } from "./handlers.js";
|
|
4
|
-
export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, readOptionalAdditionalRateLimits, readOptionalPhase, readOptionalRateLimit, } from "./hooks.js";
|
|
5
|
-
export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.js";
|
|
6
|
-
export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.js";
|
|
7
|
-
export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.js";
|
|
8
|
-
export { extractAdoptsBundledLists, extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.js";
|
|
9
|
-
export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.js";
|
|
10
|
-
export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, readNamedOptions, } from "./round3.js";
|
|
11
|
-
export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.js";
|
|
12
|
-
export { extractTreeActions } from "./round6.js";
|
|
13
|
-
export { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameOrRef, readNameOrRefOrList, readObjectPropertyInitializer, readPropertyKey, readStringLiteralArgs, readVarargsOrArrayProp, resolveSameFileObjectLiteral, } from "./shared.js";
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, SourceFile } from "ts-morph";
|
|
2
|
-
import type { HttpRouteMethod } from "../../types/http-route.ts";
|
|
3
|
-
import type { HttpRoutePattern, JobPattern } from "../patterns.ts";
|
|
4
|
-
import { type ExtractOutput } from "./shared.ts";
|
|
5
|
-
export declare function isHttpRouteMethod(value: string): value is HttpRouteMethod;
|
|
6
|
-
export declare function extractJob(call: CallExpression, sourceFile: SourceFile): ExtractOutput<JobPattern>;
|
|
7
|
-
export declare function extractHttpRoute(call: CallExpression, sourceFile: SourceFile): ExtractOutput<HttpRoutePattern>;
|