pipework 0.252.0 → 0.253.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/CHANGELOG.md +10 -0
- package/dist/infra/support/handle.d.ts +8 -1
- package/dist/infra/support/handle.d.ts.map +1 -1
- package/dist/infra/support/handle.js +9 -2
- package/dist/infra/support/handle.js.map +1 -1
- package/dist/infra/support/namespace.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/async/jobs/abortable-delay.ts +18 -0
- package/src/async/jobs/claims.ts +52 -0
- package/src/async/jobs/cron.ts +179 -0
- package/src/async/jobs/errors.ts +56 -0
- package/src/async/jobs/exclusion.ts +117 -0
- package/src/async/jobs/execute.ts +219 -0
- package/src/async/jobs/index.ts +10 -0
- package/src/async/jobs/listener.ts +135 -0
- package/src/async/jobs/namespace.ts +20 -0
- package/src/async/jobs/queue-door.ts +44 -0
- package/src/async/jobs/queue.ts +1012 -0
- package/src/async/jobs/run-script.ts +67 -0
- package/src/async/jobs/scheduler.ts +218 -0
- package/src/async/jobs/schedules-table.ts +37 -0
- package/src/async/jobs/serialize-error.ts +48 -0
- package/src/async/jobs/table.ts +191 -0
- package/src/async/pipeline/define.ts +53 -0
- package/src/async/pipeline/errors.ts +35 -0
- package/src/async/pipeline/execute.ts +53 -0
- package/src/async/pipeline/index.ts +13 -0
- package/src/async/pipeline/namespace.ts +12 -0
- package/src/async/pipeline/resume.ts +67 -0
- package/src/async/pipeline/run-steps.ts +98 -0
- package/src/async/pipeline/types.ts +57 -0
- package/src/async/state-machine/define.ts +64 -0
- package/src/async/state-machine/errors.ts +29 -0
- package/src/async/state-machine/index.ts +3 -0
- package/src/async/state-machine/namespace.ts +12 -0
- package/src/async/state-machine/transition.ts +90 -0
- package/src/async/state-machine/types.ts +37 -0
- package/src/async/steps/errors.ts +31 -0
- package/src/async/steps/graph.ts +1214 -0
- package/src/async/steps/hash.ts +40 -0
- package/src/async/steps/index.ts +7 -0
- package/src/async/steps/namespace.ts +7 -0
- package/src/async/steps/table.ts +97 -0
- package/src/async/steps/types.ts +318 -0
- package/src/audit/chain/index.ts +9 -0
- package/src/audit/chain/install.ts +113 -0
- package/src/audit/chain/retire.ts +52 -0
- package/src/audit/chain/verify.ts +257 -0
- package/src/audit/query/cursor.ts +37 -0
- package/src/audit/query/index.ts +9 -0
- package/src/audit/query/query.ts +223 -0
- package/src/audit/schema/audit-record-fields.ts +68 -0
- package/src/audit/schema/audit-record.ts +23 -0
- package/src/auth/auth/audit.ts +31 -0
- package/src/auth/auth/chain.ts +84 -0
- package/src/auth/auth/cookie.ts +136 -0
- package/src/auth/auth/email-links.ts +311 -0
- package/src/auth/auth/guard.ts +128 -0
- package/src/auth/auth/index.ts +18 -0
- package/src/auth/auth/multi-org.ts +337 -0
- package/src/auth/auth/namespace.ts +34 -0
- package/src/auth/auth/parse-expiry.ts +13 -0
- package/src/auth/auth/passwords.ts +110 -0
- package/src/auth/auth/schema.ts +110 -0
- package/src/auth/auth/sessions.ts +565 -0
- package/src/auth/auth/sign-in.ts +156 -0
- package/src/auth/auth/signing-keys.ts +69 -0
- package/src/auth/auth/types.ts +26 -0
- package/src/auth/auth/uuid.ts +10 -0
- package/src/auth/rbac/cache.ts +55 -0
- package/src/auth/rbac/check.ts +30 -0
- package/src/auth/rbac/create.ts +35 -0
- package/src/auth/rbac/index.ts +5 -0
- package/src/auth/rbac/middleware.ts +20 -0
- package/src/auth/rbac/namespace.ts +15 -0
- package/src/auth/rbac/resolve.ts +31 -0
- package/src/auth/rbac/schema.sql +31 -0
- package/src/auth/rbac/seed.ts +67 -0
- package/src/auth/rbac/tables.ts +32 -0
- package/src/auth/rbac/types.ts +65 -0
- package/src/auth/tenant/extract.ts +33 -0
- package/src/auth/tenant/in-tenant.ts +49 -0
- package/src/auth/tenant/index.ts +7 -0
- package/src/auth/tenant/namespace.ts +23 -0
- package/src/auth/tenant/propagate.ts +20 -0
- package/src/auth/tenant/rls.ts +120 -0
- package/src/auth/tenant/scope.ts +33 -0
- package/src/auth/tenant/scoped-db.ts +581 -0
- package/src/auth/tenant/types.ts +14 -0
- package/src/auth/tenant/validate.ts +27 -0
- package/src/cli/commands/add.ts +158 -0
- package/src/cli/commands/alerts.ts +98 -0
- package/src/cli/commands/check.ts +1418 -0
- package/src/cli/commands/codemod.ts +78 -0
- package/src/cli/commands/db.ts +356 -0
- package/src/cli/commands/dev.ts +101 -0
- package/src/cli/commands/generate.ts +75 -0
- package/src/cli/commands/init.ts +36 -0
- package/src/cli/commands/install.ts +28 -0
- package/src/cli/commands/lint.ts +62 -0
- package/src/cli/commands/migrate.ts +132 -0
- package/src/cli/commands/openapi.ts +63 -0
- package/src/cli/commands/remove.ts +72 -0
- package/src/cli/commands/run.ts +50 -0
- package/src/cli/commands/scope.ts +54 -0
- package/src/cli/commands/serve.ts +68 -0
- package/src/cli/commands/shard.ts +31 -0
- package/src/cli/commands/shared/config-pipework-version.ts +28 -0
- package/src/cli/commands/shared/find-config.ts +22 -0
- package/src/cli/commands/shared/load-config.ts +35 -0
- package/src/cli/commands/shared/pnpm-install.ts +95 -0
- package/src/cli/commands/shared/report-removed.ts +8 -0
- package/src/cli/commands/sync.ts +32 -0
- package/src/cli/commands/test.ts +307 -0
- package/src/cli/commands/upgrade.ts +48 -0
- package/src/cli/dev-bootstrap.ts +24 -0
- package/src/cli/errors.ts +10 -0
- package/src/cli/index.ts +303 -0
- package/src/cli/output.ts +17 -0
- package/src/cli/port.ts +15 -0
- package/src/cli/surface-kinds.ts +20 -0
- package/src/client/index.ts +4 -0
- package/src/client/poll.ts +130 -0
- package/src/client/report-fault.ts +119 -0
- package/src/core/config/app-pool.ts +19 -0
- package/src/core/config/aws-env.ts +29 -0
- package/src/core/config/base-dir.ts +24 -0
- package/src/core/config/discover.ts +64 -0
- package/src/core/config/env-resolve.ts +87 -0
- package/src/core/config/env-types.ts +116 -0
- package/src/core/config/env.ts +55 -0
- package/src/core/config/errors.ts +9 -0
- package/src/core/config/import-config.ts +40 -0
- package/src/core/config/index.ts +8 -0
- package/src/core/config/load.ts +417 -0
- package/src/core/config/namespace.ts +14 -0
- package/src/core/config/resolve.ts +195 -0
- package/src/core/config/schema.ts +488 -0
- package/src/core/config/statement-observer.ts +48 -0
- package/src/core/config/ts-inline-hooks.ts +75 -0
- package/src/core/config/ts-register.ts +4 -0
- package/src/core/config/ts-resolve-hooks.ts +101 -0
- package/src/core/errors/base.ts +49 -0
- package/src/core/errors/http.ts +146 -0
- package/src/core/errors/index.ts +2 -0
- package/src/core/errors/namespace.ts +31 -0
- package/src/core/lifecycle/drain.ts +33 -0
- package/src/core/lifecycle/health.ts +72 -0
- package/src/core/lifecycle/index.ts +4 -0
- package/src/core/lifecycle/namespace.ts +7 -0
- package/src/core/lifecycle/startup.ts +102 -0
- package/src/core/lifecycle/types.ts +36 -0
- package/src/core/logging/context.ts +60 -0
- package/src/core/logging/error-chain.ts +68 -0
- package/src/core/logging/index.ts +5 -0
- package/src/core/logging/logger.ts +65 -0
- package/src/core/logging/namespace.ts +16 -0
- package/src/core/logging/proxy.ts +22 -0
- package/src/core/logging/redact-match.ts +24 -0
- package/src/core/logging/types.ts +47 -0
- package/src/core/pipework.ts +566 -0
- package/src/core/runtime/broker.ts +69 -0
- package/src/core/surface/http.ts +133 -0
- package/src/core/surface/index.ts +11 -0
- package/src/core/surface/job-timeout.ts +40 -0
- package/src/core/surface/namespace.ts +13 -0
- package/src/core/surface/script.ts +33 -0
- package/src/core/surface/start.ts +142 -0
- package/src/core/surface/types.ts +225 -0
- package/src/core/surface/validate.ts +88 -0
- package/src/core/surface/worker.ts +528 -0
- package/src/core/validation/connectivity.ts +49 -0
- package/src/core/validation/domain.ts +99 -0
- package/src/core/validation/index.ts +5 -0
- package/src/core/validation/queue-tables.ts +312 -0
- package/src/core/validation/rls-role.ts +138 -0
- package/src/core/validation/startup.ts +51 -0
- package/src/core/validation/surfaces.ts +65 -0
- package/src/core/validation/types.ts +25 -0
- package/src/data/db/advisory-lock.ts +55 -0
- package/src/data/db/aggregates.ts +172 -0
- package/src/data/db/array-elements.ts +111 -0
- package/src/data/db/bulk-set.ts +53 -0
- package/src/data/db/col/index.ts +14 -0
- package/src/data/db/composed.ts +53 -0
- package/src/data/db/db.ts +276 -0
- package/src/data/db/excluded.ts +16 -0
- package/src/data/db/expressions.ts +473 -0
- package/src/data/db/filter.ts +90 -0
- package/src/data/db/function-source.ts +114 -0
- package/src/data/db/identifiers.ts +16 -0
- package/src/data/db/idx/index.ts +9 -0
- package/src/data/db/in-list.ts +49 -0
- package/src/data/db/index.ts +9 -0
- package/src/data/db/insert-split.ts +137 -0
- package/src/data/db/instrumentation.ts +82 -0
- package/src/data/db/maintenance.ts +28 -0
- package/src/data/db/namespace.ts +107 -0
- package/src/data/db/owner-labels.ts +9 -0
- package/src/data/db/pool.ts +187 -0
- package/src/data/db/query-label.ts +13 -0
- package/src/data/db/query-watch.ts +116 -0
- package/src/data/db/raw-client-warning.ts +37 -0
- package/src/data/db/readonly.ts +23 -0
- package/src/data/db/reservation.ts +151 -0
- package/src/data/db/schema-features.ts +14 -0
- package/src/data/db/serializable.ts +83 -0
- package/src/data/db/sql.ts +1 -0
- package/src/data/db/timeouts.ts +76 -0
- package/src/data/db/types.ts +18 -0
- package/src/data/db/unbound.ts +33 -0
- package/src/data/db/values.ts +29 -0
- package/src/data/domain/brand.ts +15 -0
- package/src/data/domain/build-factory.ts +193 -0
- package/src/data/domain/build-schema.ts +161 -0
- package/src/data/domain/build-table.ts +355 -0
- package/src/data/domain/define.ts +239 -0
- package/src/data/domain/external-registry.ts +34 -0
- package/src/data/domain/external.ts +77 -0
- package/src/data/domain/field.ts +279 -0
- package/src/data/domain/index.ts +13 -0
- package/src/data/domain/naming.ts +6 -0
- package/src/data/domain/projections.ts +57 -0
- package/src/data/domain/trace-safe-projection.ts +31 -0
- package/src/data/domain/traits.ts +108 -0
- package/src/data/domain/types.ts +289 -0
- package/src/data/jsonb/composed.ts +18 -0
- package/src/data/jsonb/index.ts +1 -0
- package/src/data/jsonb/namespace.ts +30 -0
- package/src/data/jsonb/query.ts +86 -0
- package/src/data/migrate/append-only-generate.ts +47 -0
- package/src/data/migrate/applied.ts +47 -0
- package/src/data/migrate/apply.ts +309 -0
- package/src/data/migrate/check.ts +119 -0
- package/src/data/migrate/diff.ts +357 -0
- package/src/data/migrate/door-generate.ts +130 -0
- package/src/data/migrate/framework-rls.ts +58 -0
- package/src/data/migrate/generate.ts +201 -0
- package/src/data/migrate/history.ts +215 -0
- package/src/data/migrate/index.ts +9 -0
- package/src/data/migrate/internal-definitions.ts +175 -0
- package/src/data/migrate/post-process.ts +73 -0
- package/src/data/migrate/pragma.ts +73 -0
- package/src/data/migrate/provision-framework.ts +147 -0
- package/src/data/migrate/rls-generate.ts +61 -0
- package/src/data/migrate/run.ts +124 -0
- package/src/data/migrate/safety.ts +167 -0
- package/src/data/migrate/snapshot.ts +368 -0
- package/src/data/migrate/sql-emit.ts +392 -0
- package/src/data/migrate/statements.ts +312 -0
- package/src/data/query/alias.ts +126 -0
- package/src/data/query/batch.ts +8 -0
- package/src/data/query/cache/core/cache.ts +78 -0
- package/src/data/query/cache/core/index.ts +1 -0
- package/src/data/query/cache/core/types.ts +29 -0
- package/src/data/query/cache/readme.md +230 -0
- package/src/data/query/casing.ts +76 -0
- package/src/data/query/collation.ts +11 -0
- package/src/data/query/column-builder.ts +370 -0
- package/src/data/query/column.ts +150 -0
- package/src/data/query/entity.ts +42 -0
- package/src/data/query/errors.ts +33 -0
- package/src/data/query/index.ts +14 -0
- package/src/data/query/logger.ts +47 -0
- package/src/data/query/operations.ts +45 -0
- package/src/data/query/pg-core/alias.ts +12 -0
- package/src/data/query/pg-core/checks.ts +32 -0
- package/src/data/query/pg-core/columns/all.ts +71 -0
- package/src/data/query/pg-core/columns/bigint.ts +110 -0
- package/src/data/query/pg-core/columns/bigserial.ts +128 -0
- package/src/data/query/pg-core/columns/boolean.ts +43 -0
- package/src/data/query/pg-core/columns/char.ts +85 -0
- package/src/data/query/pg-core/columns/cidr.ts +43 -0
- package/src/data/query/pg-core/columns/common.ts +366 -0
- package/src/data/query/pg-core/columns/custom.ts +232 -0
- package/src/data/query/pg-core/columns/date.common.ts +15 -0
- package/src/data/query/pg-core/columns/date.ts +112 -0
- package/src/data/query/pg-core/columns/double-precision.ts +55 -0
- package/src/data/query/pg-core/columns/enum.ts +201 -0
- package/src/data/query/pg-core/columns/index.ts +35 -0
- package/src/data/query/pg-core/columns/inet.ts +43 -0
- package/src/data/query/pg-core/columns/int.common.ts +57 -0
- package/src/data/query/pg-core/columns/integer.ts +53 -0
- package/src/data/query/pg-core/columns/interval.ts +83 -0
- package/src/data/query/pg-core/columns/json.ts +58 -0
- package/src/data/query/pg-core/columns/jsonb.ts +56 -0
- package/src/data/query/pg-core/columns/line.ts +117 -0
- package/src/data/query/pg-core/columns/macaddr.ts +43 -0
- package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
- package/src/data/query/pg-core/columns/numeric.ts +227 -0
- package/src/data/query/pg-core/columns/point.ts +127 -0
- package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
- package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
- package/src/data/query/pg-core/columns/real.ts +58 -0
- package/src/data/query/pg-core/columns/serial.ts +55 -0
- package/src/data/query/pg-core/columns/smallint.ts +53 -0
- package/src/data/query/pg-core/columns/smallserial.ts +60 -0
- package/src/data/query/pg-core/columns/text.ts +67 -0
- package/src/data/query/pg-core/columns/time.ts +72 -0
- package/src/data/query/pg-core/columns/timestamp.ts +163 -0
- package/src/data/query/pg-core/columns/uuid.ts +51 -0
- package/src/data/query/pg-core/columns/varchar.ts +89 -0
- package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
- package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
- package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
- package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
- package/src/data/query/pg-core/db.ts +674 -0
- package/src/data/query/pg-core/dialect.ts +1404 -0
- package/src/data/query/pg-core/expressions.ts +25 -0
- package/src/data/query/pg-core/foreign-keys.ts +130 -0
- package/src/data/query/pg-core/index.ts +21 -0
- package/src/data/query/pg-core/indexes.ts +276 -0
- package/src/data/query/pg-core/policies.ts +56 -0
- package/src/data/query/pg-core/primary-keys.ts +62 -0
- package/src/data/query/pg-core/query-builders/count.ts +86 -0
- package/src/data/query/pg-core/query-builders/delete.ts +293 -0
- package/src/data/query/pg-core/query-builders/index.ts +7 -0
- package/src/data/query/pg-core/query-builders/insert.ts +452 -0
- package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
- package/src/data/query/pg-core/query-builders/query.ts +157 -0
- package/src/data/query/pg-core/query-builders/raw.ts +49 -0
- package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
- package/src/data/query/pg-core/query-builders/select.ts +1346 -0
- package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
- package/src/data/query/pg-core/query-builders/update.ts +626 -0
- package/src/data/query/pg-core/roles.ts +41 -0
- package/src/data/query/pg-core/schema.ts +72 -0
- package/src/data/query/pg-core/sequence.ts +41 -0
- package/src/data/query/pg-core/session.ts +292 -0
- package/src/data/query/pg-core/subquery.ts +46 -0
- package/src/data/query/pg-core/table.ts +252 -0
- package/src/data/query/pg-core/unique-constraint.ts +73 -0
- package/src/data/query/pg-core/utils/array.ts +95 -0
- package/src/data/query/pg-core/utils/index.ts +1 -0
- package/src/data/query/pg-core/utils.ts +104 -0
- package/src/data/query/pg-core/view-base.ts +14 -0
- package/src/data/query/pg-core/view-common.ts +1 -0
- package/src/data/query/pg-core/view.ts +435 -0
- package/src/data/query/pg-core/with-builder.ts +41 -0
- package/src/data/query/postgres-js/README.md +46 -0
- package/src/data/query/postgres-js/array-parser.ts +45 -0
- package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
- package/src/data/query/postgres-js/driver.ts +163 -0
- package/src/data/query/postgres-js/index.ts +2 -0
- package/src/data/query/postgres-js/session.ts +234 -0
- package/src/data/query/primary-key.ts +11 -0
- package/src/data/query/query-builders/query-builder.ts +19 -0
- package/src/data/query/query-builders/select.types.ts +175 -0
- package/src/data/query/query-promise.ts +35 -0
- package/src/data/query/relations.ts +725 -0
- package/src/data/query/runnable-query.ts +12 -0
- package/src/data/query/selection-proxy.ts +121 -0
- package/src/data/query/session.ts +8 -0
- package/src/data/query/sql/expressions/conditions.ts +741 -0
- package/src/data/query/sql/expressions/index.ts +2 -0
- package/src/data/query/sql/expressions/select.ts +45 -0
- package/src/data/query/sql/functions/aggregate.ts +129 -0
- package/src/data/query/sql/functions/index.ts +2 -0
- package/src/data/query/sql/functions/vector.ts +178 -0
- package/src/data/query/sql/index.ts +3 -0
- package/src/data/query/sql/sql.ts +794 -0
- package/src/data/query/subquery.ts +53 -0
- package/src/data/query/table.ts +208 -0
- package/src/data/query/table.utils.ts +2 -0
- package/src/data/query/tracing-utils.ts +3 -0
- package/src/data/query/tracing.ts +11 -0
- package/src/data/query/utils.ts +357 -0
- package/src/data/query/version.ts +4 -0
- package/src/data/query/view-common.ts +1 -0
- package/src/data/schema/branded.ts +13 -0
- package/src/data/schema/generated/coerce.ts +5 -0
- package/src/data/schema/generated/combinator.ts +6 -0
- package/src/data/schema/generated/encoding.ts +5 -0
- package/src/data/schema/generated/error.ts +6 -0
- package/src/data/schema/generated/format.ts +5 -0
- package/src/data/schema/generated/type-constructor.ts +10 -0
- package/src/data/schema/generated/type.ts +6 -0
- package/src/data/schema/index.ts +6 -0
- package/src/data/schema/json-schema.ts +33 -0
- package/src/data/schema/namespace.ts +55 -0
- package/src/data/schema/parse.ts +39 -0
- package/src/data/schema/types.ts +39 -0
- package/src/data/temporal/append-only.ts +134 -0
- package/src/data/temporal/close.ts +27 -0
- package/src/data/temporal/columns.ts +10 -0
- package/src/data/temporal/definition-queries.ts +70 -0
- package/src/data/temporal/errors.ts +10 -0
- package/src/data/temporal/get-current.ts +22 -0
- package/src/data/temporal/index.ts +9 -0
- package/src/data/temporal/namespace.ts +36 -0
- package/src/data/temporal/query.ts +25 -0
- package/src/data/temporal/resolve.ts +17 -0
- package/src/data/temporal/revise.ts +67 -0
- package/src/data/temporal/types.ts +22 -0
- package/src/data/valve/artifact.ts +33 -0
- package/src/data/valve/contract-diff.ts +21 -0
- package/src/data/valve/cross.ts +57 -0
- package/src/data/valve/crossing-ledger.ts +50 -0
- package/src/data/valve/decision.ts +44 -0
- package/src/data/valve/durable-crossing.ts +52 -0
- package/src/data/valve/execute-crossing.ts +77 -0
- package/src/data/valve/faucet.ts +56 -0
- package/src/data/valve/gate.ts +114 -0
- package/src/data/valve/graph.ts +77 -0
- package/src/data/valve/index.ts +53 -0
- package/src/data/valve/namespace.ts +57 -0
- package/src/data/valve/registry.ts +50 -0
- package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
- package/src/data/valve/schema/valve-crossing.ts +9 -0
- package/src/data/valve/supply.ts +154 -0
- package/src/data/valve/types.ts +143 -0
- package/src/data/vector/columns.ts +27 -0
- package/src/data/vector/index.ts +4 -0
- package/src/data/vector/namespace.ts +33 -0
- package/src/data/vector/query.ts +85 -0
- package/src/data/vector/validate.ts +16 -0
- package/src/data/write/audit/actor.ts +15 -0
- package/src/data/write/audit/audit-columns.ts +18 -0
- package/src/data/write/audit/audit-select.ts +111 -0
- package/src/data/write/audit/bound-transaction.ts +14 -0
- package/src/data/write/audit/cte-compile.ts +32 -0
- package/src/data/write/audit/decode-returning.ts +47 -0
- package/src/data/write/audit/final-select.ts +43 -0
- package/src/data/write/audit/infra-audit.ts +36 -0
- package/src/data/write/audit/primary-key.ts +65 -0
- package/src/data/write/audit/projection.ts +41 -0
- package/src/data/write/audit/read-touches.ts +86 -0
- package/src/data/write/audit/touch-match.ts +78 -0
- package/src/data/write/audit/verb-delete.ts +62 -0
- package/src/data/write/audit/verb-insert.ts +36 -0
- package/src/data/write/audit/verb-select.ts +47 -0
- package/src/data/write/audit/verb-update.ts +60 -0
- package/src/data/write/audit/verb-upsert.ts +104 -0
- package/src/data/write/conflict.ts +43 -0
- package/src/data/write/delete.ts +38 -0
- package/src/data/write/execute.ts +243 -0
- package/src/data/write/index.ts +11 -0
- package/src/data/write/insert.ts +63 -0
- package/src/data/write/state.ts +43 -0
- package/src/data/write/update.ts +54 -0
- package/src/data/write/upsert.ts +58 -0
- package/src/data/write/values.ts +19 -0
- package/src/index.ts +230 -0
- package/src/infra/access-links/code.ts +70 -0
- package/src/infra/access-links/handle.ts +892 -0
- package/src/infra/access-links/index.ts +9 -0
- package/src/infra/access-links/namespace.ts +30 -0
- package/src/infra/access-links/person-check.ts +177 -0
- package/src/infra/access-links/schema.ts +71 -0
- package/src/infra/alerts/async-sources.ts +231 -0
- package/src/infra/alerts/audit.ts +36 -0
- package/src/infra/alerts/beat.ts +123 -0
- package/src/infra/alerts/client-faults.ts +111 -0
- package/src/infra/alerts/faults.ts +156 -0
- package/src/infra/alerts/handle.ts +778 -0
- package/src/infra/alerts/http.ts +192 -0
- package/src/infra/alerts/index.ts +12 -0
- package/src/infra/alerts/infra-sources.ts +180 -0
- package/src/infra/alerts/namespace.ts +81 -0
- package/src/infra/alerts/redact.ts +21 -0
- package/src/infra/alerts/request-faults.ts +41 -0
- package/src/infra/alerts/schema.ts +124 -0
- package/src/infra/alerts/sinks.ts +125 -0
- package/src/infra/alerts/source-options.ts +26 -0
- package/src/infra/alerts/sources.ts +503 -0
- package/src/infra/alerts/subsystem-sources.ts +137 -0
- package/src/infra/audit/emit.ts +87 -0
- package/src/infra/audit/index.ts +2 -0
- package/src/infra/audit/namespace.ts +22 -0
- package/src/infra/audit/schema.sql +35 -0
- package/src/infra/audit/types.ts +18 -0
- package/src/infra/aws/credentials.ts +147 -0
- package/src/infra/aws/sigv4.ts +140 -0
- package/src/infra/cache/create.ts +58 -0
- package/src/infra/cache/entry.ts +81 -0
- package/src/infra/cache/index.ts +4 -0
- package/src/infra/cache/namespace.ts +10 -0
- package/src/infra/cache/tenant.ts +93 -0
- package/src/infra/cache/types.ts +24 -0
- package/src/infra/crawl/audit.ts +35 -0
- package/src/infra/crawl/errors.ts +25 -0
- package/src/infra/crawl/handle.ts +693 -0
- package/src/infra/crawl/index.ts +9 -0
- package/src/infra/crawl/links.ts +160 -0
- package/src/infra/crawl/namespace.ts +36 -0
- package/src/infra/crawl/robots.ts +100 -0
- package/src/infra/crawl/schema.ts +89 -0
- package/src/infra/credit-line/handle.ts +883 -0
- package/src/infra/credit-line/index.ts +6 -0
- package/src/infra/credit-line/namespace.ts +7 -0
- package/src/infra/credit-line/schema.ts +96 -0
- package/src/infra/credits/handle.ts +706 -0
- package/src/infra/credits/index.ts +5 -0
- package/src/infra/credits/namespace.ts +7 -0
- package/src/infra/credits/schema.ts +83 -0
- package/src/infra/email/audit.ts +36 -0
- package/src/infra/email/inbound.ts +622 -0
- package/src/infra/email/index.ts +11 -0
- package/src/infra/email/mail.ts +517 -0
- package/src/infra/email/mime.ts +447 -0
- package/src/infra/email/namespace.ts +22 -0
- package/src/infra/email/providers.ts +111 -0
- package/src/infra/email/schema.ts +96 -0
- package/src/infra/email/sns.ts +200 -0
- package/src/infra/email/unsubscribe.ts +44 -0
- package/src/infra/fetch/address.ts +88 -0
- package/src/infra/fetch/connect-retry.ts +87 -0
- package/src/infra/fetch/handle.ts +329 -0
- package/src/infra/fetch/index.ts +7 -0
- package/src/infra/fetch/namespace.ts +70 -0
- package/src/infra/idempotency/index.ts +3 -0
- package/src/infra/idempotency/middleware.ts +87 -0
- package/src/infra/idempotency/store.ts +92 -0
- package/src/infra/idempotency/types.ts +30 -0
- package/src/infra/join-requests/handle.ts +312 -0
- package/src/infra/join-requests/index.ts +2 -0
- package/src/infra/join-requests/namespace.ts +7 -0
- package/src/infra/join-requests/schema.ts +33 -0
- package/src/infra/outbox/core.ts +165 -0
- package/src/infra/quota/errors.ts +32 -0
- package/src/infra/quota/handle.ts +215 -0
- package/src/infra/quota/index.ts +5 -0
- package/src/infra/quota/namespace.ts +7 -0
- package/src/infra/quota/schema.ts +15 -0
- package/src/infra/storage/backend.ts +34 -0
- package/src/infra/storage/handle.ts +513 -0
- package/src/infra/storage/index.ts +9 -0
- package/src/infra/storage/local.ts +104 -0
- package/src/infra/storage/namespace.ts +13 -0
- package/src/infra/storage/s3.ts +257 -0
- package/src/infra/storage/schema.ts +24 -0
- package/src/infra/support/handle.ts +869 -0
- package/src/infra/support/http.ts +229 -0
- package/src/infra/support/index.ts +7 -0
- package/src/infra/support/namespace.ts +12 -0
- package/src/infra/support/schema.ts +96 -0
- package/src/infra/webhook/inbound.ts +45 -0
- package/src/infra/webhook/index.ts +5 -0
- package/src/infra/webhook/namespace.ts +24 -0
- package/src/infra/webhook/outbound.ts +315 -0
- package/src/infra/webhook/sign.ts +32 -0
- package/src/infra/webhook/verify.ts +82 -0
- package/src/invariants/assert.ts +26 -0
- package/src/invariants/index.ts +1 -0
- package/src/lint/config.ts +56 -0
- package/src/lint/doctrine.ts +163 -0
- package/src/lint/include.ts +97 -0
- package/src/lint/index.ts +3 -0
- package/src/lint/preset.ts +10 -0
- package/src/lint/resolver.ts +218 -0
- package/src/lint/rules/no-reexports.ts +46 -0
- package/src/request/behavior/audited.ts +85 -0
- package/src/request/behavior/cached.ts +62 -0
- package/src/request/behavior/compose.ts +28 -0
- package/src/request/behavior/index.ts +5 -0
- package/src/request/behavior/namespace.ts +16 -0
- package/src/request/behavior/types.ts +26 -0
- package/src/request/behavior/versioned.ts +54 -0
- package/src/request/context/create.ts +103 -0
- package/src/request/context/guard.ts +49 -0
- package/src/request/context/index.ts +4 -0
- package/src/request/context/run-in-transaction.ts +200 -0
- package/src/request/context/store.ts +28 -0
- package/src/request/context/types.ts +50 -0
- package/src/request/di/builder.ts +535 -0
- package/src/request/di/index.ts +8 -0
- package/src/request/di/resolve.ts +271 -0
- package/src/request/di/types.ts +262 -0
- package/src/request/fitting/namespace.ts +7 -0
- package/src/request/fixture/batch.ts +71 -0
- package/src/request/fixture/builder.ts +26 -0
- package/src/request/fixture/errors.ts +10 -0
- package/src/request/fixture/index.ts +8 -0
- package/src/request/fixture/namespace.ts +23 -0
- package/src/request/fixture/paginate.ts +44 -0
- package/src/request/fixture/to-handlers.ts +260 -0
- package/src/request/fixture/types.ts +79 -0
- package/src/request/flow/act-as.ts +78 -0
- package/src/request/flow/namespace.ts +17 -0
- package/src/request/http/error-step.ts +42 -0
- package/src/request/http/file.ts +141 -0
- package/src/request/http/index.ts +4 -0
- package/src/request/http/middleware.ts +141 -0
- package/src/request/http/namespace.ts +5 -0
- package/src/request/http/rate-limit-classes.ts +170 -0
- package/src/request/http/response.ts +82 -0
- package/src/request/http/server.ts +916 -0
- package/src/request/http/sniff.ts +261 -0
- package/src/request/http/types.ts +250 -0
- package/src/request/http/upload.ts +284 -0
- package/src/request/internal/text.ts +6 -0
- package/src/request/openapi/generate.ts +205 -0
- package/src/request/openapi/index.ts +2 -0
- package/src/request/openapi/namespace.ts +7 -0
- package/src/test/auth.ts +13 -0
- package/src/test/auto-setup.ts +45 -0
- package/src/test/context.ts +91 -0
- package/src/test/crawl-fixture.ts +157 -0
- package/src/test/discover-fork.ts +17 -0
- package/src/test/fingerprint.ts +135 -0
- package/src/test/globals.d.ts +7 -0
- package/src/test/index.ts +19 -0
- package/src/test/namespace.ts +87 -0
- package/src/test/plugin.ts +189 -0
- package/src/test/progress.ts +185 -0
- package/src/test/reap-after-run.ts +28 -0
- package/src/test/reap.ts +286 -0
- package/src/test/reset.ts +253 -0
- package/src/test/savepoints.ts +172 -0
- package/src/test/setup.ts +1422 -0
- package/src/test/system-channel.ts +50 -0
- package/src/test/vitest-plugin.ts +142 -0
- package/src/test/vitest-workspace.ts +507 -0
- package/src/test/vitest.ts +333 -0
- package/src/test/watch.ts +105 -0
- package/src/trace/capture/bounded-serializer.ts +146 -0
- package/src/trace/cardinality/analyze.ts +173 -0
- package/src/trace/cardinality/branch-context.ts +214 -0
- package/src/trace/cardinality/check.ts +33 -0
- package/src/trace/cardinality/classify-edge.ts +64 -0
- package/src/trace/cardinality/structural-max.ts +107 -0
- package/src/trace/check/coverage-check.ts +188 -0
- package/src/trace/check/flow-check.ts +103 -0
- package/src/trace/check/flow-step-site.ts +234 -0
- package/src/trace/check/io-pattern.ts +116 -0
- package/src/trace/codemod/add-cardinality.ts +152 -0
- package/src/trace/codemod/run.ts +80 -0
- package/src/trace/entry/child-trace.ts +21 -0
- package/src/trace/entry/close-trace.ts +87 -0
- package/src/trace/entry/finalize-trace.ts +28 -0
- package/src/trace/entry/open-trace.ts +138 -0
- package/src/trace/entry/parent-trace.ts +20 -0
- package/src/trace/entry/parse-traceparent.ts +39 -0
- package/src/trace/entry/process-start.ts +38 -0
- package/src/trace/entry/trace-context.ts +26 -0
- package/src/trace/entry/tracing-enabled.ts +10 -0
- package/src/trace/external/record.ts +195 -0
- package/src/trace/external/report.ts +66 -0
- package/src/trace/namespace.ts +19 -0
- package/src/trace/partition/day.ts +47 -0
- package/src/trace/partition/index.ts +14 -0
- package/src/trace/partition/partition-name.ts +23 -0
- package/src/trace/partition/plan.ts +82 -0
- package/src/trace/partition/schedule.ts +26 -0
- package/src/trace/partition/startup-hook.ts +39 -0
- package/src/trace/partition/sync.ts +154 -0
- package/src/trace/partition/tables.ts +53 -0
- package/src/trace/read/tree.ts +83 -0
- package/src/trace/retain/copy-on-error.ts +76 -0
- package/src/trace/runtime/expire-stale-traces.ts +54 -0
- package/src/trace/runtime/flow-step.ts +147 -0
- package/src/trace/runtime/flush-steps.ts +31 -0
- package/src/trace/runtime/pending-writes.ts +54 -0
- package/src/trace/runtime/step-buffer.ts +298 -0
- package/src/trace/runtime/step-error.ts +21 -0
- package/src/trace/runtime/step-meta.ts +55 -0
- package/src/trace/runtime/thenable.ts +12 -0
- package/src/trace/runtime/truncate-trace.ts +62 -0
- package/src/trace/schema/trace-fields.ts +52 -0
- package/src/trace/schema/trace-retained.ts +22 -0
- package/src/trace/schema/trace-step-fields.ts +44 -0
- package/src/trace/schema/trace-step-retained.ts +25 -0
- package/src/trace/schema/trace-step.ts +18 -0
- package/src/trace/schema/trace.ts +12 -0
- package/src/trace/transformer/apply.ts +79 -0
- package/src/trace/transformer/build-meta-literal.ts +30 -0
- package/src/trace/transformer/find-flow-step-sites.ts +85 -0
- package/src/trace/transformer/inject-flow-step-import.ts +39 -0
- package/src/trace/transformer/transform-error.ts +14 -0
- package/src/trace/transformer/transform-flow-steps.ts +123 -0
- package/src/trace/transformer/wrap-function-declaration.ts +62 -0
- package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
- package/src/workspace/affected.ts +110 -0
- package/src/workspace/changed-files.ts +163 -0
- package/src/workspace/check-deps.ts +213 -0
- package/src/workspace/checksum.ts +20 -0
- package/src/workspace/dependency-graph.ts +67 -0
- package/src/workspace/detect-pipework-copies.ts +93 -0
- package/src/workspace/discover.ts +206 -0
- package/src/workspace/generate.ts +401 -0
- package/src/workspace/index.ts +7 -0
- package/src/workspace/module-imports-pipework.ts +39 -0
- package/src/workspace/module-package-name.ts +12 -0
- package/src/workspace/scrub-git-env.ts +23 -0
- package/src/workspace/source-paths.ts +36 -0
- package/src/workspace/sync.ts +182 -0
- package/dist/REFERENCE.md +0 -1477
- package/dist/infra/access-links/rate-limit.d.ts +0 -10
- package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
- package/dist/infra/access-links/rate-limit.js +0 -28
- package/dist/infra/access-links/rate-limit.js.map +0 -1
- package/dist/infra/email/sigv4.d.ts +0 -24
- package/dist/infra/email/sigv4.d.ts.map +0 -1
- package/dist/infra/email/sigv4.js +0 -55
- package/dist/infra/email/sigv4.js.map +0 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import type { DB, TransactionConfig } from './index.js'
|
|
2
|
+
import { sql } from './sql.js'
|
|
3
|
+
import { requireContext, runInContext } from '../../request/context/store.js'
|
|
4
|
+
import { verifyTransactionBinding, bindTransaction } from '../../request/context/guard.js'
|
|
5
|
+
import { propagateLocals } from '../../request/context/run-in-transaction.js'
|
|
6
|
+
import { unboundDb } from './unbound.js'
|
|
7
|
+
import { createScopedDb, createTenantGuardDb, createSystemGuardDb, createDoorDb } from '../../auth/tenant/scoped-db.js'
|
|
8
|
+
|
|
9
|
+
function resolveDb(name?: string): DB {
|
|
10
|
+
const ctx = requireContext()
|
|
11
|
+
const resolvedName = name ?? ctx.instance.config.defaultDatabaseName()
|
|
12
|
+
const dbConfig = ctx.instance.config.database(resolvedName)
|
|
13
|
+
|
|
14
|
+
const bound = ctx.transactions.get(resolvedName)
|
|
15
|
+
if (bound) {
|
|
16
|
+
verifyTransactionBinding(ctx, bound, resolvedName)
|
|
17
|
+
return bound.drizzle
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return unboundDb(ctx, resolvedName, dbConfig, 'pipe()')
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The database handle for the active Flow: its bound transaction, scoped to the
|
|
25
|
+
* Flow's tenant (or tenant-guarded when there is none).
|
|
26
|
+
*
|
|
27
|
+
* With no bound transaction, `pipe()` uses the pooled connection. On a
|
|
28
|
+
* platform-mode database (`rls.platformRole`) that is the platform role: with no
|
|
29
|
+
* tenant in the Flow it runs as is and tenant tables return nothing (fail
|
|
30
|
+
* closed); with a tenant in the Flow it throws, naming `pipe.transaction` and the
|
|
31
|
+
* request or job transaction, because the tenant setting can only be set per
|
|
32
|
+
* transaction and a builder runs its statement unwrapped.
|
|
33
|
+
*/
|
|
34
|
+
export function pipe(name?: string): DB {
|
|
35
|
+
const ctx = requireContext()
|
|
36
|
+
const db = resolveDb(name)
|
|
37
|
+
|
|
38
|
+
if (ctx.tenant !== null) {
|
|
39
|
+
return createScopedDb(db, ctx.tenant)
|
|
40
|
+
}
|
|
41
|
+
return createTenantGuardDb(db)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The unwrapped database handle: no tenant filter on anything it builds. Only a
|
|
46
|
+
* carrier for statements already compiled against the scoped `pipe()` db, such
|
|
47
|
+
* as the audit-write CTE, which the scoped connection cannot `.execute()`.
|
|
48
|
+
*/
|
|
49
|
+
export function pipeRaw(name?: string): DB {
|
|
50
|
+
return resolveDb(name)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The system channel — deliberate cross-tenant database access for surfaces
|
|
55
|
+
* that legitimately operate without a tenant in context: pre-tenant auth
|
|
56
|
+
* (membership resolution during login), public webhook ingress, admin tooling.
|
|
57
|
+
*
|
|
58
|
+
* Unlike `pipe()`, the handle is never tenant-scoped and never tenant-guarded.
|
|
59
|
+
* Unlike `pipeRaw()`, it does not return the request's bound transaction — it
|
|
60
|
+
* resolves the owner-role pooled connection, outside the request/job
|
|
61
|
+
* transaction. The bound transaction authenticates as the runtime app role
|
|
62
|
+
* and is RLS-bound fail-closed, so an unscoped query inside it would silently
|
|
63
|
+
* return zero rows once role separation is on; the owner connection is the
|
|
64
|
+
* only honest carrier for a cross-tenant read. Queries here see committed
|
|
65
|
+
* data only and do not participate in request atomicity.
|
|
66
|
+
*
|
|
67
|
+
* Under collapsed test isolation (a pool override is registered for the
|
|
68
|
+
* database) every role shares the single rolled-back connection, and that
|
|
69
|
+
* connection is reserved by the open transaction — so the channel runs on that
|
|
70
|
+
* same connection and transaction and sees the test's uncommitted rows. Where
|
|
71
|
+
* the database has `rls`, the test template carries a permissive policy,
|
|
72
|
+
* `pipework_test_system`, that opens only while a statement sent through this
|
|
73
|
+
* handle runs, so it reads and writes every tenant's rows as the owner does.
|
|
74
|
+
* Limit: a RESTRICTIVE policy still filters in tests; BYPASSRLS would not.
|
|
75
|
+
*
|
|
76
|
+
* Where the database sets `rls.platformRole` the channel runs on that role
|
|
77
|
+
* (`systemUrl`), which bypasses nothing. The handle refuses at build time any
|
|
78
|
+
* statement over a tenant-scoped table; a platform read of one goes through a
|
|
79
|
+
* door declared in config, with `pipe.door()`.
|
|
80
|
+
*/
|
|
81
|
+
export function pipeSystem(name?: string): DB {
|
|
82
|
+
const db = pipeSystemRaw(name)
|
|
83
|
+
const ctx = requireContext()
|
|
84
|
+
const resolvedName = name ?? ctx.instance.config.defaultDatabaseName()
|
|
85
|
+
return ctx.instance.config.database(resolvedName).rls?.platformRole !== undefined ? createSystemGuardDb(db) : db
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** The system channel's connection without the platform guard: framework code that sets the tenant itself (`inTenant`) writes tenant tables on it. */
|
|
89
|
+
export function pipeSystemRaw(name?: string): DB {
|
|
90
|
+
const ctx = requireContext()
|
|
91
|
+
const resolvedName = name ?? ctx.instance.config.defaultDatabaseName()
|
|
92
|
+
|
|
93
|
+
const dbConfig = ctx.instance.config.database(resolvedName)
|
|
94
|
+
const bound = ctx.transactions.get(resolvedName)
|
|
95
|
+
if (ctx.instance.pool.isOverridden(resolvedName)) {
|
|
96
|
+
const conn = ctx.instance.pool.getOrCreate(dbConfig)
|
|
97
|
+
return conn.system ?? bound?.drizzle ?? conn.drizzle
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return ctx.instance.pool.getOrCreate(dbConfig).drizzle
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* A named cross-tenant read. The door must be declared under `doors` in config;
|
|
105
|
+
* generated migrations give the platform role (`rls.platformRole`) a SELECT
|
|
106
|
+
* policy on the door's table that opens only while `pipework.door` names it.
|
|
107
|
+
* `fn` runs in one transaction on the system connection, and the setting is
|
|
108
|
+
* set for that transaction only. The `db` it receives reads the door's table
|
|
109
|
+
* and non-tenant tables; any other tenant table, and any write to the door's
|
|
110
|
+
* table, is refused at build time. Columns are not limited: the door opens the
|
|
111
|
+
* whole table.
|
|
112
|
+
*
|
|
113
|
+
* Under collapsed test isolation the door runs on the test connection, each
|
|
114
|
+
* statement bracketed with the door open and the test-only system policy.
|
|
115
|
+
*/
|
|
116
|
+
export async function pipeDoor<T>(
|
|
117
|
+
name: string,
|
|
118
|
+
fn: (db: DB) => Promise<T>,
|
|
119
|
+
options?: { database?: string },
|
|
120
|
+
): Promise<T> {
|
|
121
|
+
const ctx = requireContext()
|
|
122
|
+
const config = ctx.instance.config
|
|
123
|
+
const declared = config.doors[name]
|
|
124
|
+
const resolvedName = options?.database ?? declared?.database ?? config.defaultDatabaseName()
|
|
125
|
+
const dbConfig = config.database(resolvedName)
|
|
126
|
+
|
|
127
|
+
if (dbConfig.rls?.platformRole === undefined) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`[pipework] pipe.door("${name}") needs a platform role: database "${resolvedName}" has no rls.platformRole.\n\n` +
|
|
130
|
+
' Doors replace the system channel\'s blanket RLS bypass. Fix: set `rls.platformRole` and `systemUrl`\n' +
|
|
131
|
+
` on "${resolvedName}" (a role that is not BYPASSRLS), then declare the door under \`doors\`.\n`,
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
if (declared === undefined) {
|
|
135
|
+
const names = Object.keys(config.doors)
|
|
136
|
+
throw new Error(
|
|
137
|
+
`[pipework] pipe.door("${name}"): no door by that name is declared.\n\n` +
|
|
138
|
+
` Declared doors: ${names.length > 0 ? names.join(', ') : '(none)'}\n` +
|
|
139
|
+
' Fix: declare it under `doors` in pipework.config.ts with its table and reason.\n',
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
if (declared.database !== resolvedName) {
|
|
143
|
+
throw new Error(
|
|
144
|
+
`[pipework] pipe.door("${name}", ..., { database: "${resolvedName}" }): the door is declared on database "${declared.database}".\n`,
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return runDoor(ctx.instance, dbConfig, declared, fn)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function runDoor<T>(
|
|
152
|
+
instance: import('../../core/pipework.js').Manifold,
|
|
153
|
+
dbConfig: import('../../core/config/load.js').ResolvedDatabase,
|
|
154
|
+
door: import('../../core/config/load.js').ResolvedDoor,
|
|
155
|
+
fn: (db: DB) => Promise<T>,
|
|
156
|
+
): Promise<T> {
|
|
157
|
+
if (instance.pool.isOverridden(dbConfig.name)) {
|
|
158
|
+
const conn = instance.pool.getOrCreate(dbConfig)
|
|
159
|
+
const handle = conn.door?.(door.name) ?? conn.system ?? conn.drizzle
|
|
160
|
+
return handle.transaction((tx: DB) => fn(createDoorDb(tx, door)))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const conn = instance.pool.getOrCreate(dbConfig, 'system')
|
|
164
|
+
return conn.drizzle.transaction(async (tx: DB) => {
|
|
165
|
+
await openDoor(tx, door.name)
|
|
166
|
+
return fn(createDoorDb(tx, door))
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function openDoor(tx: DB, name: string): Promise<void> {
|
|
171
|
+
await tx.execute(sql`SELECT set_config('pipework.door', ${name}, true)`)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* A framework door as a database handle, for pipework's own long-lived loops that have no Flow (the
|
|
176
|
+
* worker's claim and reap): every statement runs in its own transaction with the door open, and
|
|
177
|
+
* `transaction()` opens it first. `db` is the platform connection. The generated policy for the
|
|
178
|
+
* door decides what the statements may touch.
|
|
179
|
+
*/
|
|
180
|
+
export function frameworkDoorDb(db: DB, doorName: string): DB {
|
|
181
|
+
return new Proxy(db, {
|
|
182
|
+
get(target, prop, receiver) {
|
|
183
|
+
if (prop === 'execute') {
|
|
184
|
+
return (query: Parameters<DB['execute']>[0]) => target.transaction(async (tx: DB) => {
|
|
185
|
+
await openDoor(tx, doorName)
|
|
186
|
+
return tx.execute(query)
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
if (prop === 'transaction') {
|
|
190
|
+
return (fn: (tx: DB) => Promise<unknown>, config?: Parameters<DB['transaction']>[1]) =>
|
|
191
|
+
target.transaction(async (tx: DB) => {
|
|
192
|
+
await openDoor(tx, doorName)
|
|
193
|
+
return fn(tx)
|
|
194
|
+
}, config)
|
|
195
|
+
}
|
|
196
|
+
const value = Reflect.get(target, prop, receiver) as unknown
|
|
197
|
+
return typeof value === 'function' ? (value as (...args: unknown[]) => unknown).bind(target) : value
|
|
198
|
+
},
|
|
199
|
+
})
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Pipework's own doors (`config.frameworkDoors`), for its internal work only —
|
|
204
|
+
* deliberately not on `pipe`. Same transaction as `pipe.door`, but the door may
|
|
205
|
+
* also delete where it was declared to. Throws by name where the database is not
|
|
206
|
+
* in platform mode or the door is not declared (its substrate is not configured).
|
|
207
|
+
*/
|
|
208
|
+
export async function pipeFrameworkDoor<T>(name: string, fn: (db: DB) => Promise<T>, database?: string): Promise<T> {
|
|
209
|
+
const ctx = requireContext()
|
|
210
|
+
const door = ctx.instance.config.frameworkDoors[name]
|
|
211
|
+
if (door === undefined) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`[pipework] The framework door "${name}" is not declared: it exists only where the default database sets rls.platformRole and the blueprint enables its substrate.`,
|
|
214
|
+
)
|
|
215
|
+
}
|
|
216
|
+
return runDoor(ctx.instance, ctx.instance.config.database(database ?? door.database), door, fn)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
pipe.transaction = async function transaction<T>(
|
|
221
|
+
nameOrFn: string | ((tx: DB) => Promise<T>),
|
|
222
|
+
maybeFnOrConfig?: ((tx: DB) => Promise<T>) | TransactionConfig,
|
|
223
|
+
maybeConfig?: TransactionConfig,
|
|
224
|
+
): Promise<T> {
|
|
225
|
+
const ctx = requireContext()
|
|
226
|
+
|
|
227
|
+
let resolvedName: string
|
|
228
|
+
let fn: (tx: DB) => Promise<T>
|
|
229
|
+
let config: TransactionConfig | undefined
|
|
230
|
+
|
|
231
|
+
if (typeof nameOrFn === 'function') {
|
|
232
|
+
resolvedName = ctx.instance.config.defaultDatabaseName()
|
|
233
|
+
fn = nameOrFn
|
|
234
|
+
config = maybeFnOrConfig as TransactionConfig | undefined
|
|
235
|
+
} else {
|
|
236
|
+
resolvedName = nameOrFn
|
|
237
|
+
fn = maybeFnOrConfig as (tx: DB) => Promise<T>
|
|
238
|
+
config = maybeConfig
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const existingBound = ctx.transactions.get(resolvedName)
|
|
242
|
+
if (existingBound) {
|
|
243
|
+
verifyTransactionBinding(ctx, existingBound, resolvedName)
|
|
244
|
+
// Nested transactions use savepoints. Postgres does not support SET TRANSACTION
|
|
245
|
+
// ISOLATION LEVEL inside a savepoint — the savepoint inherits from the outer
|
|
246
|
+
// transaction. Drizzle's PgTransaction.transaction() does not accept config.
|
|
247
|
+
return existingBound.drizzle.transaction(async (nestedTx) => {
|
|
248
|
+
const childCtx = {
|
|
249
|
+
...ctx,
|
|
250
|
+
transactions: new Map(ctx.transactions),
|
|
251
|
+
}
|
|
252
|
+
childCtx.transactions.set(resolvedName, bindTransaction(ctx, resolvedName, nestedTx))
|
|
253
|
+
return runInContext(childCtx, () => fn(nestedTx))
|
|
254
|
+
})
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const dbConfig = ctx.instance.config.database(resolvedName)
|
|
258
|
+
// The app role and the context's locals, both for the same reason: this
|
|
259
|
+
// transaction is a NEW connection, so nothing the entry already set on its
|
|
260
|
+
// own connection reaches it. Without the locals `pipework.tenant_id` is
|
|
261
|
+
// unset and every policy under FORCE RLS reads zero rows; without the app
|
|
262
|
+
// role the statements run as the owner, where policies are inert. Both are
|
|
263
|
+
// what `executeInTransaction` does for the entry's own transaction — this is
|
|
264
|
+
// the same transaction, opened later.
|
|
265
|
+
const conn = ctx.instance.pool.getOrCreate(dbConfig, 'app')
|
|
266
|
+
|
|
267
|
+
return conn.drizzle.transaction(async (tx) => {
|
|
268
|
+
const childCtx = {
|
|
269
|
+
...ctx,
|
|
270
|
+
transactions: new Map(ctx.transactions),
|
|
271
|
+
}
|
|
272
|
+
childCtx.transactions.set(resolvedName, bindTransaction(ctx, resolvedName, tx))
|
|
273
|
+
await propagateLocals(tx, ctx, ctx.tenantConfig)
|
|
274
|
+
return runInContext(childCtx, () => fn(tx))
|
|
275
|
+
}, config)
|
|
276
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { sql } from '../query/index.js'
|
|
2
|
+
import { getTableColumns } from '../query/index.js'
|
|
3
|
+
import type { SQL, Table } from './types.js'
|
|
4
|
+
|
|
5
|
+
type ExcludedColumns<T extends Table> = {
|
|
6
|
+
[K in keyof T['_']['columns']]: SQL
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function excluded<T extends Table>(table: T): ExcludedColumns<T> {
|
|
10
|
+
const columns = getTableColumns(table)
|
|
11
|
+
const result: Record<string, SQL> = {}
|
|
12
|
+
for (const [key, col] of Object.entries(columns)) {
|
|
13
|
+
result[key] = sql.raw(`excluded."${col.name}"`)
|
|
14
|
+
}
|
|
15
|
+
return result as ExcludedColumns<T>
|
|
16
|
+
}
|