@cosmicdrift/kumiko-framework 0.388.0 → 0.390.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +12 -4
- package/README.md +1 -1
- package/agents/examples/apex-surface-auth.md +2 -3
- package/agents/examples/api-worker-split.md +9 -2
- package/agents/examples/auth-claims.md +1 -1
- package/agents/examples/cross-feature-events.md +12 -12
- package/agents/examples/crypto-shredding-hr.md +2 -2
- package/agents/examples/encrypted-tenant-config.md +1 -1
- package/agents/examples/error-contract.md +12 -7
- package/agents/examples/event-sourcing.md +29 -29
- package/agents/examples/files-post-processing.md +10 -8
- package/agents/examples/golden-path.md +13 -1
- package/agents/examples/inbound-mail-triage.md +1 -0
- package/agents/examples/lane-routing.md +2 -1
- package/agents/examples/legal-pages.md +2 -2
- package/agents/examples/lifecycle-hooks.md +55 -2
- package/agents/examples/list-table-options.md +466 -0
- package/agents/examples/managed-config.md +4 -4
- package/agents/examples/managed-pages.md +1 -1
- package/agents/examples/pdf-audit-export.md +4 -2
- package/agents/examples/relations.md +19 -4
- package/agents/examples/search.md +4 -4
- package/agents/examples/secrets-demo.md +9 -6
- package/agents/examples/state-machine.md +5 -4
- package/agents/examples/tenant-isolation.md +73 -1
- package/agents/examples/tenant-settings.md +1 -1
- package/agents/examples/user-data-rights.md +3 -6
- package/agents/examples/workflow-engine.md +53 -47
- package/agents/examples.md +5 -4
- package/agents/features.md +1 -1
- package/agents/widgets.md +1 -0
- package/dist/api/api-constants.d.ts +1 -0
- package/dist/api/api-constants.js +2 -0
- package/dist/api/auth-middleware.js +1 -1
- package/dist/api/auth-routes-invite.js +2 -1
- package/dist/api/auth-routes-shared.d.ts +2 -0
- package/dist/api/auth-routes-shared.js +5 -0
- package/dist/api/client-error-route.js +2 -3
- package/dist/api/entity-read-access.d.ts +4 -1
- package/dist/api/entity-read-access.js +14 -0
- package/dist/api/export/export-cells-reference.d.ts +9 -0
- package/dist/api/export/export-cells-reference.js +21 -0
- package/dist/api/export/export-cells.d.ts +11 -0
- package/dist/api/export/export-cells.js +136 -0
- package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
- package/dist/api/export/export-ciphertext-guard.js +27 -0
- package/dist/api/export/export-columns.d.ts +31 -0
- package/dist/api/export/export-columns.js +85 -0
- package/dist/api/export/export-errors.d.ts +4 -0
- package/dist/api/export/export-errors.js +14 -0
- package/dist/api/export/export-route.d.ts +4 -0
- package/dist/api/export/export-route.js +75 -0
- package/dist/api/export/export-rows.d.ts +13 -0
- package/dist/api/export/export-rows.js +62 -0
- package/dist/api/export/export-screen.d.ts +13 -0
- package/dist/api/export/export-screen.js +47 -0
- package/dist/api/export/export-xlsx-writer.d.ts +4 -0
- package/dist/api/export/export-xlsx-writer.js +21 -0
- package/dist/api/extra-route.d.ts +7 -1
- package/dist/api/index.d.ts +23 -27
- package/dist/api/index.js +13 -15
- package/dist/api/jwt.js +1 -1
- package/dist/api/observability-middleware.d.ts +1 -1
- package/dist/api/observability-middleware.js +2 -1
- package/dist/api/pii-leak-guard.d.ts +3 -0
- package/dist/api/pii-leak-guard.js +3 -2
- package/dist/api/request-context-internals.d.ts +31 -0
- package/dist/api/request-context-internals.js +11 -0
- package/dist/api/request-context-scopes.d.ts +14 -0
- package/dist/api/request-context-scopes.js +69 -0
- package/dist/api/request-context.d.ts +1 -40
- package/dist/api/request-context.js +22 -51
- package/dist/api/request-id-middleware.d.ts +1 -1
- package/dist/api/route-registrars.d.ts +2 -1
- package/dist/api/route-registrars.js +1 -1
- package/dist/api/routes.d.ts +16 -0
- package/dist/api/routes.js +9 -5
- package/dist/api/server-boot-checks.d.ts +1 -1
- package/dist/api/server-boot-checks.js +2 -2
- package/dist/api/server-event-dispatcher.d.ts +6 -1
- package/dist/api/server-event-dispatcher.js +3 -4
- package/dist/api/server-extra-routes.d.ts +1 -1
- package/dist/api/server-extra-routes.js +5 -1
- package/dist/api/server-middleware.js +3 -1
- package/dist/api/server-routes.d.ts +3 -2
- package/dist/api/server-routes.js +8 -2
- package/dist/api/server-wiring.js +8 -4
- package/dist/api/server.d.ts +2 -1
- package/dist/api/sse-route.d.ts +3 -1
- package/dist/api/sse-route.js +11 -1
- package/dist/api/tenant-scoped-secrets.d.ts +2 -0
- package/dist/api/tenant-scoped-secrets.js +13 -0
- package/dist/api/websocket-route.d.ts +1 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/roles.d.ts +0 -5
- package/dist/compliance/duration-spec.d.ts +0 -1
- package/dist/compliance/duration-spec.js +0 -5
- package/dist/compliance/index.d.ts +4 -4
- package/dist/compliance/index.js +2 -2
- package/dist/compliance/profiles.d.ts +0 -15
- package/dist/compliance/profiles.js +0 -23
- package/dist/config/index.d.ts +11 -9
- package/dist/config/index.js +13 -1
- package/dist/config/internals.d.ts +9 -0
- package/dist/config/internals.js +1 -0
- package/dist/consumer-cli-internals.d.ts +4 -0
- package/dist/consumer-cli-internals.js +1 -0
- package/dist/consumer-cli.d.ts +1 -4
- package/dist/consumer-cli.js +5 -1
- package/dist/crypto/event-pii.js +1 -1
- package/dist/crypto/index.d.ts +8 -9
- package/dist/crypto/index.js +7 -8
- package/dist/crypto/pg-kms-adapter.d.ts +1 -0
- package/dist/crypto/pg-kms-adapter.js +17 -18
- package/dist/db/aggregate-sql.d.ts +2 -0
- package/dist/db/aggregate-sql.js +10 -0
- package/dist/db/apply-entity-event.d.ts +1 -1
- package/dist/db/apply-entity-event.js +15 -47
- package/dist/db/blind-index-cleanup.js +91 -77
- package/dist/db/closed-connection.js +12 -19
- package/dist/db/collect-table-metas.js +1 -1
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +0 -7
- package/dist/db/config-seed.d.ts +2 -1
- package/dist/db/config-seed.js +6 -1
- package/dist/db/connection.d.ts +7 -6
- package/dist/db/connection.js +43 -24
- package/dist/db/cross-tenant-reads.d.ts +1 -1
- package/dist/db/cross-tenant-reads.js +1 -1
- package/dist/db/dialect.d.ts +0 -5
- package/dist/db/dialect.js +0 -3
- package/dist/db/driver-row-coercion.js +4 -4
- package/dist/db/driver-value-preparation.js +6 -4
- package/dist/db/eagerload.d.ts +2 -1
- package/dist/db/entity-field-encryption.d.ts +1 -1
- package/dist/db/entity-table-meta.d.ts +1 -1
- package/dist/db/event-store-executor-context.d.ts +3 -1
- package/dist/db/event-store-executor-context.js +4 -3
- package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
- package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
- package/dist/db/event-store-executor-read-aggregate.js +36 -5
- package/dist/db/event-store-executor-read-filter.d.ts +1 -1
- package/dist/db/event-store-executor-read-filter.js +6 -3
- package/dist/db/event-store-executor-read-rows.d.ts +2 -1
- package/dist/db/event-store-executor-read-search.d.ts +2 -1
- package/dist/db/event-store-executor-read-sort.d.ts +2 -1
- package/dist/db/event-store-executor-read.js +2 -2
- package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
- package/dist/db/event-store-executor-write-atomic.js +42 -0
- package/dist/db/event-store-executor-write-steps.d.ts +3 -5
- package/dist/db/event-store-executor-write-steps.js +0 -5
- package/dist/db/event-store-executor-write.js +22 -19
- package/dist/db/event-store-executor.d.ts +1 -1
- package/dist/db/event-store-executor.js +2 -1
- package/dist/db/executor-managed-tables.d.ts +7 -1
- package/dist/db/executor-managed-tables.js +12 -3
- package/dist/db/index.d.ts +29 -28
- package/dist/db/index.js +22 -20
- package/dist/db/known-table-names.d.ts +6 -0
- package/dist/db/known-table-names.js +21 -0
- package/dist/db/list-aggregate-labels.d.ts +1 -1
- package/dist/db/located-timestamp.d.ts +1 -1
- package/dist/db/located-timestamp.js +0 -5
- package/dist/db/migrate-generator.d.ts +17 -1
- package/dist/db/migrate-generator.js +50 -20
- package/dist/db/migrate-primary-key.d.ts +12 -0
- package/dist/db/migrate-primary-key.js +45 -0
- package/dist/db/migrate-rls-diff.d.ts +20 -0
- package/dist/db/migrate-rls-diff.js +61 -0
- package/dist/db/migrate-runner.js +7 -3
- package/dist/db/money.d.ts +1 -1
- package/dist/db/money.js +1 -1
- package/dist/db/parent-ref-clause.d.ts +2 -1
- package/dist/db/pg-error.d.ts +2 -0
- package/dist/db/pg-error.js +37 -21
- package/dist/db/queries/backfill-pii.js +3 -6
- package/dist/db/queries/database-now.js +2 -1
- package/dist/db/queries/ddl.d.ts +3 -0
- package/dist/db/queries/ddl.js +34 -1
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/event-tenants.d.ts +2 -0
- package/dist/db/queries/event-tenants.js +17 -0
- package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
- package/dist/db/queries/rebuild-rls-guard.js +29 -0
- package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
- package/dist/db/queries/rls-boot-catalog.js +39 -0
- package/dist/db/queries/rls-catalog.d.ts +6 -0
- package/dist/db/queries/rls-catalog.js +82 -0
- package/dist/db/queries/rls-scope.d.ts +3 -0
- package/dist/db/queries/rls-scope.js +17 -0
- package/dist/db/queries/rls-shape.d.ts +10 -0
- package/dist/db/queries/rls-shape.js +42 -0
- package/dist/db/queries/session-advisory-lock.d.ts +2 -0
- package/dist/db/queries/session-advisory-lock.js +23 -0
- package/dist/db/queries/shadow-swap.d.ts +1 -2
- package/dist/db/queries/shadow-swap.js +11 -28
- package/dist/db/queries/test-stack.d.ts +4 -1
- package/dist/db/queries/test-stack.js +83 -2
- package/dist/db/query.d.ts +14 -0
- package/dist/db/query.js +77 -48
- package/dist/db/reference-data.d.ts +1 -1
- package/dist/db/reference-data.js +20 -3
- package/dist/db/render-ddl.d.ts +6 -2
- package/dist/db/render-ddl.js +7 -7
- package/dist/db/render-rls-ddl.d.ts +35 -0
- package/dist/db/render-rls-ddl.js +127 -0
- package/dist/db/replay-migration-sql.d.ts +3 -1
- package/dist/db/replay-migration-sql.js +22 -5
- package/dist/db/replay-rls.d.ts +25 -0
- package/dist/db/replay-rls.js +156 -0
- package/dist/db/row-level-security-boot-check.d.ts +5 -0
- package/dist/db/row-level-security-boot-check.js +85 -0
- package/dist/db/row-level-security-connection.d.ts +3 -0
- package/dist/db/row-level-security-connection.js +213 -0
- package/dist/db/row-level-security-scope.d.ts +33 -0
- package/dist/db/row-level-security-scope.js +127 -0
- package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
- package/dist/db/scope-tenant-db-to-tenant.js +14 -0
- package/dist/db/sql-identifier.d.ts +1 -0
- package/dist/db/sql-identifier.js +3 -0
- package/dist/db/statement-timeout.js +2 -1
- package/dist/db/table-builder.d.ts +2 -1
- package/dist/db/table-builder.js +1 -1
- package/dist/db/table-info.js +1 -1
- package/dist/db/table-push.d.ts +11 -2
- package/dist/db/table-push.js +15 -2
- package/dist/db/tenant-db-runner.d.ts +3 -1
- package/dist/db/tenant-db-runner.js +4 -3
- package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
- package/dist/db/tenant-db-scoped-rebind.js +33 -0
- package/dist/db/tenant-db-statement-runner.d.ts +13 -0
- package/dist/db/tenant-db-statement-runner.js +48 -0
- package/dist/db/tenant-db-upsert.d.ts +5 -0
- package/dist/db/tenant-db-upsert.js +91 -0
- package/dist/db/tenant-db.d.ts +17 -12
- package/dist/db/tenant-db.js +60 -121
- package/dist/db/tenant-id-filter.d.ts +3 -0
- package/dist/db/tenant-id-filter.js +30 -0
- package/dist/db/transaction-serialization.d.ts +6 -0
- package/dist/db/transaction-serialization.js +60 -0
- package/dist/derivatives/delete-stored-file.js +1 -1
- package/dist/derivatives/index.d.ts +2 -5
- package/dist/derivatives/index.js +2 -3
- package/dist/engine/access.d.ts +2 -1
- package/dist/engine/access.js +1 -1
- package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
- package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
- package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
- package/dist/engine/boot-validator/entity-handler.js +1 -1
- package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
- package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
- package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
- package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
- package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
- package/dist/engine/boot-validator/list-column-layout.js +41 -0
- package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
- package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
- package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +11 -0
- package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
- package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
- package/dist/engine/boot-validator/list-table-export-options.js +27 -0
- package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
- package/dist/engine/boot-validator/list-table-options.js +77 -0
- package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
- package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
- package/dist/engine/boot-validator/nav.d.ts +3 -1
- package/dist/engine/boot-validator/nav.js +1 -1
- package/dist/engine/boot-validator/ownership.d.ts +2 -1
- package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
- package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
- package/dist/engine/boot-validator/projection-list-screens.js +3 -13
- package/dist/engine/boot-validator/query-refs.d.ts +2 -1
- package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
- package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
- package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
- package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
- package/dist/engine/boot-validator/screens-lists.js +12 -2
- package/dist/engine/boot-validator/screens.d.ts +2 -1
- package/dist/engine/boot-validator/workspaces.d.ts +3 -1
- package/dist/engine/bridge-stub.d.ts +5 -2
- package/dist/engine/bridge-stub.js +39 -24
- package/dist/engine/build-app-schema.d.ts +2 -1
- package/dist/engine/build-app-schema.js +9 -1
- package/dist/engine/build-config-feature-schema.js +6 -1
- package/dist/engine/config-helpers.d.ts +2 -2
- package/dist/engine/config-helpers.js +0 -9
- package/dist/engine/constants.d.ts +0 -10
- package/dist/engine/constants.js +0 -8
- package/dist/engine/create-app.js +1 -1
- package/dist/engine/define-feature.d.ts +2 -1
- package/dist/engine/define-feature.js +5 -2
- package/dist/engine/define-handler.d.ts +1 -1
- package/dist/engine/define-step.d.ts +0 -1
- package/dist/engine/define-step.js +0 -3
- package/dist/engine/embedded-derived.d.ts +1 -1
- package/dist/engine/entity-handlers.d.ts +2 -1
- package/dist/engine/entity-handlers.js +7 -7
- package/dist/engine/entity-list-runtime-options.js +3 -1
- package/dist/engine/entity-list-searchability.d.ts +2 -1
- package/dist/engine/event-def.d.ts +2 -1
- package/dist/engine/event-helpers.d.ts +3 -1
- package/dist/engine/event-helpers.js +3 -3
- package/dist/engine/extension-names.d.ts +2 -8
- package/dist/engine/extension-names.js +2 -2
- package/dist/engine/extension-selector-plugins.d.ts +1 -1
- package/dist/engine/extensions/storage-provider.d.ts +1 -2
- package/dist/engine/extensions/user-data.d.ts +0 -8
- package/dist/engine/factories.d.ts +2 -1
- package/dist/engine/feature-builder-state.d.ts +9 -1
- package/dist/engine/feature-builder-state.js +1 -0
- package/dist/engine/feature-changelog.d.ts +1 -1
- package/dist/engine/feature-config-events-jobs.d.ts +4 -1
- package/dist/engine/feature-entity-handlers.d.ts +5 -1
- package/dist/engine/feature-manifest.d.ts +1 -0
- package/dist/engine/feature-manifest.js +2 -1
- package/dist/engine/feature-ui-extensions.d.ts +7 -1
- package/dist/engine/feature-ui-extensions.js +6 -4
- package/dist/engine/field-access.d.ts +3 -1
- package/dist/engine/field-access.js +12 -0
- package/dist/engine/handler-field-references.d.ts +0 -4
- package/dist/engine/index.d.ts +58 -55
- package/dist/engine/index.js +23 -28
- package/dist/engine/instruction-fields.d.ts +1 -1
- package/dist/engine/personal-data-fields.d.ts +1 -1
- package/dist/engine/qualified-name.d.ts +0 -1
- package/dist/engine/read-claim.d.ts +2 -1
- package/dist/engine/registry-facade.js +0 -3
- package/dist/engine/registry-ingest.d.ts +2 -1
- package/dist/engine/registry-ingest.js +1 -2
- package/dist/engine/registry-state.d.ts +12 -2
- package/dist/engine/registry-state.js +2 -3
- package/dist/engine/registry-validate.d.ts +3 -1
- package/dist/engine/registry-validate.js +7 -7
- package/dist/engine/run-in.d.ts +1 -1
- package/dist/engine/run-in.js +0 -1
- package/dist/engine/schema-builder.d.ts +1 -1
- package/dist/engine/schema-builder.js +1 -1
- package/dist/engine/screen-filter-ops.d.ts +2 -1
- package/dist/engine/screen-filter-ops.js +2 -5
- package/dist/engine/soft-delete-cleanup.d.ts +1 -1
- package/dist/engine/soft-delete-cleanup.js +4 -4
- package/dist/engine/state-machine.js +2 -1
- package/dist/engine/steps/_read-source.js +1 -1
- package/dist/engine/steps/aggregate-append-event.js +2 -2
- package/dist/engine/steps/call-feature.js +2 -2
- package/dist/engine/steps/mail-send.js +1 -1
- package/dist/engine/steps/retry.js +1 -1
- package/dist/engine/steps/wait-for-event.js +1 -1
- package/dist/engine/steps/wait.js +1 -1
- package/dist/engine/steps/webhook-send.js +1 -1
- package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
- package/dist/engine/template-variables.d.ts +2 -1
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/feature.d.ts +1 -0
- package/dist/engine/types/index.d.ts +8 -30
- package/dist/engine/types/index.js +2 -10
- package/dist/engine/types/screen.d.ts +1 -1
- package/dist/engine/types/screen.js +1 -1
- package/dist/engine/validation.d.ts +2 -1
- package/dist/entrypoint/index.d.ts +9 -35
- package/dist/entrypoint/index.js +10 -1
- package/dist/entrypoint/internals.d.ts +40 -0
- package/dist/entrypoint/internals.js +1 -0
- package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
- package/dist/entrypoint/row-level-security-mode-check.js +19 -0
- package/dist/env/dry-run-internals.d.ts +10 -0
- package/dist/env/dry-run-internals.js +1 -0
- package/dist/env/dry-run.d.ts +1 -10
- package/dist/env/dry-run.js +2 -1
- package/dist/env/index.d.ts +1 -85
- package/dist/env/index.js +6 -50
- package/dist/env/internals.d.ts +87 -0
- package/dist/env/internals.js +53 -0
- package/dist/errors/classes.js +2 -2
- package/dist/errors/index.d.ts +5 -14
- package/dist/errors/index.js +4 -9
- package/dist/errors/member-resolution.js +1 -1
- package/dist/errors/reasons.d.ts +0 -1
- package/dist/errors/reasons.js +7 -7
- package/dist/errors/serialize.d.ts +0 -18
- package/dist/errors/serialize.js +0 -27
- package/dist/es-ops/index.d.ts +4 -4
- package/dist/es-ops/index.js +2 -2
- package/dist/es-ops/operations-schema.d.ts +1 -1
- package/dist/es-ops/types.d.ts +4 -5
- package/dist/event-store/admin-api-internals.d.ts +14 -0
- package/dist/event-store/admin-api-internals.js +1 -0
- package/dist/event-store/admin-api.d.ts +1 -14
- package/dist/event-store/admin-api.js +11 -6
- package/dist/event-store/archive.js +4 -2
- package/dist/event-store/errors.js +2 -2
- package/dist/event-store/event-store.d.ts +1 -0
- package/dist/event-store/event-store.js +42 -32
- package/dist/event-store/events-schema.js +4 -1
- package/dist/event-store/index.d.ts +11 -13
- package/dist/event-store/index.js +7 -9
- package/dist/event-store/provenance-append.js +1 -1
- package/dist/event-store/rebuild-dead-letter.js +4 -2
- package/dist/event-store/snapshot.js +4 -3
- package/dist/event-store/stream-scope.d.ts +2 -0
- package/dist/event-store/stream-scope.js +6 -0
- package/dist/event-store/upcaster-dead-letter.js +4 -2
- package/dist/event-store/upcaster.d.ts +2 -1
- package/dist/files/action-form-upload.d.ts +2 -1
- package/dist/files/action-form-upload.js +1 -1
- package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
- package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
- package/dist/files/bind-pending-file-refs.d.ts +2 -1
- package/dist/files/bind-pending-file-refs.js +2 -1
- package/dist/files/bind-referenced-files.write.js +1 -1
- package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
- package/dist/files/create-file-ref-from-bytes.js +6 -3
- package/dist/files/create-file-ref.d.ts +6 -2
- package/dist/files/create-file-ref.js +13 -4
- package/dist/files/dispose-removed-file-refs.d.ts +2 -1
- package/dist/files/dispose-removed-file-refs.js +1 -1
- package/dist/files/feature.js +2 -2
- package/dist/files/file-handle.js +1 -1
- package/dist/files/file-routes.d.ts +3 -1
- package/dist/files/file-routes.js +41 -4
- package/dist/files/index.d.ts +11 -13
- package/dist/files/index.js +5 -7
- package/dist/files/load-save-file-refs.d.ts +2 -1
- package/dist/files/load-save-file-refs.js +1 -1
- package/dist/files/provider-resolver.d.ts +6 -4
- package/dist/files/provider-resolver.js +5 -5
- package/dist/files/record-write-check.d.ts +6 -0
- package/dist/files/record-write-check.js +13 -0
- package/dist/files/storage-tracking.js +4 -2
- package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
- package/dist/files/sweep-orphaned-uploads.js +1 -1
- package/dist/files/upload-ledger.d.ts +2 -2
- package/dist/files/upload-ledger.js +4 -4
- package/dist/i18n/index.d.ts +2 -8
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/internals.d.ts +7 -0
- package/dist/i18n/internals.js +1 -0
- package/dist/i18n/required-surface-keys.d.ts +4 -1
- package/dist/i18n/required-surface-keys.js +7 -2
- package/dist/internal/row-level-security.d.ts +3 -0
- package/dist/internal/row-level-security.js +3 -0
- package/dist/internal/stack-support.d.ts +1 -1
- package/dist/internal/stack-support.js +1 -1
- package/dist/internal/testing.d.ts +1 -0
- package/dist/internal/testing.js +10 -6
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/job-append-event.d.ts +12 -0
- package/dist/jobs/job-append-event.js +30 -0
- package/dist/jobs/job-runner-context.d.ts +2 -2
- package/dist/jobs/job-runner-context.js +46 -16
- package/dist/jobs/job-runner-execution.d.ts +1 -1
- package/dist/jobs/job-runner-execution.js +6 -4
- package/dist/jobs/job-runner-gates.d.ts +1 -1
- package/dist/jobs/job-runner-gates.js +0 -1
- package/dist/jobs/job-runner-helpers.d.ts +11 -4
- package/dist/jobs/job-runner-helpers.js +10 -1
- package/dist/jobs/job-runner-scope.d.ts +5 -2
- package/dist/jobs/job-runner-scope.js +6 -6
- package/dist/jobs/job-runner-types.d.ts +2 -1
- package/dist/jobs/job-runner.js +22 -6
- package/dist/jobs/max-per-tenant.d.ts +1 -1
- package/dist/logging/index.d.ts +1 -2
- package/dist/logging/index.js +1 -1
- package/dist/logging/pino-logger.js +1 -1
- package/dist/logging/utils.d.ts +1 -0
- package/dist/logging/utils.js +6 -0
- package/dist/migrations/index.d.ts +3 -3
- package/dist/migrations/index.js +3 -3
- package/dist/migrations/pending-rebuilds.d.ts +1 -1
- package/dist/migrations/pending-rebuilds.js +1 -1
- package/dist/migrations/pii-event-backfill.js +4 -1
- package/dist/observability/escape-hatch-report.d.ts +2 -1
- package/dist/observability/escape-hatch-report.js +9 -2
- package/dist/observability/index.d.ts +7 -15
- package/dist/observability/index.js +4 -12
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.d.ts +0 -1
- package/dist/observability/metrics-handle.js +2 -15
- package/dist/observability/recording-tracer.d.ts +1 -2
- package/dist/observability/recording-tracer.js +0 -6
- package/dist/observability/sensitive-filter.d.ts +0 -2
- package/dist/observability/sensitive-filter.js +0 -29
- package/dist/pipeline/active-membership.d.ts +2 -1
- package/dist/pipeline/active-membership.js +6 -2
- package/dist/pipeline/after-rollback-sink.d.ts +6 -0
- package/dist/pipeline/after-rollback-sink.js +32 -0
- package/dist/pipeline/append-event-core.d.ts +2 -1
- package/dist/pipeline/append-event-core.js +2 -2
- package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
- package/dist/pipeline/attach-outside-transaction.js +13 -0
- package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
- package/dist/pipeline/cascade-handler.d.ts +2 -1
- package/dist/pipeline/cascade-handler.js +3 -2
- package/dist/pipeline/config-accessor-factory.d.ts +1 -1
- package/dist/pipeline/config-accessor-factory.js +1 -1
- package/dist/pipeline/context-services.d.ts +56 -0
- package/dist/pipeline/context-services.js +73 -0
- package/dist/pipeline/dispatch-batch.d.ts +2 -1
- package/dist/pipeline/dispatch-batch.js +39 -19
- package/dist/pipeline/dispatch-query.js +5 -4
- package/dist/pipeline/dispatch-scope.d.ts +6 -0
- package/dist/pipeline/dispatch-scope.js +27 -0
- package/dist/pipeline/dispatch-shared.d.ts +13 -9
- package/dist/pipeline/dispatch-shared.js +75 -194
- package/dist/pipeline/dispatch-stream.js +8 -4
- package/dist/pipeline/dispatch-write.d.ts +2 -1
- package/dist/pipeline/dispatch-write.js +10 -8
- package/dist/pipeline/dispatcher-utils.d.ts +3 -1
- package/dist/pipeline/dispatcher-utils.js +8 -2
- package/dist/pipeline/dispatcher.d.ts +3 -2
- package/dist/pipeline/dispatcher.js +4 -3
- package/dist/pipeline/event-consumer-state.d.ts +0 -1
- package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
- package/dist/pipeline/event-dispatcher-delivery.js +7 -3
- package/dist/pipeline/event-dispatcher.d.ts +3 -2
- package/dist/pipeline/event-dispatcher.js +13 -12
- package/dist/pipeline/event-retention.js +59 -56
- package/dist/pipeline/handler-access-error.js +2 -1
- package/dist/pipeline/handler-context-auth.d.ts +5 -6
- package/dist/pipeline/handler-context-auth.js +7 -4
- package/dist/pipeline/handler-context-config.d.ts +2 -5
- package/dist/pipeline/handler-context-config.js +2 -2
- package/dist/pipeline/handler-context-db.d.ts +32 -7
- package/dist/pipeline/handler-context-db.js +26 -17
- package/dist/pipeline/handler-context-dispatch.d.ts +14 -6
- package/dist/pipeline/handler-context-dispatch.js +18 -5
- package/dist/pipeline/handler-context-events.d.ts +22 -38
- package/dist/pipeline/handler-context-events.js +42 -35
- package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
- package/dist/pipeline/handler-context-member-resolution.js +110 -0
- package/dist/pipeline/handler-context-notify.d.ts +3 -2
- package/dist/pipeline/handler-context-notify.js +1 -1
- package/dist/pipeline/handler-context-observability.d.ts +2 -4
- package/dist/pipeline/handler-context-observability.js +7 -5
- package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
- package/dist/pipeline/handler-context-phase-denials.js +98 -0
- package/dist/pipeline/handler-context-scope.d.ts +7 -10
- package/dist/pipeline/handler-context-scope.js +18 -20
- package/dist/pipeline/index.d.ts +9 -21
- package/dist/pipeline/index.js +5 -7
- package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
- package/dist/pipeline/irreversible-operation-gate.js +2 -2
- package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
- package/dist/pipeline/lifecycle-pipeline.js +9 -15
- package/dist/pipeline/member-read-only-transaction.js +11 -3
- package/dist/pipeline/member-reader.d.ts +1 -1
- package/dist/pipeline/member-reader.js +2 -2
- package/dist/pipeline/msp-rebuild.js +5 -3
- package/dist/pipeline/multi-stream-apply-context.js +3 -2
- package/dist/pipeline/notify-scope.d.ts +2 -1
- package/dist/pipeline/pre-handler-gates.d.ts +2 -1
- package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
- package/dist/pipeline/pre-transaction-reservations.js +9 -7
- package/dist/pipeline/projection-rebuild.js +12 -5
- package/dist/pipeline/projection-state.d.ts +0 -6
- package/dist/pipeline/projection-state.js +0 -5
- package/dist/pipeline/projections-runner.d.ts +2 -1
- package/dist/pipeline/projections-runner.js +10 -6
- package/dist/pipeline/system-hooks.d.ts +6 -2
- package/dist/pipeline/system-hooks.js +61 -10
- package/dist/pipeline/system-identity-switch.d.ts +4 -2
- package/dist/pipeline/system-identity-switch.js +51 -36
- package/dist/pipeline/typed-append-event.d.ts +2 -0
- package/dist/pipeline/typed-append-event.js +4 -0
- package/dist/pipeline/write-origin.js +2 -2
- package/dist/pipeline/write-result-masking.d.ts +1 -1
- package/dist/pipeline/write-result-masking.js +13 -10
- package/dist/random/index.d.ts +1 -2
- package/dist/random/index.js +1 -2
- package/dist/rate-limit/bucket.d.ts +2 -1
- package/dist/rate-limit/middleware.js +2 -1
- package/dist/redis/index.d.ts +3 -4
- package/dist/redis/index.js +2 -2
- package/dist/schema-cli/apply-command.js +5 -2
- package/dist/schema-cli/baseline-command.js +7 -2
- package/dist/schema-cli/generate-command.js +7 -9
- package/dist/schema-cli/shared.d.ts +4 -0
- package/dist/schema-cli/shared.js +21 -2
- package/dist/schema-cli/status-command.js +8 -2
- package/dist/schema-cli/validate-command.js +52 -4
- package/dist/schema-cli.d.ts +0 -1
- package/dist/search/configure-tenant-index.d.ts +1 -3
- package/dist/search/configure-tenant-index.js +0 -4
- package/dist/search/index.d.ts +1 -4
- package/dist/search/index.js +0 -2
- package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
- package/dist/search/meilisearch-adapter-internals.js +9 -0
- package/dist/search/meilisearch-adapter.d.ts +1 -8
- package/dist/search/meilisearch-adapter.js +6 -7
- package/dist/search/meilisearch-peer.d.ts +2 -0
- package/dist/search/meilisearch-peer.js +5 -0
- package/dist/search/reindex-entity.js +107 -91
- package/dist/secrets/index.d.ts +3 -4
- package/dist/secrets/index.js +2 -3
- package/dist/seeding/index.d.ts +2 -2
- package/dist/seeding/index.js +1 -2
- package/dist/time/index.d.ts +2 -2
- package/dist/time/index.js +1 -1
- package/dist/time/tz-context.d.ts +0 -5
- package/dist/time/tz-context.js +0 -9
- package/dist/ui-types/index.d.ts +8 -11
- package/dist/ui-types/index.js +3 -3
- package/dist/upgrade-changelog.d.ts +3 -0
- package/dist/upgrade-changelog.js +18 -0
- package/dist/upgrade-cli-internals.d.ts +8 -0
- package/dist/upgrade-cli-internals.js +63 -0
- package/dist/upgrade-cli.d.ts +1 -18
- package/dist/upgrade-cli.js +29 -137
- package/dist/upgrade-marker-parse.d.ts +32 -0
- package/dist/upgrade-marker-parse.js +73 -0
- package/dist/utils/import-optional-peer.d.ts +6 -0
- package/dist/utils/import-optional-peer.js +19 -0
- package/dist/utils/index.d.ts +1 -4
- package/dist/utils/index.js +1 -4
- package/package.json +27 -20
- package/src/changes.json +451 -0
- package/dist/crypto/request-kms-cache.d.ts +0 -8
- package/dist/crypto/request-kms-cache.js +0 -21
- package/dist/engine/codemod/index.d.ts +0 -2
- package/dist/engine/codemod/index.js +0 -1
- package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
- package/dist/engine/codemod/pipeline-codemod.js +0 -536
- package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
- package/dist/engine/feature-ast/entity-field-types.js +0 -35
- package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
- package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
- package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
- package/dist/engine/feature-ast/extractors/events.js +0 -275
- package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/handlers.js +0 -358
- package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/hooks.js +0 -248
- package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
- package/dist/engine/feature-ast/extractors/index.js +0 -13
- package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
- package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
- package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
- package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
- package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
- package/dist/engine/feature-ast/extractors/round1.d.ts +0 -10
- package/dist/engine/feature-ast/extractors/round1.js +0 -81
- package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/round2.js +0 -191
- package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
- package/dist/engine/feature-ast/extractors/round3.js +0 -292
- package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
- package/dist/engine/feature-ast/extractors/round5.js +0 -68
- package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
- package/dist/engine/feature-ast/extractors/round6.js +0 -17
- package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
- package/dist/engine/feature-ast/extractors/shared.js +0 -343
- package/dist/engine/feature-ast/index.d.ts +0 -16
- package/dist/engine/feature-ast/index.js +0 -10
- package/dist/engine/feature-ast/parse.d.ts +0 -31
- package/dist/engine/feature-ast/parse.js +0 -483
- package/dist/engine/feature-ast/patch.d.ts +0 -210
- package/dist/engine/feature-ast/patch.js +0 -610
- package/dist/engine/feature-ast/patcher.d.ts +0 -217
- package/dist/engine/feature-ast/patcher.js +0 -281
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1476
- package/dist/engine/feature-ast/pattern-change-schema.js +0 -1226
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
- package/dist/engine/feature-ast/pattern-id-matchers.js +0 -210
- package/dist/engine/feature-ast/patterns.d.ts +0 -318
- package/dist/engine/feature-ast/patterns.js +0 -106
- package/dist/engine/feature-ast/render.d.ts +0 -47
- package/dist/engine/feature-ast/render.js +0 -662
- package/dist/engine/feature-ast/source-location.d.ts +0 -17
- package/dist/engine/feature-ast/source-location.js +0 -27
- package/dist/engine/pattern-library/index.d.ts +0 -2
- package/dist/engine/pattern-library/index.js +0 -3
- package/dist/engine/pattern-library/library.d.ts +0 -14
- package/dist/engine/pattern-library/library.js +0 -93
- package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
- package/dist/engine/pattern-library/mixed-schemas.js +0 -559
- package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
- package/dist/engine/pattern-library/opaque-schemas.js +0 -115
- package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
- package/dist/engine/pattern-library/shared-fields.js +0 -88
- package/dist/engine/pattern-library/static-schemas.d.ts +0 -20
- package/dist/engine/pattern-library/static-schemas.js +0 -478
- package/dist/engine/pattern-library/types.d.ts +0 -158
- package/dist/engine/pattern-library/types.js +0 -36
- package/dist/engine/provider-plugin-context.d.ts +0 -3
- package/dist/engine/provider-plugin-context.js +0 -28
- package/dist/engine/resolve-config-or-param.d.ts +0 -18
- package/dist/engine/resolve-config-or-param.js +0 -76
- package/src/scripts/codemod/README.md +0 -187
- package/src/scripts/codemod/codemod-support.ts +0 -334
- package/src/scripts/codemod/collect-source-files.ts +0 -48
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
- package/src/scripts/codemod/db-factory.ts +0 -810
- package/src/scripts/codemod/feature-factory.ts +0 -429
- package/src/scripts/codemod/feature-layout.ts +0 -424
- package/src/scripts/codemod/import-extensions.ts +0 -118
- package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
- package/src/scripts/codemod/migrate-db-raw.ts +0 -401
- package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
- package/src/scripts/codemod/object-form.ts +0 -746
- package/src/scripts/codemod/package-merge.ts +0 -299
- package/src/scripts/codemod/pii-personal-migration.ts +0 -816
- package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
- package/src/scripts/codemod/s3-imports.ts +0 -236
- package/src/scripts/codemod/tenant-db-options.ts +0 -454
- package/src/scripts/codemod/testing-injection.ts +0 -215
- package/src/scripts/codemod/testing-move-targets.ts +0 -161
- package/src/scripts/codemod/testing-move.ts +0 -542
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { SyntaxKind } from "ts-morph";
|
|
2
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
3
|
-
import { fail, findFunctionLiteral, isPlainObject, ok, readBooleanProperty, readDataLiteralNode, readNameLiteral, readPropertyKey, } from "./shared.js";
|
|
4
|
-
export function isHttpRouteMethod(value) {
|
|
5
|
-
return (value === "GET" ||
|
|
6
|
-
value === "POST" ||
|
|
7
|
-
value === "PUT" ||
|
|
8
|
-
value === "PATCH" ||
|
|
9
|
-
value === "DELETE" ||
|
|
10
|
-
value === "HEAD" ||
|
|
11
|
-
value === "OPTIONS");
|
|
12
|
-
}
|
|
13
|
-
export function extractJob(call, sourceFile) {
|
|
14
|
-
const args = call.getArguments();
|
|
15
|
-
const first = args[0];
|
|
16
|
-
if (!first) {
|
|
17
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "expected at least one argument");
|
|
18
|
-
}
|
|
19
|
-
const obj = first.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
20
|
-
if (obj && args.length === 1) {
|
|
21
|
-
const nameInit = obj
|
|
22
|
-
.getProperty("name")
|
|
23
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
24
|
-
?.getInitializer()
|
|
25
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
26
|
-
if (!nameInit) {
|
|
27
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `name` property");
|
|
28
|
-
}
|
|
29
|
-
const handlerInit = obj
|
|
30
|
-
.getProperty("handler")
|
|
31
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
32
|
-
?.getInitializer();
|
|
33
|
-
if (!handlerInit) {
|
|
34
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "object form requires a `handler` property");
|
|
35
|
-
}
|
|
36
|
-
const fn = findFunctionLiteral(handlerInit);
|
|
37
|
-
if (!fn) {
|
|
38
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "handler must be an inline arrow function or function expression");
|
|
39
|
-
}
|
|
40
|
-
const optionsBag = {};
|
|
41
|
-
for (const prop of obj.getProperties()) {
|
|
42
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
43
|
-
if (!propAssign)
|
|
44
|
-
continue;
|
|
45
|
-
const key = readPropertyKey(propAssign);
|
|
46
|
-
if (key === "name" || key === "handler")
|
|
47
|
-
continue;
|
|
48
|
-
const init = propAssign.getInitializer();
|
|
49
|
-
if (!init)
|
|
50
|
-
continue;
|
|
51
|
-
const value = readDataLiteralNode(init);
|
|
52
|
-
if (value === undefined) {
|
|
53
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), `option "${key}" could not be read as a plain value`);
|
|
54
|
-
}
|
|
55
|
-
optionsBag[key] = value;
|
|
56
|
-
}
|
|
57
|
-
return ok({
|
|
58
|
-
kind: "job",
|
|
59
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
60
|
-
jobName: nameInit.getLiteralValue(),
|
|
61
|
-
options: optionsBag,
|
|
62
|
-
handlerBody: sourceLocationFromNode(fn, sourceFile),
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
const jobName = readNameLiteral(first);
|
|
66
|
-
if (jobName === undefined) {
|
|
67
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "first argument must be a string literal job name, or an identifier resolving to one (or use the object form)");
|
|
68
|
-
}
|
|
69
|
-
const optionsArg = args[1];
|
|
70
|
-
if (!optionsArg) {
|
|
71
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "expected an options object as second argument");
|
|
72
|
-
}
|
|
73
|
-
const options = readDataLiteralNode(optionsArg);
|
|
74
|
-
if (!isPlainObject(options)) {
|
|
75
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "options could not be read as a plain object");
|
|
76
|
-
}
|
|
77
|
-
const handlerArg = args[2];
|
|
78
|
-
if (!handlerArg) {
|
|
79
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "expected a handler function as third argument");
|
|
80
|
-
}
|
|
81
|
-
const fn = findFunctionLiteral(handlerArg);
|
|
82
|
-
if (!fn) {
|
|
83
|
-
return fail("job", sourceLocationFromNode(call, sourceFile), "third argument must be an inline arrow function or function expression");
|
|
84
|
-
}
|
|
85
|
-
return ok({
|
|
86
|
-
kind: "job",
|
|
87
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
88
|
-
jobName,
|
|
89
|
-
options: options,
|
|
90
|
-
handlerBody: sourceLocationFromNode(fn, sourceFile),
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
export function extractHttpRoute(call, sourceFile) {
|
|
94
|
-
const arg = call.getArguments()[0]?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
95
|
-
if (!arg) {
|
|
96
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), "argument must be an inline HttpRouteDefinition object");
|
|
97
|
-
}
|
|
98
|
-
const methodLiteral = arg
|
|
99
|
-
.getProperty("method")
|
|
100
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
101
|
-
?.getInitializer()
|
|
102
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
103
|
-
if (!methodLiteral) {
|
|
104
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), "method must be a string literal");
|
|
105
|
-
}
|
|
106
|
-
const methodValue = methodLiteral.getLiteralValue();
|
|
107
|
-
if (!isHttpRouteMethod(methodValue)) {
|
|
108
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), `method must be one of GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS (got "${methodValue}")`);
|
|
109
|
-
}
|
|
110
|
-
const pathLiteral = arg
|
|
111
|
-
.getProperty("path")
|
|
112
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
113
|
-
?.getInitializer()
|
|
114
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
115
|
-
if (!pathLiteral) {
|
|
116
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), "path must be a string literal");
|
|
117
|
-
}
|
|
118
|
-
const handlerInit = arg
|
|
119
|
-
.getProperty("handler")
|
|
120
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
121
|
-
?.getInitializer();
|
|
122
|
-
if (!handlerInit) {
|
|
123
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), "missing `handler` property");
|
|
124
|
-
}
|
|
125
|
-
const fn = findFunctionLiteral(handlerInit);
|
|
126
|
-
if (!fn) {
|
|
127
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), "handler must be an inline arrow function or function expression");
|
|
128
|
-
}
|
|
129
|
-
// Missing `anonymous` reads as false (the safe side — mounted
|
|
130
|
-
// behind the session auth chain, not public) so a source file that predates
|
|
131
|
-
// the required field still parses instead of erroring here.
|
|
132
|
-
const anonymousValue = readBooleanProperty(arg, "anonymous");
|
|
133
|
-
if (anonymousValue === undefined && arg.getProperty("anonymous") !== undefined) {
|
|
134
|
-
return fail("httpRoute", sourceLocationFromNode(call, sourceFile), "anonymous must be a boolean literal — a non-literal value would be rewritten to a literal on round-trip");
|
|
135
|
-
}
|
|
136
|
-
const anonymous = anonymousValue === true;
|
|
137
|
-
return ok({
|
|
138
|
-
kind: "httpRoute",
|
|
139
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
140
|
-
method: methodValue,
|
|
141
|
-
path: pathLiteral.getLiteralValue(),
|
|
142
|
-
handlerBody: sourceLocationFromNode(fn, sourceFile),
|
|
143
|
-
anonymous,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, Node, SourceFile } from "ts-morph";
|
|
2
|
-
import type { MultiStreamProjectionPattern, ProjectionPattern, ScreenPattern } from "../patterns.ts";
|
|
3
|
-
import type { SourceLocation } from "../source-location.ts";
|
|
4
|
-
import { type ExtractOutput } from "./shared.ts";
|
|
5
|
-
export declare function readApplyBodies(defObj: ReturnType<Node["asKind"]>, sourceFile: SourceFile): Record<string, SourceLocation> | undefined;
|
|
6
|
-
export declare function extractProjection(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ProjectionPattern>;
|
|
7
|
-
export declare function extractMultiStreamProjection(call: CallExpression, sourceFile: SourceFile): ExtractOutput<MultiStreamProjectionPattern>;
|
|
8
|
-
export declare function collectScreenOpaqueProps(node: Node, path: string, sourceFile: SourceFile, out: Record<string, SourceLocation>): void;
|
|
9
|
-
export declare function readScreenStatic(node: Node): unknown;
|
|
10
|
-
export declare function extractScreen(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ScreenPattern>;
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { SyntaxKind } from "ts-morph";
|
|
2
|
-
import { SCREEN_OPAQUE_MARKER } from "../patterns.js";
|
|
3
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
4
|
-
import { fail, findFunctionLiteral, isPlainObject, isRawRefSentinel, ok, readDataLiteralNode, readNameOrRefOrList, readPropertyKey, } from "./shared.js";
|
|
5
|
-
export function readApplyBodies(defObj, sourceFile) {
|
|
6
|
-
if (!defObj)
|
|
7
|
-
return undefined;
|
|
8
|
-
const obj = defObj.asKind?.(SyntaxKind.ObjectLiteralExpression);
|
|
9
|
-
if (!obj)
|
|
10
|
-
return undefined;
|
|
11
|
-
const applyObj = obj
|
|
12
|
-
.getProperty("apply")
|
|
13
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
14
|
-
?.getInitializer()
|
|
15
|
-
?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
16
|
-
if (!applyObj)
|
|
17
|
-
return undefined;
|
|
18
|
-
const out = {};
|
|
19
|
-
for (const prop of applyObj.getProperties()) {
|
|
20
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
21
|
-
if (!propAssign)
|
|
22
|
-
return undefined;
|
|
23
|
-
const init = propAssign.getInitializer();
|
|
24
|
-
if (!init)
|
|
25
|
-
return undefined;
|
|
26
|
-
const fn = findFunctionLiteral(init);
|
|
27
|
-
if (!fn)
|
|
28
|
-
return undefined;
|
|
29
|
-
out[readPropertyKey(propAssign)] = sourceLocationFromNode(fn, sourceFile);
|
|
30
|
-
}
|
|
31
|
-
return out;
|
|
32
|
-
}
|
|
33
|
-
export function extractProjection(call, sourceFile) {
|
|
34
|
-
const arg = call.getArguments()[0]?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
35
|
-
if (!arg) {
|
|
36
|
-
return fail("projection", sourceLocationFromNode(call, sourceFile), "argument must be an inline ProjectionDefinition object");
|
|
37
|
-
}
|
|
38
|
-
const nameLit = arg
|
|
39
|
-
.getProperty("name")
|
|
40
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
41
|
-
?.getInitializer()
|
|
42
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
43
|
-
if (!nameLit) {
|
|
44
|
-
return fail("projection", sourceLocationFromNode(call, sourceFile), "name must be a string literal");
|
|
45
|
-
}
|
|
46
|
-
const sourceInit = arg
|
|
47
|
-
.getProperty("source")
|
|
48
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
49
|
-
?.getInitializer();
|
|
50
|
-
if (!sourceInit) {
|
|
51
|
-
return fail("projection", sourceLocationFromNode(call, sourceFile), "missing `source` property");
|
|
52
|
-
}
|
|
53
|
-
const sourceEntity = readNameOrRefOrList(sourceInit);
|
|
54
|
-
if (!sourceEntity) {
|
|
55
|
-
return fail("projection", sourceLocationFromNode(call, sourceFile), "source must be a string literal or array of string literals");
|
|
56
|
-
}
|
|
57
|
-
const applyBodies = readApplyBodies(arg, sourceFile);
|
|
58
|
-
if (!applyBodies) {
|
|
59
|
-
return fail("projection", sourceLocationFromNode(call, sourceFile), "apply must be an inline object map of event-type → function");
|
|
60
|
-
}
|
|
61
|
-
return ok({
|
|
62
|
-
kind: "projection",
|
|
63
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
64
|
-
name: nameLit.getLiteralValue(),
|
|
65
|
-
sourceEntity,
|
|
66
|
-
applyBodies,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
export function extractMultiStreamProjection(call, sourceFile) {
|
|
70
|
-
const arg = call.getArguments()[0]?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
71
|
-
if (!arg) {
|
|
72
|
-
return fail("multiStreamProjection", sourceLocationFromNode(call, sourceFile), "argument must be an inline MultiStreamProjectionDefinition object");
|
|
73
|
-
}
|
|
74
|
-
const nameLit = arg
|
|
75
|
-
.getProperty("name")
|
|
76
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
77
|
-
?.getInitializer()
|
|
78
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
79
|
-
if (!nameLit) {
|
|
80
|
-
return fail("multiStreamProjection", sourceLocationFromNode(call, sourceFile), "name must be a string literal");
|
|
81
|
-
}
|
|
82
|
-
const applyBodies = readApplyBodies(arg, sourceFile);
|
|
83
|
-
if (!applyBodies) {
|
|
84
|
-
return fail("multiStreamProjection", sourceLocationFromNode(call, sourceFile), "apply must be an inline object map of event-type → function");
|
|
85
|
-
}
|
|
86
|
-
const errorModeInit = arg
|
|
87
|
-
.getProperty("errorMode")
|
|
88
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
89
|
-
?.getInitializer();
|
|
90
|
-
const errorMode = errorModeInit ? readDataLiteralNode(errorModeInit) : undefined;
|
|
91
|
-
const runInLit = arg
|
|
92
|
-
.getProperty("runIn")
|
|
93
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
94
|
-
?.getInitializer()
|
|
95
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
96
|
-
const runIn = runInLit ? runInLit.getLiteralValue() : undefined;
|
|
97
|
-
const deliveryLit = arg
|
|
98
|
-
.getProperty("delivery")
|
|
99
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
100
|
-
?.getInitializer()
|
|
101
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
102
|
-
const delivery = deliveryLit
|
|
103
|
-
? deliveryLit.getLiteralValue()
|
|
104
|
-
: undefined;
|
|
105
|
-
return ok({
|
|
106
|
-
kind: "multiStreamProjection",
|
|
107
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
108
|
-
name: nameLit.getLiteralValue(),
|
|
109
|
-
applyBodies,
|
|
110
|
-
...(isPlainObject(errorMode) && { errorMode: errorMode }),
|
|
111
|
-
...(runIn !== undefined && { runIn }),
|
|
112
|
-
...(delivery !== undefined && { delivery }),
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
export function collectScreenOpaqueProps(node, path, sourceFile, out) {
|
|
116
|
-
const fn = findFunctionLiteral(node);
|
|
117
|
-
if (fn) {
|
|
118
|
-
out[path] = sourceLocationFromNode(fn, sourceFile);
|
|
119
|
-
}
|
|
120
|
-
else if (node.isKind(SyntaxKind.ObjectLiteralExpression)) {
|
|
121
|
-
for (const prop of node.getProperties()) {
|
|
122
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
123
|
-
if (!propAssign)
|
|
124
|
-
continue;
|
|
125
|
-
const init = propAssign.getInitializer();
|
|
126
|
-
if (!init)
|
|
127
|
-
continue;
|
|
128
|
-
const key = readPropertyKey(propAssign);
|
|
129
|
-
const childPath = path ? `${path}.${key}` : key;
|
|
130
|
-
collectScreenOpaqueProps(init, childPath, sourceFile, out);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
else if (node.isKind(SyntaxKind.ArrayLiteralExpression)) {
|
|
134
|
-
node.getElements().forEach((el, idx) => {
|
|
135
|
-
collectScreenOpaqueProps(el, `${path}.${idx}`, sourceFile, out);
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
export function readScreenStatic(node) {
|
|
140
|
-
if (findFunctionLiteral(node))
|
|
141
|
-
return SCREEN_OPAQUE_MARKER;
|
|
142
|
-
const obj = node.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
143
|
-
if (obj) {
|
|
144
|
-
const out = {};
|
|
145
|
-
for (const prop of obj.getProperties()) {
|
|
146
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
147
|
-
if (!propAssign)
|
|
148
|
-
continue;
|
|
149
|
-
const init = propAssign.getInitializer();
|
|
150
|
-
if (!init)
|
|
151
|
-
continue;
|
|
152
|
-
out[readPropertyKey(propAssign)] = readScreenStatic(init);
|
|
153
|
-
}
|
|
154
|
-
return out;
|
|
155
|
-
}
|
|
156
|
-
const arr = node.asKind(SyntaxKind.ArrayLiteralExpression);
|
|
157
|
-
if (arr) {
|
|
158
|
-
return arr.getElements().map(readScreenStatic);
|
|
159
|
-
}
|
|
160
|
-
const value = readDataLiteralNode(node);
|
|
161
|
-
if (value === undefined)
|
|
162
|
-
return SCREEN_OPAQUE_MARKER;
|
|
163
|
-
return value;
|
|
164
|
-
}
|
|
165
|
-
export function extractScreen(call, sourceFile) {
|
|
166
|
-
const arg = call.getArguments()[0];
|
|
167
|
-
if (!arg) {
|
|
168
|
-
return fail("screen", sourceLocationFromNode(call, sourceFile), "expected a ScreenDefinition object as first argument");
|
|
169
|
-
}
|
|
170
|
-
const obj = arg.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
171
|
-
if (!obj) {
|
|
172
|
-
const raw = readDataLiteralNode(arg);
|
|
173
|
-
if (!isRawRefSentinel(raw)) {
|
|
174
|
-
return fail("screen", sourceLocationFromNode(call, sourceFile), "argument must be an inline object literal");
|
|
175
|
-
}
|
|
176
|
-
return ok({
|
|
177
|
-
kind: "screen",
|
|
178
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
179
|
-
definition: raw,
|
|
180
|
-
opaqueProps: {},
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
const opaqueProps = {};
|
|
184
|
-
collectScreenOpaqueProps(obj, "", sourceFile, opaqueProps);
|
|
185
|
-
const definition = readScreenStatic(obj);
|
|
186
|
-
if (!isPlainObject(definition)) {
|
|
187
|
-
return fail("screen", sourceLocationFromNode(call, sourceFile), "definition could not be read structurally");
|
|
188
|
-
}
|
|
189
|
-
return ok({
|
|
190
|
-
kind: "screen",
|
|
191
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
192
|
-
definition: definition,
|
|
193
|
-
opaqueProps: opaqueProps,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { SourceFile, VariableDeclaration } from "ts-morph";
|
|
2
|
-
import { Node } from "ts-morph";
|
|
3
|
-
export declare function resolveModuleFile(fromFile: SourceFile, specifier: string, { allowDeclarationFiles }?: {
|
|
4
|
-
readonly allowDeclarationFiles?: boolean;
|
|
5
|
-
}): SourceFile | undefined;
|
|
6
|
-
export declare function findImportBindingForLocalName(sourceFile: SourceFile, localName: string): {
|
|
7
|
-
readonly moduleSpecifier: string;
|
|
8
|
-
readonly importedName: string;
|
|
9
|
-
} | undefined;
|
|
10
|
-
/**
|
|
11
|
-
* `visited` keys on `${filePath}#${name}`, not path alone — aliasing can
|
|
12
|
-
* legally re-export a different name from the same file — and doubles as
|
|
13
|
-
* the cycle guard; `depth` backstops pathological non-cyclic chains.
|
|
14
|
-
*/
|
|
15
|
-
export declare function resolveExportedVariable(file: SourceFile, exportedName: string, visited?: Set<string>, depth?: number): VariableDeclaration | undefined;
|
|
16
|
-
/**
|
|
17
|
-
* Any binding of the same name that is not a plain `const NAME = <init>`
|
|
18
|
-
* (parameter, destructuring, loop variable, catch variable) shadows and ends
|
|
19
|
-
* the search — it has no statically readable initializer.
|
|
20
|
-
*/
|
|
21
|
-
export declare function findScopedVariableDeclaration(identifier: Node, name: string): VariableDeclaration | undefined;
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { Node, SyntaxKind, ts } from "ts-morph";
|
|
2
|
-
const MODULE_RESOLUTION_OPTIONS = {
|
|
3
|
-
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
4
|
-
module: ts.ModuleKind.ESNext,
|
|
5
|
-
target: ts.ScriptTarget.ESNext,
|
|
6
|
-
};
|
|
7
|
-
const MAX_RESOLUTION_DEPTH = 24;
|
|
8
|
-
const DECLARATION_FILES_OK = { allowDeclarationFiles: true };
|
|
9
|
-
export function resolveModuleFile(fromFile, specifier, { allowDeclarationFiles = false } = {}) {
|
|
10
|
-
const project = fromFile.getProject();
|
|
11
|
-
// The project's own host, not ts.sys: it honours an in-memory file system
|
|
12
|
-
// (Designer) and exists outside Node.
|
|
13
|
-
const resolved = ts.resolveModuleName(specifier, fromFile.getFilePath(), MODULE_RESOLUTION_OPTIONS, project.getModuleResolutionHost());
|
|
14
|
-
const resolvedFileName = resolved.resolvedModule?.resolvedFileName;
|
|
15
|
-
if (!resolvedFileName)
|
|
16
|
-
return undefined;
|
|
17
|
-
// A declaration file has no initializers to read. Callers that only need
|
|
18
|
-
// `export declare const X: "literal"` types opt in (installed packages
|
|
19
|
-
// resolve to dist/*.d.ts through their publishConfig exports).
|
|
20
|
-
if (!allowDeclarationFiles && resolvedFileName.endsWith(".d.ts"))
|
|
21
|
-
return undefined;
|
|
22
|
-
return fromFile.getProject().addSourceFileAtPathIfExists(resolvedFileName);
|
|
23
|
-
}
|
|
24
|
-
export function findImportBindingForLocalName(sourceFile, localName) {
|
|
25
|
-
for (const importDecl of sourceFile.getImportDeclarations()) {
|
|
26
|
-
const named = importDecl
|
|
27
|
-
.getNamedImports()
|
|
28
|
-
.find((ni) => (ni.getAliasNode()?.getText() ?? ni.getName()) === localName);
|
|
29
|
-
if (!named)
|
|
30
|
-
continue;
|
|
31
|
-
return {
|
|
32
|
-
moduleSpecifier: importDecl.getModuleSpecifierValue(),
|
|
33
|
-
importedName: named.getName(),
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* `visited` keys on `${filePath}#${name}`, not path alone — aliasing can
|
|
40
|
-
* legally re-export a different name from the same file — and doubles as
|
|
41
|
-
* the cycle guard; `depth` backstops pathological non-cyclic chains.
|
|
42
|
-
*/
|
|
43
|
-
export function resolveExportedVariable(file, exportedName, visited = new Set(), depth = 0) {
|
|
44
|
-
if (depth > MAX_RESOLUTION_DEPTH)
|
|
45
|
-
return undefined;
|
|
46
|
-
const key = `${file.getFilePath()}#${exportedName}`;
|
|
47
|
-
if (visited.has(key))
|
|
48
|
-
return undefined;
|
|
49
|
-
visited.add(key);
|
|
50
|
-
const directDecl = file.getVariableDeclaration(exportedName);
|
|
51
|
-
if (directDecl?.getVariableStatement()?.hasExportKeyword())
|
|
52
|
-
return directDecl;
|
|
53
|
-
const namedExportMatch = resolveViaNamedExportSpecifier(file, exportedName, visited, depth);
|
|
54
|
-
if (namedExportMatch)
|
|
55
|
-
return namedExportMatch;
|
|
56
|
-
return resolveViaStarExport(file, exportedName, visited, depth);
|
|
57
|
-
}
|
|
58
|
-
function resolveViaNamedExportSpecifier(file, exportedName, visited, depth) {
|
|
59
|
-
for (const exportDecl of file.getExportDeclarations()) {
|
|
60
|
-
const specifier = exportDecl
|
|
61
|
-
.getNamedExports()
|
|
62
|
-
.find((spec) => (spec.getAliasNode()?.getText() ?? spec.getName()) === exportedName);
|
|
63
|
-
if (!specifier)
|
|
64
|
-
continue;
|
|
65
|
-
const originalName = specifier.getName();
|
|
66
|
-
if (!exportDecl.hasModuleSpecifier()) {
|
|
67
|
-
const resolved = resolveLocalExportBinding(file, originalName, visited, depth);
|
|
68
|
-
if (resolved)
|
|
69
|
-
return resolved;
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const moduleSpecifierValue = exportDecl.getModuleSpecifierValue();
|
|
73
|
-
if (!moduleSpecifierValue)
|
|
74
|
-
continue;
|
|
75
|
-
const target = resolveModuleFile(file, moduleSpecifierValue, DECLARATION_FILES_OK);
|
|
76
|
-
if (!target)
|
|
77
|
-
continue;
|
|
78
|
-
const resolved = resolveExportedVariable(target, originalName, visited, depth + 1);
|
|
79
|
-
if (resolved)
|
|
80
|
-
return resolved;
|
|
81
|
-
}
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
84
|
-
function resolveLocalExportBinding(file, originalName, visited, depth) {
|
|
85
|
-
const localDecl = file.getVariableDeclaration(originalName);
|
|
86
|
-
if (localDecl)
|
|
87
|
-
return localDecl;
|
|
88
|
-
const binding = findImportBindingForLocalName(file, originalName);
|
|
89
|
-
if (!binding)
|
|
90
|
-
return undefined;
|
|
91
|
-
const target = resolveModuleFile(file, binding.moduleSpecifier, DECLARATION_FILES_OK);
|
|
92
|
-
if (!target)
|
|
93
|
-
return undefined;
|
|
94
|
-
return resolveExportedVariable(target, binding.importedName, visited, depth + 1);
|
|
95
|
-
}
|
|
96
|
-
function resolveViaStarExport(file, exportedName, visited, depth) {
|
|
97
|
-
for (const exportDecl of file.getExportDeclarations()) {
|
|
98
|
-
if (!exportDecl.hasModuleSpecifier())
|
|
99
|
-
continue;
|
|
100
|
-
if (exportDecl.getNamedExports().length > 0)
|
|
101
|
-
continue;
|
|
102
|
-
if (exportDecl.getNamespaceExport())
|
|
103
|
-
continue; // `export * as ns from "./m"` is not a re-export target.
|
|
104
|
-
const moduleSpecifierValue = exportDecl.getModuleSpecifierValue();
|
|
105
|
-
if (!moduleSpecifierValue)
|
|
106
|
-
continue;
|
|
107
|
-
const target = resolveModuleFile(file, moduleSpecifierValue, DECLARATION_FILES_OK);
|
|
108
|
-
if (!target)
|
|
109
|
-
continue;
|
|
110
|
-
const resolved = resolveExportedVariable(target, exportedName, visited, depth + 1);
|
|
111
|
-
if (resolved)
|
|
112
|
-
return resolved;
|
|
113
|
-
}
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Any binding of the same name that is not a plain `const NAME = <init>`
|
|
118
|
-
* (parameter, destructuring, loop variable, catch variable) shadows and ends
|
|
119
|
-
* the search — it has no statically readable initializer.
|
|
120
|
-
*/
|
|
121
|
-
export function findScopedVariableDeclaration(identifier, name) {
|
|
122
|
-
for (const ancestor of [identifier, ...identifier.getAncestors()]) {
|
|
123
|
-
if (declaresShadowingBinding(ancestor, name))
|
|
124
|
-
return undefined;
|
|
125
|
-
const statements = getDirectStatements(ancestor);
|
|
126
|
-
if (!statements)
|
|
127
|
-
continue;
|
|
128
|
-
for (const stmt of statements) {
|
|
129
|
-
const varStmt = stmt.asKind(SyntaxKind.VariableStatement);
|
|
130
|
-
if (!varStmt)
|
|
131
|
-
continue;
|
|
132
|
-
for (const decl of varStmt.getDeclarationList().getDeclarations()) {
|
|
133
|
-
const nameNode = decl.getNameNode();
|
|
134
|
-
if (Node.isIdentifier(nameNode)) {
|
|
135
|
-
if (nameNode.getText() === name)
|
|
136
|
-
return decl;
|
|
137
|
-
}
|
|
138
|
-
else if (bindingNames(nameNode).includes(name)) {
|
|
139
|
-
return undefined;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
function bindingNames(nameNode) {
|
|
147
|
-
if (Node.isIdentifier(nameNode))
|
|
148
|
-
return [nameNode.getText()];
|
|
149
|
-
if (Node.isObjectBindingPattern(nameNode) || Node.isArrayBindingPattern(nameNode)) {
|
|
150
|
-
return nameNode
|
|
151
|
-
.getElements()
|
|
152
|
-
.flatMap((element) => Node.isBindingElement(element) ? bindingNames(element.getNameNode()) : []);
|
|
153
|
-
}
|
|
154
|
-
return [];
|
|
155
|
-
}
|
|
156
|
-
function declaresShadowingBinding(node, name) {
|
|
157
|
-
if (Node.isParametered(node)) {
|
|
158
|
-
return node.getParameters().some((p) => bindingNames(p.getNameNode()).includes(name));
|
|
159
|
-
}
|
|
160
|
-
if (Node.isForOfStatement(node) || Node.isForInStatement(node) || Node.isForStatement(node)) {
|
|
161
|
-
const initializer = node.getInitializer();
|
|
162
|
-
return (initializer !== undefined &&
|
|
163
|
-
Node.isVariableDeclarationList(initializer) &&
|
|
164
|
-
initializer.getDeclarations().some((decl) => bindingNames(decl.getNameNode()).includes(name)));
|
|
165
|
-
}
|
|
166
|
-
if (Node.isCatchClause(node)) {
|
|
167
|
-
const decl = node.getVariableDeclaration();
|
|
168
|
-
return decl !== undefined && bindingNames(decl.getNameNode()).includes(name);
|
|
169
|
-
}
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
function getDirectStatements(node) {
|
|
173
|
-
const block = node.asKind(SyntaxKind.Block);
|
|
174
|
-
if (block)
|
|
175
|
-
return block.getStatements();
|
|
176
|
-
const sourceFile = node.asKind(SyntaxKind.SourceFile);
|
|
177
|
-
if (sourceFile)
|
|
178
|
-
return sourceFile.getStatements();
|
|
179
|
-
return undefined;
|
|
180
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, SourceFile } from "ts-morph";
|
|
2
|
-
import type { DescribePattern, OptionalRequiresPattern, ReadsConfigPattern, RequiresPattern, SystemScopePattern, ToggleablePattern, UiHintsPattern } from "../patterns.ts";
|
|
3
|
-
import { type ExtractOutput } from "./shared.ts";
|
|
4
|
-
export declare function extractRequires(call: CallExpression, sourceFile: SourceFile): ExtractOutput<RequiresPattern>;
|
|
5
|
-
export declare function extractOptionalRequires(call: CallExpression, sourceFile: SourceFile): ExtractOutput<OptionalRequiresPattern>;
|
|
6
|
-
export declare function extractReadsConfig(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ReadsConfigPattern>;
|
|
7
|
-
export declare function extractSystemScope(call: CallExpression, sourceFile: SourceFile): ExtractOutput<SystemScopePattern>;
|
|
8
|
-
export declare function extractUiHints(call: CallExpression, sourceFile: SourceFile): ExtractOutput<UiHintsPattern>;
|
|
9
|
-
export declare function extractDescribe(call: CallExpression, sourceFile: SourceFile): ExtractOutput<DescribePattern>;
|
|
10
|
-
export declare function extractToggleable(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ToggleablePattern>;
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
2
|
-
import { fail, ok, readBooleanProperty, readStringLiteralArgs, readVarargsOrArrayProp, } from "./shared.js";
|
|
3
|
-
export function extractRequires(call, sourceFile) {
|
|
4
|
-
const names = readVarargsOrArrayProp(call, "features");
|
|
5
|
-
if (!names) {
|
|
6
|
-
return fail("requires", sourceLocationFromNode(call, sourceFile), "expected positional string literals or { features: string[] }");
|
|
7
|
-
}
|
|
8
|
-
return ok({
|
|
9
|
-
kind: "requires",
|
|
10
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
11
|
-
featureNames: names,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
export function extractOptionalRequires(call, sourceFile) {
|
|
15
|
-
const names = readVarargsOrArrayProp(call, "features");
|
|
16
|
-
if (!names) {
|
|
17
|
-
return fail("optionalRequires", sourceLocationFromNode(call, sourceFile), "expected positional string literals or { features: string[] }");
|
|
18
|
-
}
|
|
19
|
-
return ok({
|
|
20
|
-
kind: "optionalRequires",
|
|
21
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
22
|
-
featureNames: names,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
export function extractReadsConfig(call, sourceFile) {
|
|
26
|
-
const keys = readVarargsOrArrayProp(call, "keys");
|
|
27
|
-
if (!keys) {
|
|
28
|
-
return fail("readsConfig", sourceLocationFromNode(call, sourceFile), "expected positional string literals or { keys: string[] }");
|
|
29
|
-
}
|
|
30
|
-
return ok({
|
|
31
|
-
kind: "readsConfig",
|
|
32
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
33
|
-
qualifiedKeys: keys,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
export function extractSystemScope(call, sourceFile) {
|
|
37
|
-
return ok({
|
|
38
|
-
kind: "systemScope",
|
|
39
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
export function extractUiHints(call, sourceFile) {
|
|
43
|
-
return ok({
|
|
44
|
-
kind: "uiHints",
|
|
45
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
export function extractDescribe(call, sourceFile) {
|
|
49
|
-
const args = readStringLiteralArgs(call);
|
|
50
|
-
const text = args?.[0];
|
|
51
|
-
if (text === undefined || args?.length !== 1) {
|
|
52
|
-
return fail("describe", sourceLocationFromNode(call, sourceFile), "expected a single string literal");
|
|
53
|
-
}
|
|
54
|
-
// Mirrors the define-feature boot guard: whitespace-only describes throw
|
|
55
|
-
// at boot — the AST path must reject them too, and store the TRIMMED
|
|
56
|
-
// text so render output matches the runtime/manifest value.
|
|
57
|
-
const trimmed = text.trim();
|
|
58
|
-
if (trimmed.length === 0) {
|
|
59
|
-
return fail("describe", sourceLocationFromNode(call, sourceFile), "must be a non-empty string");
|
|
60
|
-
}
|
|
61
|
-
return ok({
|
|
62
|
-
kind: "describe",
|
|
63
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
64
|
-
text: trimmed,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
export function extractToggleable(call, sourceFile) {
|
|
68
|
-
const arg = call.getArguments()[0];
|
|
69
|
-
if (!arg) {
|
|
70
|
-
return fail("toggleable", sourceLocationFromNode(call, sourceFile), "expected an object argument with a `default` boolean");
|
|
71
|
-
}
|
|
72
|
-
const defaultValue = readBooleanProperty(arg, "default");
|
|
73
|
-
if (defaultValue === undefined) {
|
|
74
|
-
return fail("toggleable", sourceLocationFromNode(call, sourceFile), "argument must be `{ default: true | false }`");
|
|
75
|
-
}
|
|
76
|
-
return ok({
|
|
77
|
-
kind: "toggleable",
|
|
78
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
79
|
-
default: defaultValue,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, SourceFile } from "ts-morph";
|
|
2
|
-
import type { EntityPattern, NavPattern, RelationPattern, WorkspacePattern } from "../patterns.ts";
|
|
3
|
-
import { type ExtractOutput } from "./shared.ts";
|
|
4
|
-
export declare function extractEntity(call: CallExpression, sourceFile: SourceFile): ExtractOutput<EntityPattern>;
|
|
5
|
-
export declare function extractRelation(call: CallExpression, sourceFile: SourceFile): ExtractOutput<RelationPattern>;
|
|
6
|
-
export declare function extractNav(call: CallExpression, sourceFile: SourceFile): ExtractOutput<NavPattern>;
|
|
7
|
-
export declare function extractWorkspace(call: CallExpression, sourceFile: SourceFile): ExtractOutput<WorkspacePattern>;
|