pipework 0.251.0 → 0.252.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/core/config/load.d.ts +2 -0
- package/dist/core/config/load.d.ts.map +1 -1
- package/dist/core/config/load.js +1 -0
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/namespace.d.ts +1 -0
- package/dist/core/config/namespace.d.ts.map +1 -1
- package/dist/core/config/schema.d.ts +2 -0
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +1 -0
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/surface/types.d.ts +1 -0
- package/dist/core/surface/types.d.ts.map +1 -1
- package/dist/data/db/namespace.d.ts +3 -0
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/db/namespace.js +3 -0
- package/dist/data/db/namespace.js.map +1 -1
- package/dist/data/db/pool.d.ts.map +1 -1
- package/dist/data/db/pool.js +6 -1
- package/dist/data/db/pool.js.map +1 -1
- package/dist/data/db/query-label.d.ts +5 -0
- package/dist/data/db/query-label.d.ts.map +1 -0
- package/dist/data/db/query-label.js +11 -0
- package/dist/data/db/query-label.js.map +1 -0
- package/dist/data/db/query-watch.d.ts +21 -0
- package/dist/data/db/query-watch.d.ts.map +1 -0
- package/dist/data/db/query-watch.js +90 -0
- package/dist/data/db/query-watch.js.map +1 -0
- package/dist/data/query/postgres-js/driver.js +1 -1
- package/dist/data/query/postgres-js/driver.js.map +1 -1
- package/dist/data/query/postgres-js/session.d.ts +5 -1
- package/dist/data/query/postgres-js/session.d.ts.map +1 -1
- package/dist/data/query/postgres-js/session.js +16 -11
- package/dist/data/query/postgres-js/session.js.map +1 -1
- package/dist/data/query/utils.d.ts +2 -0
- package/dist/data/query/utils.d.ts.map +1 -1
- package/dist/data/query/utils.js.map +1 -1
- package/dist/infra/credits/schema.d.ts +1 -1
- package/dist/test/plugin.d.ts.map +1 -1
- package/dist/test/plugin.js +10 -4
- package/dist/test/plugin.js.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 +854 -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,95 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import { readFileSync } from 'node:fs'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Runs `pnpm install` and then reads back what actually landed in node_modules.
|
|
7
|
+
* pnpm asks for confirmation before purging a modules directory; with no TTY it
|
|
8
|
+
* takes the abort branch and still exits 0, so exit status alone cannot tell a
|
|
9
|
+
* real install from a no-op. The version read after the step is the verdict.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const PURGE_PROMPT_ENV = { npm_config_confirm_modules_purge: 'false' } as const
|
|
13
|
+
|
|
14
|
+
export function readInstalledPipeworkVersion(cwd: string): string | undefined {
|
|
15
|
+
try {
|
|
16
|
+
const raw = readFileSync(join(cwd, 'node_modules', 'pipework', 'package.json'), 'utf-8')
|
|
17
|
+
const pkg = JSON.parse(raw) as { version?: unknown }
|
|
18
|
+
return typeof pkg.version === 'string' ? pkg.version : undefined
|
|
19
|
+
} catch {
|
|
20
|
+
return undefined
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* True when `installed` is at least `required`. A version either side that is
|
|
26
|
+
* not a plain `x.y.z` (a workspace link, a tag) is not something this can
|
|
27
|
+
* judge, so it passes — the point is catching an install that did not run.
|
|
28
|
+
*/
|
|
29
|
+
export function isAtLeastVersion(installed: string, required: string): boolean {
|
|
30
|
+
const a = parseVersion(installed)
|
|
31
|
+
const b = parseVersion(required)
|
|
32
|
+
if (a === undefined || b === undefined) return true
|
|
33
|
+
if (a.major !== b.major) return a.major > b.major
|
|
34
|
+
if (a.minor !== b.minor) return a.minor > b.minor
|
|
35
|
+
return a.patch >= b.patch
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface Version {
|
|
39
|
+
readonly major: number
|
|
40
|
+
readonly minor: number
|
|
41
|
+
readonly patch: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function parseVersion(value: string): Version | undefined {
|
|
45
|
+
const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(value.trim())
|
|
46
|
+
if (match === null) return undefined
|
|
47
|
+
return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function installMismatchMessage(
|
|
51
|
+
required: string,
|
|
52
|
+
installed: string | undefined,
|
|
53
|
+
cwd: string,
|
|
54
|
+
): string {
|
|
55
|
+
const found = installed === undefined
|
|
56
|
+
? 'node_modules/pipework is not there at all'
|
|
57
|
+
: `node_modules/pipework is at ${installed}`
|
|
58
|
+
return (
|
|
59
|
+
`pnpm install exited 0 but did not install pipework@^${required}.\n\n` +
|
|
60
|
+
` ${found}.\n\n` +
|
|
61
|
+
` With no TTY, pnpm aborts on its modules-purge confirmation prompt and\n` +
|
|
62
|
+
` still exits 0. Pipework sets npm_config_confirm_modules_purge=false to\n` +
|
|
63
|
+
` answer it; something else stopped the install. Run pnpm install directly\n` +
|
|
64
|
+
` in ${cwd} to see what it asks.\n`
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface PnpmInstallOptions {
|
|
69
|
+
readonly cwd: string
|
|
70
|
+
/** The pipework version the generated package.json asks for, as plain `x.y.z`. */
|
|
71
|
+
readonly requiredPipeworkVersion: string
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type PnpmInstallOutcome =
|
|
75
|
+
| { readonly ok: true; readonly installedPipeworkVersion: string }
|
|
76
|
+
| { readonly ok: false; readonly message: string }
|
|
77
|
+
|
|
78
|
+
export function runPnpmInstall(options: PnpmInstallOptions): PnpmInstallOutcome {
|
|
79
|
+
try {
|
|
80
|
+
execSync('pnpm install', {
|
|
81
|
+
cwd: options.cwd,
|
|
82
|
+
stdio: 'inherit',
|
|
83
|
+
env: { ...process.env, PIPEWORK_SKIP_GUARD: '1', ...PURGE_PROMPT_ENV },
|
|
84
|
+
})
|
|
85
|
+
} catch {
|
|
86
|
+
return { ok: false, message: 'pnpm install failed. Check the output above for details.' }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const installed = readInstalledPipeworkVersion(options.cwd)
|
|
90
|
+
if (installed === undefined || !isAtLeastVersion(installed, options.requiredPipeworkVersion)) {
|
|
91
|
+
return { ok: false, message: installMismatchMessage(options.requiredPipeworkVersion, installed, options.cwd) }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return { ok: true, installedPipeworkVersion: installed }
|
|
95
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SyncResult } from '../../../workspace/sync.js'
|
|
2
|
+
import { warn } from '../../output.js'
|
|
3
|
+
|
|
4
|
+
export function reportRemoved(result: Pick<SyncResult, 'removed'>): void {
|
|
5
|
+
for (const gone of result.removed) {
|
|
6
|
+
warn(`Removed ${gone.field} entry "${gone.name}" from ${gone.file}.`)
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import { sync as syncWorkspace } from '../../workspace/sync.js'
|
|
3
|
+
import { loadConfig } from './shared/load-config.js'
|
|
4
|
+
import { reportRemoved } from './shared/report-removed.js'
|
|
5
|
+
import { info, success, warn } from '../output.js'
|
|
6
|
+
|
|
7
|
+
export async function syncCommand(cwd: string): Promise<void> {
|
|
8
|
+
const { config, appName } = await loadConfig(resolve(cwd))
|
|
9
|
+
|
|
10
|
+
const result = syncWorkspace({
|
|
11
|
+
config,
|
|
12
|
+
cwd: resolve(cwd),
|
|
13
|
+
appName,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
if (result.written === 0) {
|
|
17
|
+
info('Workspace already up to date.')
|
|
18
|
+
} else {
|
|
19
|
+
for (const file of result.files) {
|
|
20
|
+
if (result.written > 0) {
|
|
21
|
+
info(` ${file.relativePath}`)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
success(`Synced ${String(result.written)} file(s), ${String(result.skipped)} unchanged.`)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
reportRemoved(result)
|
|
28
|
+
|
|
29
|
+
if (result.files.length === 0) {
|
|
30
|
+
warn('No files generated. Check your config for dependencies and modules.')
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import { dirname } from 'node:path'
|
|
3
|
+
import { bold, error, info, success, warn } from '../output.js'
|
|
4
|
+
import type { ScopeMode } from '../../workspace/affected.js'
|
|
5
|
+
import { resolveAffected } from '../../workspace/affected.js'
|
|
6
|
+
import { findConfig } from '../../core/config/discover.js'
|
|
7
|
+
import { resolveModules, type ResolvedModule } from '../../workspace/discover.js'
|
|
8
|
+
import { shardArg, type Shard } from './shard.js'
|
|
9
|
+
|
|
10
|
+
export interface TestOptions {
|
|
11
|
+
cwd: string
|
|
12
|
+
db?: string | undefined
|
|
13
|
+
vitestArgs: string[]
|
|
14
|
+
scope?: ScopeMode | undefined
|
|
15
|
+
suite?: string | undefined
|
|
16
|
+
/** `--fast` — run only the fast test tiers (issue #325). */
|
|
17
|
+
fast?: boolean | undefined
|
|
18
|
+
reap?: boolean | undefined
|
|
19
|
+
/** `--shard i/n`: run part i of n disjoint parts of the selected files. */
|
|
20
|
+
shard?: Shard | undefined
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function test(options: TestOptions): Promise<void> {
|
|
24
|
+
const { discoverInstance } = await import('../../core/config/discover.js')
|
|
25
|
+
const { setupTestDatabases, teardownTestDatabases } = await import('../../test/setup.js')
|
|
26
|
+
|
|
27
|
+
process.env['PIPEWORK_ENV'] = 'test'
|
|
28
|
+
const instance = await discoverInstance(options.cwd)
|
|
29
|
+
|
|
30
|
+
if (options.reap === true) {
|
|
31
|
+
const { reapConfiguredTestDatabases } = await import('../../test/reap.js')
|
|
32
|
+
info('Reaping orphan test databases...')
|
|
33
|
+
try {
|
|
34
|
+
const result = await reapConfiguredTestDatabases(instance)
|
|
35
|
+
success(`Reaped ${String(result.droppedDatabases.length)} orphan test database(s).`)
|
|
36
|
+
// #391: a name in the prefix that pipework did not write is left alone. Saying
|
|
37
|
+
// which ones is the difference between a deliberate skip and a silent one.
|
|
38
|
+
if (result.skippedDatabases.length > 0) {
|
|
39
|
+
warn(`Left alone — not created by pipework (${String(result.skippedDatabases.length)}):`)
|
|
40
|
+
for (const datname of result.skippedDatabases) {
|
|
41
|
+
warn(` ${datname}`)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
} finally {
|
|
45
|
+
await instance.pool.closeAll()
|
|
46
|
+
}
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let emptyBasis = ''
|
|
51
|
+
const projectArgs = buildProjectArgs(options, instance, (basis) => { emptyBasis = basis })
|
|
52
|
+
if (projectArgs === null) {
|
|
53
|
+
const filters = targetedFilters(options.vitestArgs)
|
|
54
|
+
if (filters.length > 0) {
|
|
55
|
+
// A named path that did not run must not look like a pass (#337).
|
|
56
|
+
error(`Nothing ran: no affected module in scope (${emptyBasis}), so ${filters.join(' ')} did not run. Run with --all to test it regardless.`)
|
|
57
|
+
process.exitCode = 1
|
|
58
|
+
} else {
|
|
59
|
+
success('No affected modules — nothing to test')
|
|
60
|
+
}
|
|
61
|
+
await instance.pool.closeAll()
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// A selection whose every project opts out of the database (`database:
|
|
66
|
+
// false` on the profile/module/workspace chain) runs without provisioning
|
|
67
|
+
// one — and without demanding DB env, which config resolution defers to
|
|
68
|
+
// first URL access for exactly this path.
|
|
69
|
+
let needsDatabase = projectArgs.needsDatabase
|
|
70
|
+
if (needsDatabase && options.shard !== undefined && projectArgs.databaseByProject !== undefined) {
|
|
71
|
+
const specs = await shardSpecifications(options.cwd, options.shard, projectArgs.args, targetedFilters(options.vitestArgs))
|
|
72
|
+
if (specs !== null) {
|
|
73
|
+
needsDatabase = shardNeedsDatabase(specs, projectArgs.databaseByProject)
|
|
74
|
+
const owned = [...new Set(specs.map(spec => spec.project))].sort()
|
|
75
|
+
info(`Shard ${shardArg(options.shard)} runs ${String(specs.length)} file(s) in ${String(owned.length)} project(s): ${owned.join(', ') || '(none)'}`)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (needsDatabase) {
|
|
79
|
+
info('Setting up test databases...')
|
|
80
|
+
await setupTestDatabases(instance)
|
|
81
|
+
} else {
|
|
82
|
+
info('Selected projects declare no database use — skipping database setup')
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Tear down on signals too, not just clean exit: a default SIGINT/SIGTERM
|
|
86
|
+
// would kill this process before `finally` runs, leaking the per-run
|
|
87
|
+
// databases. `teardownTestDatabases` is idempotent and the shared promise
|
|
88
|
+
// makes the signal handler wait for an in-flight teardown before exiting.
|
|
89
|
+
let cleanup: Promise<void> | null = null
|
|
90
|
+
const teardownOnce = (): Promise<void> => {
|
|
91
|
+
cleanup ??= needsDatabase ? teardownTestDatabases().catch(() => {}) : Promise.resolve()
|
|
92
|
+
return cleanup
|
|
93
|
+
}
|
|
94
|
+
process.once('SIGINT', () => { void teardownOnce().finally(() => process.exit(130)) })
|
|
95
|
+
process.once('SIGTERM', () => { void teardownOnce().finally(() => process.exit(143)) })
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
const shardArgs = options.shard === undefined ? [] : [`--shard=${shardArg(options.shard)}`]
|
|
99
|
+
const args = ['vitest', 'run', ...projectArgs.args, ...shardArgs, ...options.vitestArgs]
|
|
100
|
+
info(`Running: ${bold(args.join(' '))}`)
|
|
101
|
+
|
|
102
|
+
const result = spawnSync('npx', args, {
|
|
103
|
+
cwd: options.cwd,
|
|
104
|
+
stdio: 'inherit',
|
|
105
|
+
env: { ...process.env, PIPEWORK_ENV: 'test' },
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
if (result.error !== undefined) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
`Failed to spawn vitest: ${result.error.message}\n\n` +
|
|
111
|
+
` Ensure vitest is installed as a devDependency.\n` +
|
|
112
|
+
` Example: ${bold('pnpm add -D vitest')}\n`,
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (result.status !== 0) {
|
|
117
|
+
process.exitCode = result.status ?? 1
|
|
118
|
+
} else {
|
|
119
|
+
success('Tests completed.')
|
|
120
|
+
}
|
|
121
|
+
} finally {
|
|
122
|
+
if (needsDatabase) {
|
|
123
|
+
info('Tearing down test databases...')
|
|
124
|
+
}
|
|
125
|
+
await teardownOnce()
|
|
126
|
+
await instance.pool.closeAll()
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Path/name filters in vitestArgs: args not starting with `-` and not the value of a preceding `--flag value`. */
|
|
131
|
+
export function targetedFilters(vitestArgs: readonly string[]): string[] {
|
|
132
|
+
return vitestArgs.filter((arg, i) => {
|
|
133
|
+
if (arg.startsWith('-')) return false
|
|
134
|
+
const prev = vitestArgs[i - 1]
|
|
135
|
+
return !(prev !== undefined && prev.startsWith('-') && !prev.includes('='))
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export interface ProjectSelection {
|
|
140
|
+
/** `--project` filter args for vitest (empty = run unfiltered). */
|
|
141
|
+
readonly args: string[]
|
|
142
|
+
/**
|
|
143
|
+
* Whether any selected project uses a database, per the `database` flag
|
|
144
|
+
* chain (profile ?? module ?? workspace ?? true). False lets `test` skip
|
|
145
|
+
* database setup — and, with URL resolution deferred to first access, skip
|
|
146
|
+
* demanding DB env entirely.
|
|
147
|
+
*/
|
|
148
|
+
readonly needsDatabase: boolean
|
|
149
|
+
/** Per selected project: does it use a database. Absent for unfiltered runs. */
|
|
150
|
+
readonly databaseByProject?: ReadonlyMap<string, boolean>
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface ShardSpec {
|
|
154
|
+
readonly file: string
|
|
155
|
+
readonly project: string
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The (file, project) pairs this shard runs, found with vitest's own file glob
|
|
160
|
+
* and shard sequencer so the answer is the split the run will make. Null when it
|
|
161
|
+
* cannot be computed; the caller then assumes every selected project runs.
|
|
162
|
+
*/
|
|
163
|
+
export async function shardSpecifications(
|
|
164
|
+
cwd: string,
|
|
165
|
+
shard: Shard,
|
|
166
|
+
projectArgs: readonly string[],
|
|
167
|
+
filters: readonly string[],
|
|
168
|
+
): Promise<ShardSpec[] | null> {
|
|
169
|
+
try {
|
|
170
|
+
const { createVitest } = await import('vitest/node')
|
|
171
|
+
const project = projectArgs.filter(arg => arg !== '--project')
|
|
172
|
+
const ctx = await createVitest('test', { root: cwd, watch: false, project, shard: shardArg(shard) })
|
|
173
|
+
try {
|
|
174
|
+
const specs = await ctx.globTestSpecifications([...filters])
|
|
175
|
+
const Sequencer = ctx.config.sequence.sequencer
|
|
176
|
+
const mine = await new Sequencer(ctx).shard(specs)
|
|
177
|
+
return mine.map(spec => ({ file: spec.moduleId, project: spec.project.name }))
|
|
178
|
+
} finally {
|
|
179
|
+
await ctx.close()
|
|
180
|
+
}
|
|
181
|
+
} catch {
|
|
182
|
+
return null
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Whether any project that has files in the shard uses a database. */
|
|
187
|
+
export function shardNeedsDatabase(
|
|
188
|
+
specs: readonly ShardSpec[],
|
|
189
|
+
databaseByProject: ReadonlyMap<string, boolean>,
|
|
190
|
+
): boolean {
|
|
191
|
+
return specs.some(spec => databaseByProject.get(spec.project) ?? true)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export function buildProjectArgs(
|
|
195
|
+
options: TestOptions,
|
|
196
|
+
instance: import('../../core/pipework.js').Manifold,
|
|
197
|
+
onEmpty?: (basis: string) => void,
|
|
198
|
+
): ProjectSelection | null {
|
|
199
|
+
const blueprint = instance.config.raw
|
|
200
|
+
// Unfiltered runs: nothing is known about what executes, so assume it connects.
|
|
201
|
+
if (blueprint.vitest === undefined) return { args: [], needsDatabase: true }
|
|
202
|
+
|
|
203
|
+
const configPath = findConfig(options.cwd)
|
|
204
|
+
if (configPath === null) return { args: [], needsDatabase: true }
|
|
205
|
+
|
|
206
|
+
const configDir = dirname(configPath)
|
|
207
|
+
const resolved = resolveModules(blueprint.modules, configDir)
|
|
208
|
+
// No declared modules: single-package repo whose one implicit module is the
|
|
209
|
+
// repo root, addressed as '.'. Synthesize it so --suite/--scope/profile
|
|
210
|
+
// selection works — `resolveVitestModules` projects the same '.' module, so
|
|
211
|
+
// the `--project` names line up.
|
|
212
|
+
const effectiveModules: ResolvedModule[] = resolved.length === 0
|
|
213
|
+
? [{ key: '.', relativePath: '.', config: {} }]
|
|
214
|
+
: resolved
|
|
215
|
+
|
|
216
|
+
const scope = options.scope ?? { kind: 'all' } as ScopeMode
|
|
217
|
+
const scopeResult = resolveAffected(configDir, effectiveModules, blueprint.name ?? '', scope, blueprint.fastPath?.baseBranches)
|
|
218
|
+
|
|
219
|
+
// Population line: what this run's module scope was computed from. Printed
|
|
220
|
+
// unconditionally so scope-of-invocation is visible next to every verdict.
|
|
221
|
+
info(`Scope: ${scopeResult.basis}`)
|
|
222
|
+
|
|
223
|
+
// No affected modules — nothing to test. Signal the caller to exit 0
|
|
224
|
+
// gracefully rather than emitting a bogus --project filter that vitest
|
|
225
|
+
// rejects as a startup error. Mirrors `pipework check`, which degrades the
|
|
226
|
+
// same way on an empty diff (e.g. a pre-push hook with an empty git index).
|
|
227
|
+
if (scopeResult.modules.size === 0) {
|
|
228
|
+
onEmpty?.(scopeResult.basis)
|
|
229
|
+
return null
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (scopeResult.failedOpen === true) {
|
|
233
|
+
warn('Affected set could not be computed — running all modules (fast path failed open). Issue #325.')
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const manualProfiles = collectManualProfiles(blueprint.vitest)
|
|
237
|
+
// --fast: include only the fast test tiers; property/stress are deferred to
|
|
238
|
+
// the full run. The base (profile-less) project is always kept. Issue #325.
|
|
239
|
+
const fastTiers = options.fast === true
|
|
240
|
+
? new Set(blueprint.fastPath?.test?.tiers ?? ['unit', 'contract', 'isolation'])
|
|
241
|
+
: null
|
|
242
|
+
const projectNames: string[] = []
|
|
243
|
+
const databaseByProject = new Map<string, boolean>()
|
|
244
|
+
let needsDatabase = false
|
|
245
|
+
|
|
246
|
+
// The same flag chain `resolveVitestModules` projects into each vitest
|
|
247
|
+
// project: profile ?? module ?? workspace ?? true.
|
|
248
|
+
const workspaceDatabase = blueprint.vitest.database ?? true
|
|
249
|
+
const usesDatabase = (modulePath: string, profileName?: string): boolean => {
|
|
250
|
+
const moduleConfig = blueprint.vitest?.modules?.[modulePath]
|
|
251
|
+
const moduleDatabase = moduleConfig?.database ?? workspaceDatabase
|
|
252
|
+
if (profileName === undefined) return moduleDatabase
|
|
253
|
+
return moduleConfig?.profiles?.[profileName]?.database ?? moduleDatabase
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
for (const modulePath of [...scopeResult.modules].sort()) {
|
|
257
|
+
if (options.suite !== undefined) {
|
|
258
|
+
projectNames.push(`${modulePath}:${options.suite}`)
|
|
259
|
+
databaseByProject.set(`${modulePath}:${options.suite}`, usesDatabase(modulePath, options.suite))
|
|
260
|
+
needsDatabase ||= usesDatabase(modulePath, options.suite)
|
|
261
|
+
} else {
|
|
262
|
+
projectNames.push(modulePath)
|
|
263
|
+
databaseByProject.set(modulePath, usesDatabase(modulePath))
|
|
264
|
+
needsDatabase ||= usesDatabase(modulePath)
|
|
265
|
+
const moduleVitestConfig = blueprint.vitest.modules?.[modulePath]
|
|
266
|
+
if (moduleVitestConfig?.profiles !== undefined) {
|
|
267
|
+
for (const profileName of Object.keys(moduleVitestConfig.profiles).sort()) {
|
|
268
|
+
if (fastTiers !== null && !fastTiers.has(profileName)) continue
|
|
269
|
+
const fullName = `${modulePath}:${profileName}`
|
|
270
|
+
if (!manualProfiles.has(fullName)) {
|
|
271
|
+
projectNames.push(fullName)
|
|
272
|
+
databaseByProject.set(fullName, usesDatabase(modulePath, profileName))
|
|
273
|
+
needsDatabase ||= usesDatabase(modulePath, profileName)
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!scopeResult.all) {
|
|
281
|
+
info(`Scoped to ${String(scopeResult.modules.size)} of ${String(effectiveModules.length)} module(s): ${[...scopeResult.modules].sort().join(', ')}`)
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const args: string[] = []
|
|
285
|
+
for (const name of projectNames) {
|
|
286
|
+
args.push('--project', name)
|
|
287
|
+
}
|
|
288
|
+
return { args, needsDatabase, databaseByProject }
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function collectManualProfiles(
|
|
292
|
+
vitestConfig: NonNullable<import('../../core/config/schema.js').Blueprint['vitest']>,
|
|
293
|
+
): Set<string> {
|
|
294
|
+
const manual = new Set<string>()
|
|
295
|
+
if (vitestConfig.modules === undefined) return manual
|
|
296
|
+
|
|
297
|
+
for (const [modulePath, moduleConfig] of Object.entries(vitestConfig.modules)) {
|
|
298
|
+
if (moduleConfig.profiles === undefined) continue
|
|
299
|
+
for (const [profileName, profileConfig] of Object.entries(moduleConfig.profiles)) {
|
|
300
|
+
if (profileConfig.manual === true) {
|
|
301
|
+
manual.add(`${modulePath}:${profileName}`)
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return manual
|
|
307
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import { resolve } from 'node:path'
|
|
3
|
+
import { info, success, warn, error, bold } from '../output.js'
|
|
4
|
+
import { install } from './install.js'
|
|
5
|
+
import { findConfigFile } from './shared/find-config.js'
|
|
6
|
+
import { rewriteConfigFileVersion } from './shared/config-pipework-version.js'
|
|
7
|
+
import { detectPipeworkInstall } from '../../workspace/detect-pipework-copies.js'
|
|
8
|
+
|
|
9
|
+
export async function upgrade(cwd: string, targetVersion: string | undefined): Promise<void> {
|
|
10
|
+
const version = targetVersion ?? resolveLatestVersion()
|
|
11
|
+
const root = resolve(cwd)
|
|
12
|
+
|
|
13
|
+
info(`Upgrading to pipework@${bold(version)}`)
|
|
14
|
+
|
|
15
|
+
// The config's own pipework pin outranks the installed CLI's version: left at the old
|
|
16
|
+
// version, the next `pipework install` would regenerate package.json there.
|
|
17
|
+
const configFile = findConfigFile(root)
|
|
18
|
+
const rewrite = rewriteConfigFileVersion(configFile, version)
|
|
19
|
+
if (rewrite.kind === 'rewritten') {
|
|
20
|
+
info(`Set the pipework version in ${configFile} to ${version}`)
|
|
21
|
+
} else if (rewrite.kind === 'ambiguous') {
|
|
22
|
+
warn(
|
|
23
|
+
`${configFile} has ${String(rewrite.count)} pipework version literals; change the one in ` +
|
|
24
|
+
`dependencies/devDependencies to ${version} yourself, or the next \`pipework install\` regenerates package.json at the old version.`,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
await install(root, version)
|
|
29
|
+
|
|
30
|
+
const { orphans } = detectPipeworkInstall(root)
|
|
31
|
+
for (const o of orphans) {
|
|
32
|
+
warn(`Orphaned pipework ${o.version} at ${o.path}: a stale copy pnpm left in its virtual store; \`pnpm prune\` removes it.`)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
success(`Upgraded to pipework@${version}`)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function resolveLatestVersion(): string {
|
|
39
|
+
try {
|
|
40
|
+
return execSync('npm view pipework version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()
|
|
41
|
+
} catch {
|
|
42
|
+
error(
|
|
43
|
+
`Could not resolve latest pipework version from npm.\n\n` +
|
|
44
|
+
` Specify a version explicitly: ${bold('pipework upgrade 0.7.5')}\n`,
|
|
45
|
+
)
|
|
46
|
+
process.exit(1)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { loadEnvFiles } from '../core/config/env.js'
|
|
2
|
+
import { discoverInstance } from '../core/config/discover.js'
|
|
3
|
+
import { parsePort } from './port.js'
|
|
4
|
+
import { parseSurfaceKinds, SURFACE_KINDS_ENV } from './surface-kinds.js'
|
|
5
|
+
|
|
6
|
+
const cwd = process.env['PIPEWORK_CWD'] ?? process.cwd()
|
|
7
|
+
|
|
8
|
+
loadEnvFiles(cwd)
|
|
9
|
+
|
|
10
|
+
const port = parsePort(process.env['PORT'])
|
|
11
|
+
|
|
12
|
+
const kinds = parseSurfaceKinds(process.env[SURFACE_KINDS_ENV])
|
|
13
|
+
|
|
14
|
+
const manifold = await discoverInstance(cwd)
|
|
15
|
+
const names = manifold.surfaceNames()
|
|
16
|
+
|
|
17
|
+
if (names.length > 0) {
|
|
18
|
+
process.stderr.write(`\n Starting ${names.length} surface${names.length > 1 ? 's' : ''}...\n\n`)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
await manifold.start({
|
|
22
|
+
...(port === undefined ? {} : { port }),
|
|
23
|
+
...(kinds === undefined ? {} : { kinds }),
|
|
24
|
+
})
|