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,24 @@
|
|
|
1
|
+
// The directory relative `migrations`/`schema` paths resolve against (D1,
|
|
2
|
+
// subseam audit 2026-07-16). Set from the config file's directory immediately
|
|
3
|
+
// before the config module is imported; consumed exactly once by loadConfig.
|
|
4
|
+
// A module-level slot rather than a parameter because the config file itself
|
|
5
|
+
// calls createManifold() during its own import — there is no call chain to
|
|
6
|
+
// thread the value through.
|
|
7
|
+
|
|
8
|
+
let configBaseDir: string | undefined
|
|
9
|
+
|
|
10
|
+
export function setConfigBaseDir(dir: string): void {
|
|
11
|
+
configBaseDir = dir
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Read-and-clear. Undefined when no config import is in flight — directly-constructed configs resolve against process.cwd(). */
|
|
15
|
+
export function consumeConfigBaseDir(): string | undefined {
|
|
16
|
+
const dir = configBaseDir
|
|
17
|
+
configBaseDir = undefined
|
|
18
|
+
return dir
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Cleared in the importer's finally: an ESM cache hit skips loadConfig, and the stale slot must not leak into a later directly-constructed loadConfig. */
|
|
22
|
+
export function clearConfigBaseDir(): void {
|
|
23
|
+
configBaseDir = undefined
|
|
24
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { resolve, dirname } from 'node:path'
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import type { Manifold } from '../pipework.js'
|
|
4
|
+
import { ConfigError } from './errors.js'
|
|
5
|
+
import { importConfig } from './import-config.js'
|
|
6
|
+
import { registerTsResolveHooks } from './ts-inline-hooks.js'
|
|
7
|
+
|
|
8
|
+
export { registerTsResolveHooks }
|
|
9
|
+
|
|
10
|
+
const CONFIG_FILENAME = 'pipework.config.ts'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Loads the Manifold for `cwd` (default `process.cwd()`).
|
|
14
|
+
*
|
|
15
|
+
* Normally the config is found by walking up from `cwd` for
|
|
16
|
+
* `pipework.config.ts`. Setting `PIPEWORK_CONFIG` names the config file to
|
|
17
|
+
* load instead — resolved against `process.cwd()` when relative, and a
|
|
18
|
+
* ConfigError when it names a file that does not exist. Nothing in pipework
|
|
19
|
+
* sets or defaults it; only a deliberate caller (a test runner pointing a
|
|
20
|
+
* fork at a slim test-only manifold) gets the override. Discovery itself
|
|
21
|
+
* leaves the variable alone; the test fork's `discoverForTestFork` consumes
|
|
22
|
+
* it after loading, so it never travels to processes a test spawns.
|
|
23
|
+
*/
|
|
24
|
+
export async function discoverInstance(cwd?: string): Promise<Manifold> {
|
|
25
|
+
const start = cwd ?? process.cwd()
|
|
26
|
+
const override = process.env['PIPEWORK_CONFIG']
|
|
27
|
+
const configPath = override === undefined ? findConfig(start) : resolveOverride(override)
|
|
28
|
+
|
|
29
|
+
if (configPath === null) {
|
|
30
|
+
throw new ConfigError(
|
|
31
|
+
`No ${CONFIG_FILENAME} found in ${start} or any parent directory.`,
|
|
32
|
+
`Create one with \`pipework init\`, or see the getting-started guide.`,
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
registerTsResolveHooks()
|
|
37
|
+
|
|
38
|
+
return importConfig(configPath)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function resolveOverride(value: string): string {
|
|
42
|
+
const path = resolve(process.cwd(), value)
|
|
43
|
+
if (!existsSync(path)) {
|
|
44
|
+
throw new ConfigError(
|
|
45
|
+
`PIPEWORK_CONFIG names a config file that does not exist: ${path}`,
|
|
46
|
+
`Unset PIPEWORK_CONFIG to discover ${CONFIG_FILENAME} normally, or point it at a file that exists.`,
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
return path
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function findConfig(from: string): string | null {
|
|
53
|
+
let dir = resolve(from)
|
|
54
|
+
let parent = dirname(dir)
|
|
55
|
+
while (dir !== parent) {
|
|
56
|
+
const candidate = resolve(dir, CONFIG_FILENAME)
|
|
57
|
+
if (existsSync(candidate)) return candidate
|
|
58
|
+
dir = parent
|
|
59
|
+
parent = dirname(dir)
|
|
60
|
+
}
|
|
61
|
+
const root = resolve(dir, CONFIG_FILENAME)
|
|
62
|
+
if (existsSync(root)) return root
|
|
63
|
+
return null
|
|
64
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { EnvDefs, EnvVarDef } from './env-types.js'
|
|
2
|
+
import type { Environment } from './schema.js'
|
|
3
|
+
import { ConfigError } from './errors.js'
|
|
4
|
+
|
|
5
|
+
const TRUTHY = new Set(['true', '1', 'yes'])
|
|
6
|
+
const FALSY = new Set(['false', '0', 'no'])
|
|
7
|
+
|
|
8
|
+
export function resolveEnvVars(
|
|
9
|
+
defs: EnvDefs | Record<string, EnvVarDef>,
|
|
10
|
+
environment: Environment,
|
|
11
|
+
): Record<string, unknown> {
|
|
12
|
+
const result: Record<string, unknown> = {}
|
|
13
|
+
const errors: string[] = []
|
|
14
|
+
|
|
15
|
+
for (const [name, def] of Object.entries(defs)) {
|
|
16
|
+
const raw = readRaw(name, def, environment)
|
|
17
|
+
|
|
18
|
+
if (raw === null) {
|
|
19
|
+
if (def.default !== undefined) {
|
|
20
|
+
result[name] = def.type === 'string[]' ? [...def.default] : def.default
|
|
21
|
+
continue
|
|
22
|
+
}
|
|
23
|
+
if (def.required === true) {
|
|
24
|
+
errors.push(def.sensitive === true
|
|
25
|
+
? ` ${name}: Required but not set. (value redacted — marked sensitive)`
|
|
26
|
+
: ` ${name}: Required but not set.`)
|
|
27
|
+
continue
|
|
28
|
+
}
|
|
29
|
+
errors.push(` ${name}: No value set and no default provided.`)
|
|
30
|
+
continue
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
result[name] = coerce(raw, def)
|
|
35
|
+
} catch (err) {
|
|
36
|
+
errors.push(` ${name}: ${(err as Error).message}`)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (errors.length > 0) {
|
|
41
|
+
throw new ConfigError(
|
|
42
|
+
`Environment validation failed (${errors.length} error${errors.length > 1 ? 's' : ''}):\n\n${errors.join('\n')}`,
|
|
43
|
+
'Set these in your .env file or environment.',
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return result
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function readRaw(name: string, def: EnvVarDef, environment: Environment): string | null {
|
|
51
|
+
const envValue = process.env[name]
|
|
52
|
+
if (envValue !== undefined && envValue !== '') return envValue
|
|
53
|
+
|
|
54
|
+
const envSpecific = def.defaults?.[environment]
|
|
55
|
+
if (envSpecific !== undefined && envSpecific !== '') return envSpecific
|
|
56
|
+
|
|
57
|
+
return null
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function coerce(raw: string, def: EnvVarDef): unknown {
|
|
61
|
+
switch (def.type) {
|
|
62
|
+
case 'string':
|
|
63
|
+
return raw
|
|
64
|
+
|
|
65
|
+
case 'number': {
|
|
66
|
+
const n = Number(raw)
|
|
67
|
+
if (Number.isNaN(n)) {
|
|
68
|
+
const display = def.sensitive === true ? '(redacted)' : `"${raw}"`
|
|
69
|
+
throw new Error(`Expected a number, got ${display}.`)
|
|
70
|
+
}
|
|
71
|
+
return n
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
case 'boolean': {
|
|
75
|
+
const lower = raw.toLowerCase()
|
|
76
|
+
if (TRUTHY.has(lower)) return true
|
|
77
|
+
if (FALSY.has(lower)) return false
|
|
78
|
+
const display = def.sensitive === true ? '(redacted)' : `"${raw}"`
|
|
79
|
+
throw new Error(`Expected a boolean (true/false/1/0/yes/no), got ${display}.`)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
case 'string[]': {
|
|
83
|
+
const sep = def.separator ?? ','
|
|
84
|
+
return raw.split(sep).map(s => s.trim()).filter(s => s !== '')
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { Environment } from './schema.js'
|
|
2
|
+
|
|
3
|
+
interface EnvVarBase {
|
|
4
|
+
/** Redact the resolved value from logs and error messages (tokens, secrets). */
|
|
5
|
+
readonly sensitive?: boolean | undefined
|
|
6
|
+
/**
|
|
7
|
+
* Per-environment fallback values, keyed by environment name. Always given
|
|
8
|
+
* as strings (they take the same parse path as a real environment variable);
|
|
9
|
+
* a variable that is set in the environment wins over any default here.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* PORT: { type: 'number', defaults: { development: '3000', test: '0' } }
|
|
13
|
+
*/
|
|
14
|
+
readonly defaults?: Partial<Record<Environment, string>> | undefined
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A string environment variable — resolved verbatim.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* S3_BUCKET: { type: 'string', required: true }
|
|
22
|
+
*/
|
|
23
|
+
export interface StringEnvVar extends EnvVarBase {
|
|
24
|
+
readonly type: 'string'
|
|
25
|
+
/** Fail startup when unset and no default applies. */
|
|
26
|
+
readonly required?: boolean | undefined
|
|
27
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
28
|
+
readonly default?: string | undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A number environment variable — parsed with a loud error on a non-numeric value.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* PORT: { type: 'number', default: 3000 }
|
|
36
|
+
*/
|
|
37
|
+
export interface NumberEnvVar extends EnvVarBase {
|
|
38
|
+
readonly type: 'number'
|
|
39
|
+
/** Fail startup when unset and no default applies. */
|
|
40
|
+
readonly required?: boolean | undefined
|
|
41
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
42
|
+
readonly default?: number | undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A boolean environment variable — accepts true/false/1/0, loud error otherwise.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* FEATURE_GRAPH: { type: 'boolean', default: false }
|
|
50
|
+
*/
|
|
51
|
+
export interface BooleanEnvVar extends EnvVarBase {
|
|
52
|
+
readonly type: 'boolean'
|
|
53
|
+
/** Fail startup when unset and no default applies. */
|
|
54
|
+
readonly required?: boolean | undefined
|
|
55
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
56
|
+
readonly default?: boolean | undefined
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A string-array environment variable — the raw value split on `separator`
|
|
61
|
+
* (default `,`), each element trimmed.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* CORS_ORIGINS: { type: 'string[]', separator: ',', default: [] }
|
|
65
|
+
*/
|
|
66
|
+
export interface StringArrayEnvVar extends EnvVarBase {
|
|
67
|
+
readonly type: 'string[]'
|
|
68
|
+
/** Split character for the raw value (default ','). */
|
|
69
|
+
readonly separator?: string | undefined
|
|
70
|
+
/** Fail startup when unset and no default applies. */
|
|
71
|
+
readonly required?: boolean | undefined
|
|
72
|
+
/** Environment-independent fallback; `defaults` (per-environment) wins over this. */
|
|
73
|
+
readonly default?: readonly string[] | undefined
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* One declared environment variable: its type, whether it is required, its
|
|
78
|
+
* fallbacks, and whether the value is sensitive. Declared under the `env`
|
|
79
|
+
* blueprint field; resolved once at config load and exposed typed on
|
|
80
|
+
* `manifold.env` — the canonical replacement for ad-hoc `process.env` reads.
|
|
81
|
+
*/
|
|
82
|
+
export type EnvVarDef = StringEnvVar | NumberEnvVar | BooleanEnvVar | StringArrayEnvVar
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The `env` blueprint field: environment-variable declarations keyed by
|
|
86
|
+
* variable name. Passing this map to `createManifold` is what types
|
|
87
|
+
* `manifold.env`.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* export default createManifold({
|
|
91
|
+
* databases: { app: { url: 'DATABASE_URL', testUrl: 'DATABASE_URL_TEST' } },
|
|
92
|
+
* env: {
|
|
93
|
+
* PORT: { type: 'number', defaults: { development: '3000', test: '0' } },
|
|
94
|
+
* S3_BUCKET: { type: 'string', required: true },
|
|
95
|
+
* API_TOKEN: { type: 'string', required: true, sensitive: true },
|
|
96
|
+
* CORS_ORIGINS: { type: 'string[]', default: [] },
|
|
97
|
+
* },
|
|
98
|
+
* })
|
|
99
|
+
* // manifold.env.PORT → number
|
|
100
|
+
* // manifold.env.S3_BUCKET → string
|
|
101
|
+
* // manifold.env.CORS_ORIGINS → string[]
|
|
102
|
+
*/
|
|
103
|
+
export type EnvDefs = Record<string, EnvVarDef>
|
|
104
|
+
|
|
105
|
+
/** The resolved runtime type of one declaration: 'string' → string, 'number' → number, 'boolean' → boolean, 'string[]' → string[]. */
|
|
106
|
+
export type ResolvedEnvType<T extends EnvVarDef> =
|
|
107
|
+
T extends { readonly type: 'string' } ? string :
|
|
108
|
+
T extends { readonly type: 'number' } ? number :
|
|
109
|
+
T extends { readonly type: 'boolean' } ? boolean :
|
|
110
|
+
T extends { readonly type: 'string[]' } ? string[] :
|
|
111
|
+
never
|
|
112
|
+
|
|
113
|
+
/** Maps a declaration map to the shape of `manifold.env` — each key typed by its declared `type`. */
|
|
114
|
+
export type ResolveEnvDefs<T extends EnvDefs> = {
|
|
115
|
+
readonly [K in keyof T]: ResolvedEnvType<T[K]>
|
|
116
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs'
|
|
2
|
+
import { resolve, dirname } from 'node:path'
|
|
3
|
+
|
|
4
|
+
const ENV_FILES = ['.env.test.local', '.env.test', '.env.local', '.env']
|
|
5
|
+
|
|
6
|
+
export function loadEnvFiles(cwd?: string): void {
|
|
7
|
+
const start = cwd ?? process.cwd()
|
|
8
|
+
const envDir = findEnvDir(start) ?? start
|
|
9
|
+
|
|
10
|
+
// First-set wins (loadFile never overwrites), so the machine-local,
|
|
11
|
+
// never-committed `.local` variant of each tier takes precedence over the
|
|
12
|
+
// committed file — the standard dotenv convention.
|
|
13
|
+
for (const file of ENV_FILES) {
|
|
14
|
+
loadFile(resolve(envDir, file))
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function findEnvDir(from: string): string | null {
|
|
19
|
+
const hasEnvFile = (dir: string): boolean => ENV_FILES.some(f => existsSync(resolve(dir, f)))
|
|
20
|
+
let dir = resolve(from)
|
|
21
|
+
let parent = dirname(dir)
|
|
22
|
+
while (dir !== parent) {
|
|
23
|
+
if (hasEnvFile(dir)) return dir
|
|
24
|
+
dir = parent
|
|
25
|
+
parent = dirname(dir)
|
|
26
|
+
}
|
|
27
|
+
if (hasEnvFile(dir)) return dir
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function loadFile(path: string): void {
|
|
32
|
+
if (!existsSync(path)) return
|
|
33
|
+
|
|
34
|
+
const content = readFileSync(path, 'utf-8')
|
|
35
|
+
for (const line of content.split('\n')) {
|
|
36
|
+
const trimmed = line.trim()
|
|
37
|
+
if (trimmed === '' || trimmed.startsWith('#')) continue
|
|
38
|
+
|
|
39
|
+
const eqIdx = trimmed.indexOf('=')
|
|
40
|
+
if (eqIdx === -1) continue
|
|
41
|
+
|
|
42
|
+
const key = trimmed.slice(0, eqIdx).trim()
|
|
43
|
+
if (key === '') continue
|
|
44
|
+
|
|
45
|
+
if (process.env[key] !== undefined) continue
|
|
46
|
+
|
|
47
|
+
let value = trimmed.slice(eqIdx + 1).trim()
|
|
48
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
49
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
50
|
+
value = value.slice(1, -1)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
process.env[key] = value
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { dirname } from 'node:path'
|
|
2
|
+
import { pathToFileURL } from 'node:url'
|
|
3
|
+
import type { Manifold } from '../pipework.js'
|
|
4
|
+
import { ConfigError } from './errors.js'
|
|
5
|
+
import { setConfigBaseDir, clearConfigBaseDir } from './base-dir.js'
|
|
6
|
+
|
|
7
|
+
// The single import-and-validate chokepoint for pipework.config.ts. Every
|
|
8
|
+
// importer (discoverInstance, the vitest config resolver, the eslint config
|
|
9
|
+
// resolver) goes through here so relative `migrations`/`schema` paths always
|
|
10
|
+
// resolve against the config file's directory, whichever entry path loads the
|
|
11
|
+
// config first in a process.
|
|
12
|
+
export async function importConfig(configPath: string): Promise<Manifold> {
|
|
13
|
+
setConfigBaseDir(dirname(configPath))
|
|
14
|
+
try {
|
|
15
|
+
const mod: Record<string, unknown> = await import(pathToFileURL(configPath).href)
|
|
16
|
+
const exported: unknown = mod['default'] ?? mod
|
|
17
|
+
|
|
18
|
+
if (!isManifold(exported)) {
|
|
19
|
+
throw new ConfigError(
|
|
20
|
+
`pipework.config.ts must export a Pipework instance as its default export.`,
|
|
21
|
+
`Your config should look like:\n\n` +
|
|
22
|
+
` import { createManifold } from 'pipework'\n\n` +
|
|
23
|
+
` export default createManifold({\n` +
|
|
24
|
+
` databases: { app: { url: 'DATABASE_URL' } },\n` +
|
|
25
|
+
` })\n`,
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return exported
|
|
30
|
+
} finally {
|
|
31
|
+
// An ESM cache hit re-enters here without re-running loadConfig (the
|
|
32
|
+
// consume). Clear unconditionally so the slot cannot leak into a later
|
|
33
|
+
// directly-constructed loadConfig.
|
|
34
|
+
clearConfigBaseDir()
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function isManifold(v: unknown): v is Manifold {
|
|
39
|
+
return typeof v === 'object' && v !== null && 'pool' in v && 'config' in v
|
|
40
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { trunkConfigSchema, type Blueprint, type DatabaseConfig, type TestConfig, type Environment, type IsolationStrategy, type ObservabilityConfig, type ModuleConfig, type VitestConfig, type VitestModuleConfig, type VitestProfileConfig, type CoverageConfig } from './schema.js'
|
|
2
|
+
export { loadConfig, type ResolvedConfig, type ResolvedDatabase, type ResolvedObservability } from './load.js'
|
|
3
|
+
export { resolveEnvironment } from './resolve.js'
|
|
4
|
+
export { ConfigError } from './errors.js'
|
|
5
|
+
export { discoverInstance, findConfig } from './discover.js'
|
|
6
|
+
export { loadEnvFiles } from './env.js'
|
|
7
|
+
export { resolveEnvVars } from './env-resolve.js'
|
|
8
|
+
export type { EnvVarDef, EnvDefs, ResolveEnvDefs, StringEnvVar, NumberEnvVar, BooleanEnvVar, StringArrayEnvVar } from './env-types.js'
|