@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,28 +0,0 @@
|
|
|
1
|
-
export function providerPluginContextFromHandler(ctx) {
|
|
2
|
-
return {
|
|
3
|
-
db: ctx.db,
|
|
4
|
-
dbOutsideTransaction: ctx.dbOutsideTransaction,
|
|
5
|
-
systemDb: ctx.systemDb,
|
|
6
|
-
registry: ctx.registry,
|
|
7
|
-
user: ctx.user,
|
|
8
|
-
log: ctx.log,
|
|
9
|
-
triggeredBy: ctx.triggeredBy,
|
|
10
|
-
config: ctx.config,
|
|
11
|
-
secrets: ctx.secrets,
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
// Jobs have no request user: the job's system user is the acting identity, and no
|
|
15
|
-
// outside-transaction handle exists because jobs never run inside the handler's tx.
|
|
16
|
-
export function providerPluginContextFromJob(ctx) {
|
|
17
|
-
return {
|
|
18
|
-
db: ctx.db,
|
|
19
|
-
dbOutsideTransaction: undefined,
|
|
20
|
-
systemDb: ctx.systemDb,
|
|
21
|
-
registry: ctx.registry,
|
|
22
|
-
user: ctx.systemUser,
|
|
23
|
-
log: ctx.log,
|
|
24
|
-
triggeredBy: ctx.triggeredBy,
|
|
25
|
-
config: ctx.config,
|
|
26
|
-
secrets: ctx.secrets,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ConfigAccessor, ConfigKeyHandle, ConfigKeyType, ConfigValue } from "./types/config.ts";
|
|
2
|
-
import type { Registry } from "./types/index.ts";
|
|
3
|
-
type ResolveCtx = {
|
|
4
|
-
readonly config: ConfigAccessor;
|
|
5
|
-
readonly registry: Registry;
|
|
6
|
-
};
|
|
7
|
-
export type ClampInfo = {
|
|
8
|
-
readonly key: string;
|
|
9
|
-
readonly original: number;
|
|
10
|
-
readonly clamped: number;
|
|
11
|
-
readonly min?: number;
|
|
12
|
-
readonly max?: number;
|
|
13
|
-
};
|
|
14
|
-
export type ResolveOptions = {
|
|
15
|
-
readonly onClamp?: (info: ClampInfo) => void;
|
|
16
|
-
};
|
|
17
|
-
export declare function resolveConfigOrParam<T extends ConfigKeyType>(ctx: ResolveCtx, handle: ConfigKeyHandle<T>, paramValue: unknown, options?: ResolveOptions): Promise<ConfigValue<T> | undefined>;
|
|
18
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export async function resolveConfigOrParam(ctx, handle, paramValue, options) {
|
|
2
|
-
if (paramValue === undefined || paramValue === null || paramValue === "") {
|
|
3
|
-
return ctx.config(handle);
|
|
4
|
-
}
|
|
5
|
-
const keyDef = ctx.registry.getConfigKey(handle.name);
|
|
6
|
-
// skip: key isn't in the registry — unlikely because the caller holds a
|
|
7
|
-
// typed handle, but defence-in-depth for hand-built handles.
|
|
8
|
-
if (!keyDef)
|
|
9
|
-
return ctx.config(handle);
|
|
10
|
-
// Explicit opt-in required. A config key without `allowPerRequest: true`
|
|
11
|
-
// on its declaration cannot be overridden via a query-param, even if the
|
|
12
|
-
// route-handler forwards one. This is a deny-by-default policy: without
|
|
13
|
-
// it, a future feature-dev could accidentally route a sensitive key
|
|
14
|
-
// (rate-limits, quotas) through a public query-param without noticing.
|
|
15
|
-
if (!keyDef.allowPerRequest) {
|
|
16
|
-
throw new Error(`resolveConfigOrParam: per-request override not enabled for config key "${handle.name}". Set allowPerRequest: true on the declaration to opt in — or drop the paramValue if the route-handler forwards it by mistake.`);
|
|
17
|
-
}
|
|
18
|
-
switch (keyDef.type) {
|
|
19
|
-
case "number": {
|
|
20
|
-
const parsed = typeof paramValue === "number" ? paramValue : Number(paramValue);
|
|
21
|
-
if (Number.isNaN(parsed) || !Number.isFinite(parsed)) {
|
|
22
|
-
return ctx.config(handle);
|
|
23
|
-
}
|
|
24
|
-
const clamped = clampToBounds(parsed, keyDef.bounds);
|
|
25
|
-
// Fire onClamp only when the value actually moved. No bounds + within
|
|
26
|
-
// bounds = silent; crossing a bound = audit event.
|
|
27
|
-
if (clamped !== parsed && options?.onClamp) {
|
|
28
|
-
const info = {
|
|
29
|
-
key: handle.name,
|
|
30
|
-
original: parsed,
|
|
31
|
-
clamped,
|
|
32
|
-
...(keyDef.bounds?.min !== undefined && { min: keyDef.bounds.min }),
|
|
33
|
-
...(keyDef.bounds?.max !== undefined && { max: keyDef.bounds.max }),
|
|
34
|
-
};
|
|
35
|
-
options.onClamp(info);
|
|
36
|
-
}
|
|
37
|
-
return clamped; // @cast-boundary engine-bridge
|
|
38
|
-
}
|
|
39
|
-
case "boolean": {
|
|
40
|
-
if (typeof paramValue === "boolean")
|
|
41
|
-
return paramValue; // @cast-boundary engine-bridge
|
|
42
|
-
const str = String(paramValue).toLowerCase();
|
|
43
|
-
return (str === "true" || str === "1"); // @cast-boundary engine-bridge
|
|
44
|
-
}
|
|
45
|
-
case "text": {
|
|
46
|
-
// Hard-reject any attempt to override a text key via query-param.
|
|
47
|
-
// See the module-level comment for why this is strict. App-devs
|
|
48
|
-
// that see this error should either (a) remove the paramValue from
|
|
49
|
-
// their route — the config value still flows through ctx.config —
|
|
50
|
-
// or (b) build their own sanitised parser outside this helper.
|
|
51
|
-
throw new Error(`resolveConfigOrParam: per-request override is not allowed for type="text" config key "${handle.name}" — query-params would bypass sanitisation. Remove the paramValue or build a feature-specific sanitiser.`);
|
|
52
|
-
}
|
|
53
|
-
case "select": {
|
|
54
|
-
const str = String(paramValue);
|
|
55
|
-
if (keyDef.options?.includes(str))
|
|
56
|
-
return str; // @cast-boundary engine-bridge
|
|
57
|
-
// Invalid option → fall back to the configured value rather than 400.
|
|
58
|
-
// The caller is signalling intent; we honour the constraint instead.
|
|
59
|
-
return ctx.config(handle);
|
|
60
|
-
}
|
|
61
|
-
default: {
|
|
62
|
-
const _exhaustive = keyDef.type;
|
|
63
|
-
throw new Error(`resolveConfigOrParam: unhandled config key type "${_exhaustive}"`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
function clampToBounds(value, bounds) {
|
|
68
|
-
if (!bounds)
|
|
69
|
-
return value;
|
|
70
|
-
let v = value;
|
|
71
|
-
if (bounds.min !== undefined && v < bounds.min)
|
|
72
|
-
v = bounds.min;
|
|
73
|
-
if (bounds.max !== undefined && v > bounds.max)
|
|
74
|
-
v = bounds.max;
|
|
75
|
-
return v;
|
|
76
|
-
}
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
# consumer-facing codemods
|
|
2
|
-
|
|
3
|
-
This directory holds the codemod scripts `kumiko upgrade --apply` runs for
|
|
4
|
-
consumers of `@cosmicdrift/kumiko-framework`. It ships as part of the
|
|
5
|
-
published package (under `src/`), unlike `scripts/codemod/` at the repo
|
|
6
|
-
root, which is internal bun-cutover tooling for this repo's own migration
|
|
7
|
-
and never gets published.
|
|
8
|
-
|
|
9
|
-
`crypto-shredding-testing-move.ts` rewrites the moved
|
|
10
|
-
`resetPiiSubjectKmsForTests` import path; it's wired into
|
|
11
|
-
`packages/bundled-features/src/crypto-shredding/changes.json`'s `codemod`
|
|
12
|
-
field and runs automatically via `kumiko upgrade --apply`.
|
|
13
|
-
|
|
14
|
-
## pii-personal-migration.ts
|
|
15
|
-
|
|
16
|
-
Migrates `create*Field(...)` calls from the old flag-based PII API (`pii`,
|
|
17
|
-
`userOwned`, `tenantOwned`, `subjectRef`, `allowPlaintext`, `lookupable`,
|
|
18
|
-
`searchable`, `sensitive`) to the author-facing `personal`/`find` API
|
|
19
|
-
(kumiko-framework#2250). Idempotent — safe to re-run against already
|
|
20
|
-
migrated code (no-ops on fields carrying `personal`).
|
|
21
|
-
|
|
22
|
-
`createTenantConfig`/`createUserConfig`/etc. are out of scope by
|
|
23
|
-
construction (name doesn't match `create*Field`).
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/pii-personal-migration.ts <targetDir> [--dry-run]
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Anything it can't map mechanically (two subject flags on one field,
|
|
30
|
-
`sensitive` + `lookupable`/`searchable` together, `piiEncrypted` on an
|
|
31
|
-
entity field, a raw object literal with subject flags outside a
|
|
32
|
-
`create*Field(...)` call) is reported with file:line instead of guessed
|
|
33
|
-
at — fix those by hand. The report also lists every field that newly
|
|
34
|
-
gains `lookupable` (searchable-only fields resolving to `find: "fuzzy"`)
|
|
35
|
-
— each of those needs a `_bidx` column migration, which this script does
|
|
36
|
-
not write.
|
|
37
|
-
|
|
38
|
-
## object-form.ts
|
|
39
|
-
|
|
40
|
-
Rewrites the positional registrar calls `r.writeHandler(name, schema, handler, options)`,
|
|
41
|
-
`r.queryHandler(…)`, `r.entity(name, definition, { table })`, `r.requires("a", "b")` and
|
|
42
|
-
`r.hook(type, target, fn, options?)` to their object form, and
|
|
43
|
-
`registerEntityCrud(r, name, entity, options?)` to `r.crud(name, entity, options?)`
|
|
44
|
-
(the now-unused import is removed). Idempotent — object-form calls are left alone.
|
|
45
|
-
|
|
46
|
-
A call is only touched when its receiver is provably a feature registrar: a parameter of
|
|
47
|
-
the `defineFeature(name, (r) => …)` callback, or a binding typed `FeatureRegistrar`.
|
|
48
|
-
Anything else (`sessions.requires("x")`, `foo.entity(…)`) stays untouched. A call on an
|
|
49
|
-
untyped `r`/`registrar` it cannot resolve, a spread argument, too few arguments or
|
|
50
|
-
`entity` options other than `{ table }` are reported as `manual` instead of guessed at.
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/object-form.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
Runs automatically via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then
|
|
57
|
-
formats the changed files with the Biome binary found in `node_modules/.bin` (`--no-format`
|
|
58
|
-
skips that). `--dry-run` only reports; `--check` reports and exits 1 while any rewritable
|
|
59
|
-
or manual site is left.
|
|
60
|
-
|
|
61
|
-
## db-factory.ts
|
|
62
|
-
|
|
63
|
-
Moves consumers to the single DB connection factory and the relocated query helpers.
|
|
64
|
-
`@cosmicdrift/kumiko-framework/bun-db` imports (including `import type`, `export … from` and
|
|
65
|
-
`import("…")` types) are repointed to `@cosmicdrift/kumiko-framework/db`, merged into an existing
|
|
66
|
-
`/db` import of the same kind. `createDbConnection(url, options)` becomes
|
|
67
|
-
`createDbConnection({ url, ...options })`; `createConnection`/`createPgConnection` from the
|
|
68
|
-
framework become `createDbConnection` in the object form, and the now-pointless `await` is dropped.
|
|
69
|
-
Idempotent. Local functions named `createConnection` are left alone.
|
|
70
|
-
|
|
71
|
-
Reported as `manual` instead of guessed at: imports of `createBunDbConnection`,
|
|
72
|
-
`bunDbConnectionOptionsFromEnv`, `BunDbConnection`, `BunDbTx`, `BunDbRunner`,
|
|
73
|
-
`BunDbConnectionOptions` and `DbPoolHandle` (removed without replacement), uses of `DB_PROVIDER`,
|
|
74
|
-
and `createConnection` results that are not awaited directly.
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/db-factory.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Runs automatically via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then formats the
|
|
81
|
-
changed files with Biome. `--check` exits 1 while any rewritable or manual site is left.
|
|
82
|
-
|
|
83
|
-
## tenant-db-options.ts
|
|
84
|
-
|
|
85
|
-
Moves `createTenantDb(db, tenantId, mode, tracer, meter, signal, grants)` to the options object
|
|
86
|
-
`createTenantDb({ db, tenantId, mode, tracer, meter, signal, grants })`. A call is only touched when
|
|
87
|
-
the callee resolves (import, aliased import, namespace import or `await import(…)` destructuring) to
|
|
88
|
-
the framework export; a local function with the same name is left alone. Arguments that are the
|
|
89
|
-
identifier of the same name become shorthand, literal `undefined` arguments after `tenantId` are
|
|
90
|
-
dropped, an explicit `mode` is kept, comments between the arguments are preserved. Idempotent —
|
|
91
|
-
calls already passing one object literal are left alone.
|
|
92
|
-
|
|
93
|
-
Reported as `manual` instead of guessed at: spread arguments, more than seven arguments, a single
|
|
94
|
-
argument that is not an object literal, and `createTenantDb` used as a value (callback, assignment,
|
|
95
|
-
`.bind`/`.call`/`.apply`).
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/tenant-db-options.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Runs automatically via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then formats the
|
|
102
|
-
changed files with Biome. `--check` exits 1 while any rewritable or manual site is left.
|
|
103
|
-
|
|
104
|
-
## import-extensions
|
|
105
|
-
|
|
106
|
-
Relative imports name the TypeScript source file: `./foo.js` becomes `./foo.ts`, `./Comp.jsx`
|
|
107
|
-
becomes `./Comp.tsx`. Covers `import`, `export ... from`, `import type`, `import()` and
|
|
108
|
-
`mock.module`. A specifier is rewritten only when the target exists with the new extension next to
|
|
109
|
-
the importer; otherwise it is reported as `manual` and left alone.
|
|
110
|
-
|
|
111
|
-
The tsconfig that compiles the code needs `allowImportingTsExtensions` and
|
|
112
|
-
`rewriteRelativeImportExtensions` (TypeScript 5.7 or newer) first.
|
|
113
|
-
|
|
114
|
-
```bash
|
|
115
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/import-extensions.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
Runs via `bun kumiko-upgrade --apply`. Without a mode flag it writes. `--check` exits 1 while any
|
|
119
|
-
rewritable or manual site is left. The `import-extensions` guard (`kumiko check guards`) reports
|
|
120
|
-
sites that are still on `.js`.
|
|
121
|
-
|
|
122
|
-
## remove-engine-payload-casts.ts
|
|
123
|
-
|
|
124
|
-
`executor.detail()` and `executor.list()` from `createEntityExecutor` / `createEventStoreExecutor`
|
|
125
|
-
return the entity's own row type (`EntityRow<E>`), so `row["f"] as T`, `row as T` and
|
|
126
|
-
`(await executor.detail(…)) as unknown as T` are usually redundant. The codemod removes such a cast,
|
|
127
|
-
and its `@cast-boundary` marker comment when no other cast stays in the statement, only when the
|
|
128
|
-
operand derives from an executor read (directly, through `rows[0]`, property access, `??` or a
|
|
129
|
-
single-assignment variable) and the type checker says its type is assignable to the cast target. A
|
|
130
|
-
file is left untouched if removing the casts would add type errors to it.
|
|
131
|
-
|
|
132
|
-
It type-checks against the tsconfig at or above each file, so run it with the new framework version
|
|
133
|
-
installed. Reported as `manual` and left alone: casts the row type does not satisfy (for example a
|
|
134
|
-
nullable column cast to a non-null type, or `rows[0]` under `noUncheckedIndexedAccess`), and files
|
|
135
|
-
without a tsconfig. A call site that still needs a narrower type than the row gives keeps its cast.
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/remove-engine-payload-casts.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Runs via `bun kumiko-upgrade --apply`. Without a mode flag it writes, then formats the changed files
|
|
142
|
-
with Biome. `--check` exits 1 while any rewritable or manual site is left.
|
|
143
|
-
|
|
144
|
-
## package-merge.ts
|
|
145
|
-
|
|
146
|
-
Packages folded into another package stay as re-export shims for one wave. The codemod rewrites
|
|
147
|
-
imports, re-exports, `import("…")` and `mock.module` specifiers (including subpaths) of the old
|
|
148
|
-
package to the new one, and in `package.json` replaces the old dependency with the target package
|
|
149
|
-
(same version range, same block, skipped when the block already lists it). The moves are the rows
|
|
150
|
-
of `PACKAGE_MERGE_MAPPINGS`: `@cosmicdrift/kumiko-http` to `@cosmicdrift/kumiko-framework/http`,
|
|
151
|
-
`@cosmicdrift/kumiko-repo-manifest` to `@cosmicdrift/kumiko-guards/repo-manifest`,
|
|
152
|
-
`@cosmicdrift/kumiko-headless` to `@cosmicdrift/kumiko-renderer/headless` (subpaths keep their name),
|
|
153
|
-
`@cosmicdrift/kumiko-dispatcher-live` to `@cosmicdrift/kumiko-renderer/live`,
|
|
154
|
-
`@cosmicdrift/kumiko-renderer-web` to `@cosmicdrift/kumiko-renderer/web` (so
|
|
155
|
-
`@import "@cosmicdrift/kumiko-renderer-web/styles.css"` becomes
|
|
156
|
-
`@import "@cosmicdrift/kumiko-renderer/web/styles.css"`).
|
|
157
|
-
|
|
158
|
-
`.css` files are covered too: the specifier of `@import`, `@plugin` and `@config` is rewritten like
|
|
159
|
-
an import. A `@source` path into `node_modules/<old package>/…` has no mechanical target and is
|
|
160
|
-
reported as manual.
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/package-merge.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
Runs via `bun kumiko-upgrade --apply`. Without a mode flag it writes. `--check` exits 1 while any
|
|
167
|
-
site is left. Run your package manager's install afterwards to refresh the lockfile.
|
|
168
|
-
|
|
169
|
-
## feature-layout.ts
|
|
170
|
-
|
|
171
|
-
Applies the feature layout rule "the runtime of a file follows from its path": everything
|
|
172
|
-
under `src/features/<feature>/web/` is client code, the rest of the feature is server or
|
|
173
|
-
isomorphic. Every file that carries a runtime-client marker outside `web/` moves to
|
|
174
|
-
`<feature>/web/` (sub-structure kept), the relative imports, re-exports, `import()` calls and
|
|
175
|
-
`mock.module` strings that point at it or out of it are rewritten, `package.json` export
|
|
176
|
-
targets follow, and the marker is dropped. A marker the path already implies (client in
|
|
177
|
-
`web/`, test in `__tests__/`) is only removed. Idempotent.
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
bun node_modules/@cosmicdrift/kumiko-framework/src/scripts/codemod/feature-layout.ts <dir> [--check | --dry-run | --write] [--no-format]
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
Features are found as `src/features/<feature>/` and `bundled-features/src/<feature>/` below
|
|
184
|
-
`<dir>`; `--feature-dir <dir>` names a directory that is itself one feature and
|
|
185
|
-
`--features-root <dir>` one whose children are features. A target that already exists in
|
|
186
|
-
`web/` and a marker no path rule covers (for example `dev` outside `dev/`) are reported as
|
|
187
|
-
`manual` and left alone. `--check` exits 1 while anything is left.
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { dirname, join, relative, resolve } from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
type ImportDeclaration,
|
|
5
|
-
type ImportSpecifier,
|
|
6
|
-
Node,
|
|
7
|
-
type SourceFile,
|
|
8
|
-
SyntaxKind,
|
|
9
|
-
} from "ts-morph";
|
|
10
|
-
import { collectSourceFiles } from "./collect-source-files.ts";
|
|
11
|
-
|
|
12
|
-
export interface CodemodSite {
|
|
13
|
-
readonly file: string;
|
|
14
|
-
readonly line: number;
|
|
15
|
-
readonly description: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface CodemodResult {
|
|
19
|
-
readonly output: string;
|
|
20
|
-
readonly rewrites: CodemodSite[];
|
|
21
|
-
readonly manual: CodemodSite[];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type SiteLists = { rewrites: CodemodSite[]; manual: CodemodSite[] };
|
|
25
|
-
|
|
26
|
-
export const SCRIPT_EXTENSION = /\.(js|ts|tsx)$/;
|
|
27
|
-
|
|
28
|
-
// A relative specifier below `<root><marker>...` is a module of that package's own source tree.
|
|
29
|
-
export function sourceRelativeModule(
|
|
30
|
-
specifier: string,
|
|
31
|
-
filePath: string,
|
|
32
|
-
sourceMarker: string,
|
|
33
|
-
): { readonly root: string; readonly module: string; readonly extension: string } | undefined {
|
|
34
|
-
if (!specifier.startsWith(".")) return undefined;
|
|
35
|
-
const resolved = resolve(dirname(filePath), specifier);
|
|
36
|
-
const extension = SCRIPT_EXTENSION.exec(resolved)?.[0] ?? "";
|
|
37
|
-
const stripped = resolved.slice(0, resolved.length - extension.length);
|
|
38
|
-
const markerIndex = stripped.lastIndexOf(sourceMarker);
|
|
39
|
-
if (markerIndex === -1) return undefined;
|
|
40
|
-
return {
|
|
41
|
-
root: stripped.slice(0, markerIndex + sourceMarker.length),
|
|
42
|
-
module: stripped.slice(markerIndex + sourceMarker.length),
|
|
43
|
-
extension,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function relativeSpecifier(
|
|
48
|
-
fromFile: string,
|
|
49
|
-
root: string,
|
|
50
|
-
module: string,
|
|
51
|
-
extension: string,
|
|
52
|
-
): string {
|
|
53
|
-
const path = relative(dirname(fromFile), join(root, module)).split("\\").join("/");
|
|
54
|
-
return `${path.startsWith(".") ? path : `./${path}`}${extension}`;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function stringLiteralOf(node: Node | undefined): Node | undefined {
|
|
58
|
-
return node !== undefined && Node.isStringLiteral(node) ? node : undefined;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface TextEdit {
|
|
62
|
-
readonly start: number;
|
|
63
|
-
readonly end: number;
|
|
64
|
-
readonly text: string;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function applyEdits(source: string, edits: readonly TextEdit[]): string {
|
|
68
|
-
let output = source;
|
|
69
|
-
for (const edit of [...edits].sort((x, y) => y.start - x.start)) {
|
|
70
|
-
output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
|
|
71
|
-
}
|
|
72
|
-
return output;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function moduleSpecifierLiterals(sourceFile: SourceFile): Node[] {
|
|
76
|
-
const literals: Node[] = [];
|
|
77
|
-
for (const declaration of [
|
|
78
|
-
...sourceFile.getImportDeclarations(),
|
|
79
|
-
...sourceFile.getExportDeclarations(),
|
|
80
|
-
]) {
|
|
81
|
-
const literal = declaration.getModuleSpecifier();
|
|
82
|
-
if (literal !== undefined) literals.push(literal);
|
|
83
|
-
}
|
|
84
|
-
for (const importType of sourceFile.getDescendantsOfKind(SyntaxKind.ImportType)) {
|
|
85
|
-
const argument = importType.getArgument();
|
|
86
|
-
if (Node.isLiteralTypeNode(argument)) literals.push(argument.getLiteral());
|
|
87
|
-
}
|
|
88
|
-
for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
89
|
-
const callee = call.getExpression();
|
|
90
|
-
const isModuleLoad =
|
|
91
|
-
callee.getKind() === SyntaxKind.ImportKeyword || callee.getText() === "mock.module";
|
|
92
|
-
const literal = stringLiteralOf(call.getArguments()[0]);
|
|
93
|
-
if (isModuleLoad && literal !== undefined) literals.push(literal);
|
|
94
|
-
}
|
|
95
|
-
return literals;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export function isPlainNamedImport(declaration: Node): boolean {
|
|
99
|
-
return (
|
|
100
|
-
Node.isImportDeclaration(declaration) &&
|
|
101
|
-
declaration.getNamespaceImport() === undefined &&
|
|
102
|
-
declaration.getDefaultImport() === undefined
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function hasImportBinding(sourceFile: SourceFile, localName: string): boolean {
|
|
107
|
-
return sourceFile
|
|
108
|
-
.getImportDeclarations()
|
|
109
|
-
.some(
|
|
110
|
-
(declaration) =>
|
|
111
|
-
declaration.getDefaultImport()?.getText() === localName ||
|
|
112
|
-
declaration.getNamespaceImport()?.getText() === localName ||
|
|
113
|
-
declaration
|
|
114
|
-
.getNamedImports()
|
|
115
|
-
.some((named) => (named.getAliasNode()?.getText() ?? named.getName()) === localName),
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// remove() would drop leading comments with the declaration (e.g. a file-level lint marker that
|
|
120
|
-
// has to stay attached to the next statement), so only the declaration's own line goes.
|
|
121
|
-
function removeDeclarationLine(
|
|
122
|
-
sourceFile: SourceFile,
|
|
123
|
-
declaration: { getStart(): number; getEnd(): number },
|
|
124
|
-
): void {
|
|
125
|
-
const text = sourceFile.getFullText();
|
|
126
|
-
const end = declaration.getEnd();
|
|
127
|
-
const lineEnd = text[end] === "\n" ? end + 1 : end;
|
|
128
|
-
sourceFile.replaceWithText(text.slice(0, declaration.getStart()) + text.slice(lineEnd));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function removeNamedImport(
|
|
132
|
-
sourceFile: SourceFile,
|
|
133
|
-
declaration: ImportDeclaration,
|
|
134
|
-
named: ImportSpecifier,
|
|
135
|
-
): void {
|
|
136
|
-
if (declaration.getNamedImports().length > 1) {
|
|
137
|
-
named.remove();
|
|
138
|
-
} else {
|
|
139
|
-
removeDeclarationLine(sourceFile, declaration);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export function ensureNamedImport(
|
|
144
|
-
sourceFile: SourceFile,
|
|
145
|
-
specifier: string,
|
|
146
|
-
name: string,
|
|
147
|
-
isTypeOnly: boolean,
|
|
148
|
-
): void {
|
|
149
|
-
const declarations = sourceFile.getImportDeclarations();
|
|
150
|
-
const target = declarations.find(
|
|
151
|
-
(declaration) =>
|
|
152
|
-
declaration.getModuleSpecifierValue() === specifier &&
|
|
153
|
-
declaration.isTypeOnly() === isTypeOnly &&
|
|
154
|
-
isPlainNamedImport(declaration) &&
|
|
155
|
-
declaration.getNamedImports().length > 0,
|
|
156
|
-
);
|
|
157
|
-
if (target === undefined) {
|
|
158
|
-
sourceFile.insertImportDeclaration(declarations.length, {
|
|
159
|
-
moduleSpecifier: specifier,
|
|
160
|
-
namedImports: [name],
|
|
161
|
-
isTypeOnly,
|
|
162
|
-
});
|
|
163
|
-
} else if (
|
|
164
|
-
!target.getNamedImports().some((named) => named.getName() === name && !named.getAliasNode())
|
|
165
|
-
) {
|
|
166
|
-
target.addNamedImport(name);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function findBiomeBinary(startDir: string): string | undefined {
|
|
171
|
-
let dir = resolve(startDir);
|
|
172
|
-
for (;;) {
|
|
173
|
-
const candidate = join(dir, "node_modules", ".bin", "biome");
|
|
174
|
-
if (existsSync(candidate)) return candidate;
|
|
175
|
-
const parent = dirname(dir);
|
|
176
|
-
if (parent === dir) return undefined;
|
|
177
|
-
dir = parent;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const FORMAT_BATCH_SIZE = 50;
|
|
182
|
-
|
|
183
|
-
export async function formatWithBiome(
|
|
184
|
-
codemodName: string,
|
|
185
|
-
files: readonly string[],
|
|
186
|
-
cwd: string,
|
|
187
|
-
): Promise<void> {
|
|
188
|
-
const biome = findBiomeBinary(cwd);
|
|
189
|
-
if (biome === undefined) {
|
|
190
|
-
console.log(
|
|
191
|
-
`[${codemodName}] biome not found in node_modules/.bin — format and sort imports of the changed files yourself`,
|
|
192
|
-
);
|
|
193
|
-
// skip: formatting is a convenience, the rewrite itself is already on disk
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
for (let i = 0; i < files.length; i += FORMAT_BATCH_SIZE) {
|
|
197
|
-
const batch = files.slice(i, i + FORMAT_BATCH_SIZE);
|
|
198
|
-
const proc = Bun.spawn({
|
|
199
|
-
cmd: [
|
|
200
|
-
biome,
|
|
201
|
-
"check",
|
|
202
|
-
"--write",
|
|
203
|
-
"--linter-enabled=false",
|
|
204
|
-
"--no-errors-on-unmatched",
|
|
205
|
-
...batch,
|
|
206
|
-
],
|
|
207
|
-
cwd,
|
|
208
|
-
stdout: "pipe",
|
|
209
|
-
stderr: "pipe",
|
|
210
|
-
});
|
|
211
|
-
const [stderr, exitCode] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
|
|
212
|
-
if (exitCode !== 0) {
|
|
213
|
-
console.log(
|
|
214
|
-
`[${codemodName}] biome exited ${exitCode}; run it on the changed files yourself\n${stderr.trim()}`,
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
type Mode = "write" | "dry-run" | "check";
|
|
221
|
-
|
|
222
|
-
interface CliOptions {
|
|
223
|
-
readonly mode: Mode;
|
|
224
|
-
readonly format: boolean;
|
|
225
|
-
readonly paths: string[];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
class CliError extends Error {}
|
|
229
|
-
|
|
230
|
-
function parseArgs(argv: readonly string[]): CliOptions {
|
|
231
|
-
let mode: Mode | undefined;
|
|
232
|
-
let format = true;
|
|
233
|
-
const paths: string[] = [];
|
|
234
|
-
const setMode = (next: Mode): void => {
|
|
235
|
-
if (mode !== undefined && mode !== next) {
|
|
236
|
-
throw new CliError("--check, --dry-run and --write are mutually exclusive");
|
|
237
|
-
}
|
|
238
|
-
mode = next;
|
|
239
|
-
};
|
|
240
|
-
for (const arg of argv) {
|
|
241
|
-
if (arg === "--check") setMode("check");
|
|
242
|
-
else if (arg === "--dry-run") setMode("dry-run");
|
|
243
|
-
else if (arg === "--write") setMode("write");
|
|
244
|
-
else if (arg === "--no-format") format = false;
|
|
245
|
-
else if (arg.startsWith("--")) throw new CliError(`unknown flag: ${arg}`);
|
|
246
|
-
else paths.push(arg);
|
|
247
|
-
}
|
|
248
|
-
if (paths.length === 0) throw new CliError("at least one target directory is required");
|
|
249
|
-
return { mode: mode ?? "write", format, paths };
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function isSourceFileName(name: string): boolean {
|
|
253
|
-
return /\.(ts|tsx)$/.test(name) && !name.endsWith(".d.ts");
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function displayPath(file: string): string {
|
|
257
|
-
const fromCwd = relative(process.cwd(), file);
|
|
258
|
-
return fromCwd.startsWith("..") ? file : fromCwd;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
export interface CodemodCliConfig {
|
|
262
|
-
readonly name: string;
|
|
263
|
-
readonly transform: (source: string, filePath: string) => CodemodResult;
|
|
264
|
-
readonly isSkippedPath: (file: string) => boolean;
|
|
265
|
-
// Exact file names (e.g. package.json) handed to transform next to the .ts/.tsx sources.
|
|
266
|
-
readonly extraFileNames?: readonly string[];
|
|
267
|
-
// File extensions (e.g. ".css") handed to transform next to the .ts/.tsx sources.
|
|
268
|
-
readonly extraExtensions?: readonly string[];
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
function parseArgsOrExit(codemodName: string, argv: readonly string[]): CliOptions {
|
|
272
|
-
try {
|
|
273
|
-
return parseArgs(argv);
|
|
274
|
-
} catch (err) {
|
|
275
|
-
if (err instanceof CliError) {
|
|
276
|
-
console.error(`[${codemodName}] ${err.message}`);
|
|
277
|
-
process.exit(2);
|
|
278
|
-
}
|
|
279
|
-
throw err;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function transformFiles(
|
|
284
|
-
config: CodemodCliConfig,
|
|
285
|
-
files: readonly string[],
|
|
286
|
-
mode: Mode,
|
|
287
|
-
): { rewrites: CodemodSite[]; manual: CodemodSite[]; changedFiles: string[] } {
|
|
288
|
-
const rewrites: CodemodSite[] = [];
|
|
289
|
-
const manual: CodemodSite[] = [];
|
|
290
|
-
const changedFiles: string[] = [];
|
|
291
|
-
for (const file of files) {
|
|
292
|
-
const before = readFileSync(file, "utf8");
|
|
293
|
-
const result = config.transform(before, file);
|
|
294
|
-
const shown = displayPath(file);
|
|
295
|
-
for (const site of result.rewrites)
|
|
296
|
-
console.log(`${shown}:${site.line} rewritten ${site.description}`);
|
|
297
|
-
for (const site of result.manual)
|
|
298
|
-
console.log(`${shown}:${site.line} manual ${site.description}`);
|
|
299
|
-
rewrites.push(...result.rewrites);
|
|
300
|
-
manual.push(...result.manual);
|
|
301
|
-
if (mode === "write" && result.output !== before) {
|
|
302
|
-
writeFileSync(file, result.output);
|
|
303
|
-
changedFiles.push(file);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return { rewrites, manual, changedFiles };
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// Without a mode flag it writes (kumiko-upgrade --apply calls it that way). --check exits 1
|
|
310
|
-
// while any rewritable or manual site is left; --dry-run only reports.
|
|
311
|
-
export async function runCodemodCli(
|
|
312
|
-
config: CodemodCliConfig,
|
|
313
|
-
argv: readonly string[],
|
|
314
|
-
): Promise<void> {
|
|
315
|
-
const options = parseArgsOrExit(config.name, argv);
|
|
316
|
-
const files = collectSourceFiles(options.paths, {
|
|
317
|
-
isMigratableFile: (name) =>
|
|
318
|
-
isSourceFileName(name) ||
|
|
319
|
-
(config.extraFileNames?.includes(name) ?? false) ||
|
|
320
|
-
(config.extraExtensions?.some((extension) => name.endsWith(extension)) ?? false),
|
|
321
|
-
}).filter((file) => !(file.includes("/__tests__/fixtures/") || config.isSkippedPath(file)));
|
|
322
|
-
const { rewrites, manual, changedFiles } = transformFiles(config, files, options.mode);
|
|
323
|
-
console.log(
|
|
324
|
-
`\n[${config.name}] ${options.mode === "write" ? "rewritten" : "rewritable"}: ${rewrites.length} site(s) in ${new Set(rewrites.map((site) => site.file)).size} file(s); manual: ${manual.length}`,
|
|
325
|
-
);
|
|
326
|
-
if (options.mode === "write" && options.format && changedFiles.length > 0) {
|
|
327
|
-
await formatWithBiome(
|
|
328
|
-
config.name,
|
|
329
|
-
changedFiles.filter((file) => isSourceFileName(file)),
|
|
330
|
-
resolve(options.paths[0] ?? "."),
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
process.exit(options.mode === "check" && rewrites.length + manual.length > 0 ? 1 : 0);
|
|
334
|
-
}
|