@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,485 +0,0 @@
|
|
|
1
|
-
// parseFeatureFile — entry-point for AST pattern detection. Reads a
|
|
2
|
-
// `defineFeature.ts` file, walks the `setup(r => { ... })` callback,
|
|
3
|
-
// and emits one FeaturePattern per recognised `r.*` call.
|
|
4
|
-
//
|
|
5
|
-
// **Pipeline position:**
|
|
6
|
-
//
|
|
7
|
-
// ┌──────────────────┐ parseFeatureFile ┌─────────────────────┐
|
|
8
|
-
// │ feature-file.ts │ ──────────────────────► │ ParseResult │
|
|
9
|
-
// │ (defineFeature │ │ - featureName │
|
|
10
|
-
// │ with r.* calls) │ │ - patterns: FP[] │
|
|
11
|
-
// └──────────────────┘ │ - errors: PE[] │
|
|
12
|
-
// └─────────────────────┘
|
|
13
|
-
//
|
|
14
|
-
// **What is NOT extracted:**
|
|
15
|
-
// - Imports, helper functions, local consts between the `r.*` calls.
|
|
16
|
-
// Those stay in the file buffer and survive every patch unchanged.
|
|
17
|
-
// - Top-level code outside `defineFeature(...)`. Designer/AI treat
|
|
18
|
-
// such files as "not a feature file".
|
|
19
|
-
//
|
|
20
|
-
// **Skeleton status:** interface fixed, extractors are TODO.
|
|
21
|
-
// Per-pattern extractors fill in iteratively — each iteration adds
|
|
22
|
-
// one extractor + a focused test.
|
|
23
|
-
import { Project, SyntaxKind } from "ts-morph";
|
|
24
|
-
import { extractAdoptsBundledLists, extractAiClassify, extractAiExtract, extractAiGenerate, extractAuthClaims, extractBootCheck, extractClaimKey, extractConfig, extractDefineEvent, extractDescribe, extractEntity, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractHook, extractHttpRoute, extractJob, extractMetric, extractMultiStreamProjection, extractNav, extractNotification, extractOptionalRequires, extractProjection, extractQueryHandler, extractReadsConfig, extractReferenceData, extractRelation, extractRequires, extractScreen, extractSecret, extractSecretNamespace, extractStoreTable, extractStreamHandler, extractSystemScope, extractToggleable, extractTranslations, extractTreeActions, extractUiHints, extractUseExtension, extractUsesApi, extractWorkspace, extractWriteHandler, findFunctionLiteral, findImportBindingForLocalName, readObjectPropertyInitializer, resolveModuleFile, resolveSameFileObjectLiteral, } from "./extractors/index.js";
|
|
25
|
-
import { sourceLocationFromNode } from "./source-location.js";
|
|
26
|
-
/**
|
|
27
|
-
* Parse the given feature file and return all recognised r.* calls
|
|
28
|
-
* as a FeaturePattern list.
|
|
29
|
-
*
|
|
30
|
-
* Does NOT throw on TypeScript errors — the visitor works on the syntax
|
|
31
|
-
* tree, not on the type checker. Files with type errors can still be
|
|
32
|
-
* parsed structurally (Designer keeps showing them, AI can suggest fixes).
|
|
33
|
-
*
|
|
34
|
-
* Throws on filesystem / parse errors that ts-morph cannot recover from.
|
|
35
|
-
*/
|
|
36
|
-
export function parseFeatureFile(filePath) {
|
|
37
|
-
const project = new Project({
|
|
38
|
-
// Skip tsconfig file discovery: we only ever load this single file.
|
|
39
|
-
// Without these flags ts-morph would resolve the whole tsconfig
|
|
40
|
-
// tree, which is expensive on large repos and unnecessary for
|
|
41
|
-
// structural analysis.
|
|
42
|
-
skipAddingFilesFromTsConfig: true,
|
|
43
|
-
skipFileDependencyResolution: true,
|
|
44
|
-
});
|
|
45
|
-
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
46
|
-
return parseSourceFile(sourceFile);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Same as parseFeatureFile, but for SourceFiles already loaded by the
|
|
50
|
-
* caller. Useful for tests + the Designer (which keeps its own Project
|
|
51
|
-
* instance and avoids re-IO per parse).
|
|
52
|
-
*/
|
|
53
|
-
export function parseSourceFile(sourceFile) {
|
|
54
|
-
const setupCall = findDefineFeatureCall(sourceFile);
|
|
55
|
-
if (!setupCall) {
|
|
56
|
-
return { featureName: undefined, patterns: [], errors: [] };
|
|
57
|
-
}
|
|
58
|
-
const featureName = extractFeatureName(setupCall);
|
|
59
|
-
const setupCallback = extractSetupCallback(setupCall);
|
|
60
|
-
if (!setupCallback) {
|
|
61
|
-
return { featureName, patterns: [], errors: [] };
|
|
62
|
-
}
|
|
63
|
-
const registrarParamName = extractRegistrarParamName(setupCallback);
|
|
64
|
-
if (!registrarParamName) {
|
|
65
|
-
return { featureName, patterns: [], errors: [] };
|
|
66
|
-
}
|
|
67
|
-
const patterns = [];
|
|
68
|
-
const errors = [];
|
|
69
|
-
walkSetupCallback(setupCallback.getBody(), registrarParamName, sourceFile, patterns, errors);
|
|
70
|
-
walkAiStepCalls(setupCallback.getBody(), registrarParamName, sourceFile, patterns, errors);
|
|
71
|
-
// Tie-break on the path relative to the entry file's directory so cross-file
|
|
72
|
-
// registrar wrappers don't interleave by foreign line numbers alone, without
|
|
73
|
-
// the order depending on where the repo is checked out (worktrees).
|
|
74
|
-
const parseRoot = sourceFile.getDirectoryPath();
|
|
75
|
-
patterns.sort((a, b) => {
|
|
76
|
-
const fileCmp = relativePosixPath(parseRoot, a.source.file).localeCompare(relativePosixPath(parseRoot, b.source.file));
|
|
77
|
-
if (fileCmp !== 0)
|
|
78
|
-
return fileCmp;
|
|
79
|
-
return a.source.start.line - b.source.start.line;
|
|
80
|
-
});
|
|
81
|
-
return { featureName, patterns, errors };
|
|
82
|
-
}
|
|
83
|
-
// node:path is avoided: the Designer runs this against an in-memory file
|
|
84
|
-
// system outside Node. ts-morph paths are always posix-style.
|
|
85
|
-
export function relativePosixPath(fromDirectory, filePath) {
|
|
86
|
-
const fromSegments = fromDirectory.split("/").filter(Boolean);
|
|
87
|
-
const fileSegments = filePath.split("/").filter(Boolean);
|
|
88
|
-
let common = 0;
|
|
89
|
-
while (common < fromSegments.length &&
|
|
90
|
-
common < fileSegments.length - 1 &&
|
|
91
|
-
fromSegments[common] === fileSegments[common]) {
|
|
92
|
-
common += 1;
|
|
93
|
-
}
|
|
94
|
-
return [...fromSegments.slice(common).map(() => ".."), ...fileSegments.slice(common)].join("/");
|
|
95
|
-
}
|
|
96
|
-
// =============================================================================
|
|
97
|
-
// Internal — locate defineFeature + setup callback
|
|
98
|
-
// =============================================================================
|
|
99
|
-
/**
|
|
100
|
-
* Find the `defineFeature(name, setup)` call in the source file.
|
|
101
|
-
* Convention: each feature file invokes `defineFeature` exactly once
|
|
102
|
-
* at top level. If multiple calls exist (unusual outside of test
|
|
103
|
-
* helpers) we take the first.
|
|
104
|
-
*/
|
|
105
|
-
function findDefineFeatureCall(sourceFile) {
|
|
106
|
-
for (const stmt of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
107
|
-
const expr = stmt.getExpression();
|
|
108
|
-
if (expr.getText() === "defineFeature") {
|
|
109
|
-
return stmt;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return undefined;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Read the feature name from the first argument of `defineFeature(...)`.
|
|
116
|
-
* Returns undefined when the argument is not a string literal (e.g.
|
|
117
|
-
* dynamic name from a const). Designer can still load the file but the
|
|
118
|
-
* AI generator will never produce such a setup.
|
|
119
|
-
*/
|
|
120
|
-
function extractFeatureName(call) {
|
|
121
|
-
const arg = call.getArguments()[0];
|
|
122
|
-
if (!arg)
|
|
123
|
-
return undefined;
|
|
124
|
-
const literal = arg.asKind(SyntaxKind.StringLiteral);
|
|
125
|
-
if (!literal)
|
|
126
|
-
return undefined;
|
|
127
|
-
return literal.getLiteralValue();
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Read the `setup` callback (second argument) from `defineFeature(...)`.
|
|
131
|
-
* We only support the arrow-function form here — function expressions
|
|
132
|
-
* have not turned up in any sample so far. If a future feature needs
|
|
133
|
-
* them, this is the single hook to extend.
|
|
134
|
-
*/
|
|
135
|
-
function extractSetupCallback(call) {
|
|
136
|
-
const arg = call.getArguments()[1];
|
|
137
|
-
if (!arg)
|
|
138
|
-
return undefined;
|
|
139
|
-
return arg.asKind(SyntaxKind.ArrowFunction);
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Read the parameter name of the setup callback's first parameter.
|
|
143
|
-
* Idiomatic feature files call it `r`, but `(registrar) => { ... }` or
|
|
144
|
-
* `(reg) => { ... }` are equally legal — the visitor must follow the
|
|
145
|
-
* author's choice or it would silently miss every call.
|
|
146
|
-
*
|
|
147
|
-
* Returns undefined when the callback takes no parameter at all (a
|
|
148
|
-
* feature that does nothing — empty patterns list, no error).
|
|
149
|
-
*/
|
|
150
|
-
function extractRegistrarParamName(setup) {
|
|
151
|
-
const param = setup.getParameters()[0];
|
|
152
|
-
if (!param)
|
|
153
|
-
return undefined;
|
|
154
|
-
return param.getName();
|
|
155
|
-
}
|
|
156
|
-
// =============================================================================
|
|
157
|
-
// Internal — walk + dispatch
|
|
158
|
-
// =============================================================================
|
|
159
|
-
/**
|
|
160
|
-
* Walk the body of the setup callback and route every `<param>.<method>(...)`
|
|
161
|
-
* call to the matching extractor. Helper functions / local variables /
|
|
162
|
-
* imports are ignored.
|
|
163
|
-
*
|
|
164
|
-
* We rely on `getDescendantsOfKind` rather than walking only direct
|
|
165
|
-
* children: the `r.*` API is always called on the registrar variable,
|
|
166
|
-
* which the closure rules keep scoped to the setup callback. Nested
|
|
167
|
-
* calls inside a writeHandler closure would not see `r` and therefore
|
|
168
|
-
* cannot pose as feature-level patterns — collisions are
|
|
169
|
-
* structurally impossible.
|
|
170
|
-
*/
|
|
171
|
-
function walkSetupCallback(body, registrarParamName, sourceFile, patterns, errors, visitedWrapperDecls = new Set()) {
|
|
172
|
-
for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
173
|
-
const methodName = extractRegistrarMethodName(call, registrarParamName);
|
|
174
|
-
if (methodName) {
|
|
175
|
-
const result = dispatchExtractor(methodName, call, sourceFile);
|
|
176
|
-
if (result.kind === "pattern") {
|
|
177
|
-
patterns.push(result.pattern);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
errors.push(result.error);
|
|
181
|
-
}
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
// Not a direct `<registrarParam>.<method>(...)` call. Check whether it's
|
|
185
|
-
// a registrar-wrapper call — a function that receives the registrar as
|
|
186
|
-
// a bare argument, e.g. `registerShowPonyScreens(r)`. Such wrappers are
|
|
187
|
-
// invisible to a receiver-shape match, so we resolve the callee (same
|
|
188
|
-
// file, or the declaring file of a named import) and recurse
|
|
189
|
-
// into its body with its own parameter name for the registrar slot.
|
|
190
|
-
const wrapper = resolveRegistrarWrapperCall(call, registrarParamName);
|
|
191
|
-
if (!wrapper)
|
|
192
|
-
continue; // Free function call unrelated to the registrar — ignore.
|
|
193
|
-
if (visitedWrapperDecls.has(wrapper.declNode))
|
|
194
|
-
continue; // Cycle guard.
|
|
195
|
-
visitedWrapperDecls.add(wrapper.declNode);
|
|
196
|
-
// wrapper.sourceFile, not the outer `sourceFile` param: a cross-file
|
|
197
|
-
// wrapper's body lives in a different file, and sourceLocationFromNode
|
|
198
|
-
// uses whichever SourceFile it's given for both the `file` path and
|
|
199
|
-
// the line/column table — passing the wrong one silently corrupts
|
|
200
|
-
// both for every pattern found inside the wrapper.
|
|
201
|
-
walkSetupCallback(wrapper.body, wrapper.paramName, wrapper.sourceFile, patterns, errors, visitedWrapperDecls);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Resolves a bare call like `registerShowPonyScreens(r)` to the callee's
|
|
206
|
-
* body + its own parameter name for the registrar slot. The callee may be
|
|
207
|
-
* declared in the same file, or imported by name from another file —
|
|
208
|
-
* resolved syntactically via resolveModuleFile, which only works against a
|
|
209
|
-
* real-filesystem Project; the in-memory Designer Project has no files to
|
|
210
|
-
* resolve against and returns undefined there, same as any other
|
|
211
|
-
* unresolvable reference. Does not follow re-exports in the target file — a
|
|
212
|
-
* wrapper function is expected to be declared directly in the module it's
|
|
213
|
-
* imported from.
|
|
214
|
-
*/
|
|
215
|
-
function resolveRegistrarWrapperCall(call, registrarParamName) {
|
|
216
|
-
const callee = call.getExpression().asKind(SyntaxKind.Identifier);
|
|
217
|
-
if (!callee)
|
|
218
|
-
return undefined;
|
|
219
|
-
const args = call.getArguments();
|
|
220
|
-
const argIndex = args.findIndex((arg) => arg.getText() === registrarParamName);
|
|
221
|
-
if (argIndex === -1)
|
|
222
|
-
return undefined; // Registrar not passed to this call.
|
|
223
|
-
const callSourceFile = call.getSourceFile();
|
|
224
|
-
const name = callee.getText();
|
|
225
|
-
const local = resolveWrapperDeclarationInFile(callSourceFile, name, argIndex);
|
|
226
|
-
if (local)
|
|
227
|
-
return { ...local, sourceFile: callSourceFile };
|
|
228
|
-
const binding = findImportBindingForLocalName(callSourceFile, name);
|
|
229
|
-
if (!binding)
|
|
230
|
-
return undefined;
|
|
231
|
-
const targetFile = resolveModuleFile(callSourceFile, binding.moduleSpecifier);
|
|
232
|
-
if (!targetFile)
|
|
233
|
-
return undefined; // Unresolvable: in-memory project, external package, or missing file.
|
|
234
|
-
const imported = resolveWrapperDeclarationInFile(targetFile, binding.importedName, argIndex);
|
|
235
|
-
return imported ? { ...imported, sourceFile: targetFile } : undefined;
|
|
236
|
-
}
|
|
237
|
-
function resolveWrapperDeclarationInFile(sourceFile, name, argIndex) {
|
|
238
|
-
const fnDecl = sourceFile.getFunction(name);
|
|
239
|
-
if (fnDecl) {
|
|
240
|
-
const param = fnDecl.getParameters()[argIndex];
|
|
241
|
-
const body = fnDecl.getBody();
|
|
242
|
-
if (!param || !body)
|
|
243
|
-
return undefined;
|
|
244
|
-
return { body, paramName: param.getName(), declNode: fnDecl };
|
|
245
|
-
}
|
|
246
|
-
const varDecl = sourceFile.getVariableDeclaration(name);
|
|
247
|
-
const init = varDecl?.getInitializer();
|
|
248
|
-
const literal = init ? findFunctionLiteral(init) : undefined;
|
|
249
|
-
const fnLiteral = literal?.asKind(SyntaxKind.ArrowFunction) ?? literal?.asKind(SyntaxKind.FunctionExpression);
|
|
250
|
-
if (fnLiteral) {
|
|
251
|
-
const param = fnLiteral.getParameters()[argIndex];
|
|
252
|
-
if (!param)
|
|
253
|
-
return undefined;
|
|
254
|
-
return { body: fnLiteral.getBody(), paramName: param.getName(), declNode: fnLiteral };
|
|
255
|
-
}
|
|
256
|
-
return undefined;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Returns the method name when the call has the form
|
|
260
|
-
* `<registrarParamName>.<method>(...)`, otherwise undefined.
|
|
261
|
-
*
|
|
262
|
-
* Reads the property-access expression on the call's left-hand side
|
|
263
|
-
* and matches the receiver against the captured parameter name. Any
|
|
264
|
-
* other shape (free function call, method call on something else)
|
|
265
|
-
* returns undefined and is skipped by the walker.
|
|
266
|
-
*/
|
|
267
|
-
function extractRegistrarMethodName(call, registrarParamName) {
|
|
268
|
-
const expr = call.getExpression();
|
|
269
|
-
const propAccess = expr.asKind(SyntaxKind.PropertyAccessExpression);
|
|
270
|
-
if (!propAccess)
|
|
271
|
-
return undefined;
|
|
272
|
-
const receiver = propAccess.getExpression();
|
|
273
|
-
if (receiver.getText() !== registrarParamName)
|
|
274
|
-
return undefined;
|
|
275
|
-
return propAccess.getName();
|
|
276
|
-
}
|
|
277
|
-
function resolveStepsArrayRoot(stepsInit) {
|
|
278
|
-
const directArray = stepsInit.asKind(SyntaxKind.ArrayLiteralExpression);
|
|
279
|
-
if (directArray)
|
|
280
|
-
return directArray;
|
|
281
|
-
const pipelineCall = stepsInit.asKind(SyntaxKind.CallExpression);
|
|
282
|
-
if (pipelineCall?.getExpression().getText() !== "stepsPipeline") {
|
|
283
|
-
return undefined;
|
|
284
|
-
}
|
|
285
|
-
const closureArg = pipelineCall.getArguments()[0];
|
|
286
|
-
if (!closureArg)
|
|
287
|
-
return undefined;
|
|
288
|
-
const fn = findFunctionLiteral(closureArg);
|
|
289
|
-
if (!fn)
|
|
290
|
-
return undefined;
|
|
291
|
-
const fnBody = fn.asKind(SyntaxKind.ArrowFunction)?.getBody() ??
|
|
292
|
-
fn.asKind(SyntaxKind.FunctionExpression)?.getBody();
|
|
293
|
-
const exprBody = fnBody?.asKind(SyntaxKind.ArrayLiteralExpression);
|
|
294
|
-
if (exprBody)
|
|
295
|
-
return exprBody;
|
|
296
|
-
if (fnBody?.isKind(SyntaxKind.Block)) {
|
|
297
|
-
for (const stmt of fnBody.getStatements()) {
|
|
298
|
-
const ret = stmt.asKind(SyntaxKind.ReturnStatement);
|
|
299
|
-
const retArray = ret?.getExpression()?.asKind(SyntaxKind.ArrayLiteralExpression);
|
|
300
|
-
if (retArray)
|
|
301
|
-
return retArray;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return undefined;
|
|
305
|
-
}
|
|
306
|
-
function collectWorkflowStepArrayRoots(body) {
|
|
307
|
-
const roots = [];
|
|
308
|
-
for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
309
|
-
if (call.getExpression().getText() !== "defineWorkflow")
|
|
310
|
-
continue;
|
|
311
|
-
const obj = resolveSameFileObjectLiteral(call.getArguments()[0] ?? call);
|
|
312
|
-
if (!obj)
|
|
313
|
-
continue;
|
|
314
|
-
const stepsInit = readObjectPropertyInitializer(obj, "steps");
|
|
315
|
-
if (!stepsInit)
|
|
316
|
-
continue;
|
|
317
|
-
const arrayRoot = resolveStepsArrayRoot(stepsInit);
|
|
318
|
-
if (arrayRoot)
|
|
319
|
-
roots.push(arrayRoot);
|
|
320
|
-
}
|
|
321
|
-
return roots;
|
|
322
|
-
}
|
|
323
|
-
function walkAiStepCallsInNode(node, sourceFile, patterns, errors) {
|
|
324
|
-
for (const call of node.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
325
|
-
const callee = call.getExpression().getText();
|
|
326
|
-
switch (callee) {
|
|
327
|
-
case "aiGenerateStep": {
|
|
328
|
-
const result = extractAiGenerate(call, sourceFile);
|
|
329
|
-
if (result.kind === "pattern")
|
|
330
|
-
patterns.push(result.pattern);
|
|
331
|
-
else
|
|
332
|
-
errors.push(result.error);
|
|
333
|
-
break;
|
|
334
|
-
}
|
|
335
|
-
case "aiExtractStep": {
|
|
336
|
-
const result = extractAiExtract(call, sourceFile);
|
|
337
|
-
if (result.kind === "pattern")
|
|
338
|
-
patterns.push(result.pattern);
|
|
339
|
-
else
|
|
340
|
-
errors.push(result.error);
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
case "aiClassifyStep": {
|
|
344
|
-
const result = extractAiClassify(call, sourceFile);
|
|
345
|
-
if (result.kind === "pattern")
|
|
346
|
-
patterns.push(result.pattern);
|
|
347
|
-
else
|
|
348
|
-
errors.push(result.error);
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
default:
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
function walkAiStepCalls(body, registrarParamName, sourceFile, patterns, errors, visitedWrapperDecls = new Set()) {
|
|
357
|
-
for (const arrayRoot of collectWorkflowStepArrayRoots(body)) {
|
|
358
|
-
walkAiStepCallsInNode(arrayRoot, sourceFile, patterns, errors);
|
|
359
|
-
}
|
|
360
|
-
for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
361
|
-
const wrapper = resolveRegistrarWrapperCall(call, registrarParamName);
|
|
362
|
-
if (!wrapper)
|
|
363
|
-
continue;
|
|
364
|
-
if (visitedWrapperDecls.has(wrapper.declNode))
|
|
365
|
-
continue;
|
|
366
|
-
visitedWrapperDecls.add(wrapper.declNode);
|
|
367
|
-
walkAiStepCalls(wrapper.body, wrapper.paramName, wrapper.sourceFile, patterns, errors, visitedWrapperDecls);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
// =============================================================================
|
|
371
|
-
// Internal — pattern extractors
|
|
372
|
-
// =============================================================================
|
|
373
|
-
/**
|
|
374
|
-
* Route an `<r>.<method>(...)` call to its concrete extractor. New
|
|
375
|
-
* r.* APIs → new case + new extractor + new pattern type in patterns.ts.
|
|
376
|
-
* The discriminated union forces consumers (Designer, AI patcher) to
|
|
377
|
-
* commit to the new kind via compile errors.
|
|
378
|
-
*
|
|
379
|
-
* Skeleton: every recognised method currently returns an UnknownPattern
|
|
380
|
-
* with the right method name. Extractors replace the cases with concrete
|
|
381
|
-
* implementations one at a time.
|
|
382
|
-
*/
|
|
383
|
-
function dispatchExtractor(methodName, call, sourceFile) {
|
|
384
|
-
switch (methodName) {
|
|
385
|
-
// Simplest static patterns
|
|
386
|
-
case "requires":
|
|
387
|
-
return extractRequires(call, sourceFile);
|
|
388
|
-
case "optionalRequires":
|
|
389
|
-
return extractOptionalRequires(call, sourceFile);
|
|
390
|
-
case "readsConfig":
|
|
391
|
-
return extractReadsConfig(call, sourceFile);
|
|
392
|
-
case "systemScope":
|
|
393
|
-
return extractSystemScope(call, sourceFile);
|
|
394
|
-
case "toggleable":
|
|
395
|
-
return extractToggleable(call, sourceFile);
|
|
396
|
-
case "describe":
|
|
397
|
-
return extractDescribe(call, sourceFile);
|
|
398
|
-
case "uiHints":
|
|
399
|
-
return extractUiHints(call, sourceFile);
|
|
400
|
-
case "adoptsBundledLists":
|
|
401
|
-
return extractAdoptsBundledLists(call, sourceFile);
|
|
402
|
-
// Object-literal-based static patterns
|
|
403
|
-
case "entity":
|
|
404
|
-
return extractEntity(call, sourceFile);
|
|
405
|
-
case "relation":
|
|
406
|
-
return extractRelation(call, sourceFile);
|
|
407
|
-
case "nav":
|
|
408
|
-
return extractNav(call, sourceFile);
|
|
409
|
-
case "workspace":
|
|
410
|
-
return extractWorkspace(call, sourceFile);
|
|
411
|
-
// Complex static patterns
|
|
412
|
-
case "config":
|
|
413
|
-
return extractConfig(call, sourceFile);
|
|
414
|
-
case "translations":
|
|
415
|
-
return extractTranslations(call, sourceFile);
|
|
416
|
-
case "metric":
|
|
417
|
-
return extractMetric(call, sourceFile);
|
|
418
|
-
case "secret":
|
|
419
|
-
return extractSecret(call, sourceFile);
|
|
420
|
-
case "secretNamespace":
|
|
421
|
-
return extractSecretNamespace(call, sourceFile);
|
|
422
|
-
case "claimKey":
|
|
423
|
-
return extractClaimKey(call, sourceFile);
|
|
424
|
-
case "referenceData":
|
|
425
|
-
return extractReferenceData(call, sourceFile);
|
|
426
|
-
case "useExtension":
|
|
427
|
-
return extractUseExtension(call, sourceFile);
|
|
428
|
-
// Mixed (header + body) patterns
|
|
429
|
-
case "hook":
|
|
430
|
-
return extractHook(call, sourceFile);
|
|
431
|
-
case "authClaims":
|
|
432
|
-
return extractAuthClaims(call, sourceFile);
|
|
433
|
-
case "writeHandler":
|
|
434
|
-
return extractWriteHandler(call, sourceFile);
|
|
435
|
-
case "queryHandler":
|
|
436
|
-
return extractQueryHandler(call, sourceFile);
|
|
437
|
-
case "streamHandler":
|
|
438
|
-
return extractStreamHandler(call, sourceFile);
|
|
439
|
-
case "job":
|
|
440
|
-
return extractJob(call, sourceFile);
|
|
441
|
-
case "httpRoute":
|
|
442
|
-
return extractHttpRoute(call, sourceFile);
|
|
443
|
-
case "defineEvent":
|
|
444
|
-
return extractDefineEvent(call, sourceFile);
|
|
445
|
-
case "notification":
|
|
446
|
-
return extractNotification(call, sourceFile);
|
|
447
|
-
case "projection":
|
|
448
|
-
return extractProjection(call, sourceFile);
|
|
449
|
-
case "multiStreamProjection":
|
|
450
|
-
return extractMultiStreamProjection(call, sourceFile);
|
|
451
|
-
case "screen":
|
|
452
|
-
return extractScreen(call, sourceFile);
|
|
453
|
-
// Opaque patterns
|
|
454
|
-
case "extendsRegistrar":
|
|
455
|
-
return extractExtendsRegistrar(call, sourceFile);
|
|
456
|
-
case "usesApi":
|
|
457
|
-
return extractUsesApi(call, sourceFile);
|
|
458
|
-
case "exposesApi":
|
|
459
|
-
return extractExposesApi(call, sourceFile);
|
|
460
|
-
case "storeTable":
|
|
461
|
-
return extractStoreTable(call, sourceFile);
|
|
462
|
-
case "bootCheck":
|
|
463
|
-
return extractBootCheck(call, sourceFile);
|
|
464
|
-
// Tree-Actions pattern
|
|
465
|
-
case "treeActions":
|
|
466
|
-
return extractTreeActions(call, sourceFile);
|
|
467
|
-
// Env-schema contract (opaque, Zod-expression argument)
|
|
468
|
-
case "envSchema":
|
|
469
|
-
return extractEnvSchema(call, sourceFile);
|
|
470
|
-
// Unknown method — UnknownPattern signal so Designer/AI surface it
|
|
471
|
-
// as "custom call" without losing the source location.
|
|
472
|
-
default:
|
|
473
|
-
return {
|
|
474
|
-
kind: "pattern",
|
|
475
|
-
pattern: makeUnknownPattern(methodName, call, sourceFile),
|
|
476
|
-
};
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
function makeUnknownPattern(methodName, call, sourceFile) {
|
|
480
|
-
return {
|
|
481
|
-
kind: "unknown",
|
|
482
|
-
methodName,
|
|
483
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
484
|
-
};
|
|
485
|
-
}
|