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,62 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import { dirname, relative } from 'node:path'
|
|
3
|
+
import { findConfig } from '../../core/config/discover.js'
|
|
4
|
+
import { error } from '../output.js'
|
|
5
|
+
import { builtinConfigArgs, lintTargets, loadLintIncludes, resolveEslintBin } from './check.js'
|
|
6
|
+
|
|
7
|
+
// eslint options that take their value as the next argument. Anything else starting
|
|
8
|
+
// with `-` is a switch, so the argument after it is a file.
|
|
9
|
+
const VALUE_FLAGS = new Set([
|
|
10
|
+
'-c', '--config', '--ext', '--resolve-plugins-relative-to', '--rulesdir', '--parser',
|
|
11
|
+
'--parser-options', '--plugin', '--rule', '--global', '--env', '-f', '--format',
|
|
12
|
+
'-o', '--output-file', '--max-warnings', '--cache-location', '--cache-strategy',
|
|
13
|
+
'--ignore-path', '--ignore-pattern', '--stdin-filename', '--report-unused-disable-directives-severity',
|
|
14
|
+
'--exit-on-fatal-error-severity', '--concurrency', '--flag', '--inspect-config-option',
|
|
15
|
+
'--print-config',
|
|
16
|
+
])
|
|
17
|
+
|
|
18
|
+
function namesConfig(args: readonly string[]): boolean {
|
|
19
|
+
return args.some(a => a === '-c' || a === '--config' || a.startsWith('--config='))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** True when `args` name at least one file or glob for eslint to lint. */
|
|
23
|
+
export function namesFiles(args: readonly string[]): boolean {
|
|
24
|
+
for (let i = 0; i < args.length; i++) {
|
|
25
|
+
const arg = args[i]!
|
|
26
|
+
if (arg === '--') return i < args.length - 1
|
|
27
|
+
if (!arg.startsWith('-') || arg === '-') return true
|
|
28
|
+
if (VALUE_FLAGS.has(arg)) i++
|
|
29
|
+
}
|
|
30
|
+
return false
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* `pipework lint [eslint args...]`: eslint in `cwd` with the config, globs and binary
|
|
35
|
+
* `pipework check` uses. With no files named, lints the include globs; with files, only
|
|
36
|
+
* those. Every argument is forwarded verbatim. Returns eslint's exit code.
|
|
37
|
+
*/
|
|
38
|
+
export async function lintCommand(cwd: string, args: readonly string[]): Promise<number> {
|
|
39
|
+
const eslintBin = resolveEslintBin(cwd)
|
|
40
|
+
const configPath = findConfig(cwd)
|
|
41
|
+
const root = configPath === null ? cwd : dirname(configPath)
|
|
42
|
+
const label = relative(root, cwd) || '.'
|
|
43
|
+
|
|
44
|
+
const forwarded = [...args]
|
|
45
|
+
if (!namesFiles(args)) {
|
|
46
|
+
const includes = await loadLintIncludes(root)
|
|
47
|
+
const targets = lintTargets(cwd, includes.for(label))
|
|
48
|
+
if (targets.length === 0) {
|
|
49
|
+
error(`Nothing to lint in ${label}: none of the lint include globs reach a directory that exists.`)
|
|
50
|
+
return 1
|
|
51
|
+
}
|
|
52
|
+
// A default glob that reaches nothing (no .tsx here) is not an error, as in `check`.
|
|
53
|
+
forwarded.unshift(...targets, '--no-error-on-unmatched-pattern')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const result = spawnSync(eslintBin, [...forwarded, ...(namesConfig(args) ? [] : builtinConfigArgs(cwd))], { cwd, stdio: 'inherit' })
|
|
57
|
+
if (result.error !== undefined) {
|
|
58
|
+
error(`Failed to run eslint: ${result.error.message}`)
|
|
59
|
+
return 1
|
|
60
|
+
}
|
|
61
|
+
return result.status ?? 1
|
|
62
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { info, success, error as logError, warn } from '../output.js'
|
|
2
|
+
import type { MigrateResult } from '../../data/migrate/run.js'
|
|
3
|
+
import { frameworkTablesChanged } from '../../data/migrate/provision-framework.js'
|
|
4
|
+
|
|
5
|
+
export interface MigrateCommandOptions {
|
|
6
|
+
db: string | undefined
|
|
7
|
+
cwd: string
|
|
8
|
+
confirm: boolean | undefined
|
|
9
|
+
allowDestructive: boolean | undefined
|
|
10
|
+
acknowledgeLock: boolean | undefined
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function migrate(options: MigrateCommandOptions): Promise<void> {
|
|
14
|
+
const { discoverInstance, findConfig } = await import('../../core/config/discover.js')
|
|
15
|
+
const { migrateAll, migrateOne, UnsafeMigrationError } = await import('../../data/migrate/run.js')
|
|
16
|
+
const { formatCheckResult } = await import('../../data/migrate/check.js')
|
|
17
|
+
|
|
18
|
+
if (findConfig(options.cwd) === null) {
|
|
19
|
+
logError(
|
|
20
|
+
'No pipework.config.ts found in the current directory.\n\n' +
|
|
21
|
+
' Run `pipework init` to create one.\n'
|
|
22
|
+
)
|
|
23
|
+
process.exit(1)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const rejection = rejectRetiredFlags(options)
|
|
27
|
+
if (rejection !== null) {
|
|
28
|
+
logError(rejection)
|
|
29
|
+
process.exit(1)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const instance = await discoverInstance(options.cwd)
|
|
33
|
+
|
|
34
|
+
if (instance.config.environment === 'production' && options.confirm !== true) {
|
|
35
|
+
logError(
|
|
36
|
+
'Refusing to run migrations in production without --confirm.\n\n' +
|
|
37
|
+
' This is a destructive operation that modifies your production database schema.\n' +
|
|
38
|
+
' Run: pipework migrate --confirm\n',
|
|
39
|
+
)
|
|
40
|
+
process.exit(1)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (instance.config.environment === 'production') {
|
|
44
|
+
warn('Running migrations against PRODUCTION database.')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const migrateOptions = {}
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
if (options.db !== undefined) {
|
|
51
|
+
info(`Migrating database: ${options.db}`)
|
|
52
|
+
const result = await migrateOne(instance, instance.config.database(options.db), migrateOptions)
|
|
53
|
+
reportResumed(result)
|
|
54
|
+
reportFrameworkTables(result)
|
|
55
|
+
success(`${options.db}: ${result.migrationsRun} migrations applied`)
|
|
56
|
+
} else {
|
|
57
|
+
info('Migrating all databases...')
|
|
58
|
+
const results = await migrateAll(instance, migrateOptions)
|
|
59
|
+
for (const result of results) {
|
|
60
|
+
reportResumed(result)
|
|
61
|
+
reportFrameworkTables(result)
|
|
62
|
+
success(`${result.database}: ${result.migrationsRun} migrations applied`)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (err instanceof UnsafeMigrationError) {
|
|
67
|
+
const report = formatCheckResult(err.check)
|
|
68
|
+
logError(report)
|
|
69
|
+
process.exit(1)
|
|
70
|
+
}
|
|
71
|
+
throw err
|
|
72
|
+
} finally {
|
|
73
|
+
await instance.pool.closeAll()
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* `--allow-destructive` / `--acknowledge-lock` authorized an *invocation*, so
|
|
79
|
+
* the first destructive migration that had to ship put them into a deploy
|
|
80
|
+
* workflow permanently and every migration after that was pre-approved by a
|
|
81
|
+
* decision nobody revisits. Authorization is per-migration now, declared in
|
|
82
|
+
* the file that raises the hazard, where review can see it.
|
|
83
|
+
*
|
|
84
|
+
* Failing loudly rather than ignoring them is the point: a pipeline still
|
|
85
|
+
* passing these is a pipeline that has been running ungated.
|
|
86
|
+
*
|
|
87
|
+
* Returns the error text, or null when neither flag was passed.
|
|
88
|
+
*/
|
|
89
|
+
export function rejectRetiredFlags(options: {
|
|
90
|
+
allowDestructive: boolean | undefined
|
|
91
|
+
acknowledgeLock: boolean | undefined
|
|
92
|
+
}): string | null {
|
|
93
|
+
const used = [
|
|
94
|
+
options.allowDestructive === true ? '--allow-destructive' : null,
|
|
95
|
+
options.acknowledgeLock === true ? '--acknowledge-lock' : null,
|
|
96
|
+
].filter((f): f is string => f !== null)
|
|
97
|
+
|
|
98
|
+
if (used.length === 0) return null
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
`${used.join(' and ')} ${used.length > 1 ? 'are' : 'is'} no longer accepted.\n\n` +
|
|
102
|
+
' Authorization belongs in the migration, not the deploy command.\n' +
|
|
103
|
+
' A flag here approves every migration this pipeline will ever run;\n' +
|
|
104
|
+
' a pragma approves the one file it is written in, in the diff where\n' +
|
|
105
|
+
' it is reviewed.\n\n' +
|
|
106
|
+
' Run `pipework migrate` with no flags. It will name each migration\n' +
|
|
107
|
+
' that needs a declaration and the exact line to add, e.g.\n\n' +
|
|
108
|
+
' -- pipework:expect-destructive\n' +
|
|
109
|
+
' DROP TABLE "graph_co_change_edges";\n'
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// A half-applied no-transaction file that was picked up and finished is not a
|
|
114
|
+
// routine apply: it says the previous run died mid-file. Name it. Issue #378.
|
|
115
|
+
function reportResumed(result: MigrateResult): void {
|
|
116
|
+
for (const r of result.resumed) {
|
|
117
|
+
warn(
|
|
118
|
+
`${result.database}: resumed "${r.tag}" from statement ${r.fromStatement} of ` +
|
|
119
|
+
`${r.totalStatements} — a previous run stopped mid-file.`,
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function reportFrameworkTables(result: MigrateResult): void {
|
|
125
|
+
const f = result.frameworkTables
|
|
126
|
+
if (!frameworkTablesChanged(f)) return
|
|
127
|
+
info(
|
|
128
|
+
`${result.database}: framework tables created ${f.created.length === 0 ? 'none' : f.created.join(', ')}; ` +
|
|
129
|
+
`columns added ${f.columnsAdded.length === 0 ? 'none' : f.columnsAdded.join(', ')}; ` +
|
|
130
|
+
`${f.partitionsCreated.length} day partitions created`,
|
|
131
|
+
)
|
|
132
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import { dirname, resolve } from 'node:path'
|
|
3
|
+
import { ConfigError } from '../../core/config/errors.js'
|
|
4
|
+
import type { HttpSurfaceBuilder } from '../../core/surface/types.js'
|
|
5
|
+
import { success } from '../output.js'
|
|
6
|
+
|
|
7
|
+
export interface OpenapiCommandOptions {
|
|
8
|
+
cwd: string
|
|
9
|
+
surface?: string | undefined
|
|
10
|
+
out?: string | undefined
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Writes an http surface's OpenAPI document, byte-identical to the server's GET, without connecting to any database. */
|
|
14
|
+
export async function openapi(options: OpenapiCommandOptions): Promise<void> {
|
|
15
|
+
const { discoverInstance } = await import('../../core/config/discover.js')
|
|
16
|
+
const instance = await discoverInstance(options.cwd)
|
|
17
|
+
|
|
18
|
+
const all = instance.surfaceMap()
|
|
19
|
+
const httpNames = Object.entries(all).filter(([, s]) => s.kind === 'http').map(([n]) => n)
|
|
20
|
+
|
|
21
|
+
let name: string
|
|
22
|
+
if (options.surface !== undefined) {
|
|
23
|
+
const picked = all[options.surface]
|
|
24
|
+
if (picked === undefined || picked.kind !== 'http') {
|
|
25
|
+
throw new ConfigError(
|
|
26
|
+
picked === undefined
|
|
27
|
+
? `No surface named "${options.surface}".`
|
|
28
|
+
: `Surface "${options.surface}" is a ${picked.kind} surface, not http.`,
|
|
29
|
+
`The http surfaces are: ${httpNames.length > 0 ? httpNames.join(', ') : '(none)'}. Pass --surface <name>.`,
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
name = options.surface
|
|
33
|
+
} else {
|
|
34
|
+
const withInfo = httpNames.filter((n) => hasOpenapiInfo(all[n] as HttpSurfaceBuilder))
|
|
35
|
+
if (withInfo.length !== 1) {
|
|
36
|
+
throw new ConfigError(
|
|
37
|
+
`Expected exactly one http surface with \`openapi\` info, found ${String(withInfo.length)}.`,
|
|
38
|
+
`The http surfaces are: ${httpNames.length > 0 ? httpNames.join(', ') : '(none)'}. Add \`openapi: { title, version }\` to one, or pass --surface <name>.`,
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
name = withInfo[0] as string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const text = JSON.stringify((all[name] as HttpSurfaceBuilder).openapi())
|
|
45
|
+
if (options.out === undefined) {
|
|
46
|
+
process.stdout.write(text)
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
const file = resolve(options.cwd, options.out)
|
|
50
|
+
mkdirSync(dirname(file), { recursive: true })
|
|
51
|
+
writeFileSync(file, text)
|
|
52
|
+
success(`Wrote ${options.out} (surface ${name})`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function hasOpenapiInfo(s: HttpSurfaceBuilder): boolean {
|
|
56
|
+
try {
|
|
57
|
+
s.openapi()
|
|
58
|
+
return true
|
|
59
|
+
} catch (err) {
|
|
60
|
+
if (err instanceof ConfigError) return false
|
|
61
|
+
throw err
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import { sync as syncWorkspace } from '../../workspace/sync.js'
|
|
4
|
+
import { loadConfig } from './shared/load-config.js'
|
|
5
|
+
import { reportRemoved } from './shared/report-removed.js'
|
|
6
|
+
import { runPnpmInstall } from './shared/pnpm-install.js'
|
|
7
|
+
import { findConfigFile } from './shared/find-config.js'
|
|
8
|
+
import { info, success, error, bold, warn } from '../output.js'
|
|
9
|
+
|
|
10
|
+
export async function remove(cwd: string, packages: readonly string[]): Promise<void> {
|
|
11
|
+
if (packages.length === 0) {
|
|
12
|
+
error(`Missing package name.\n\n Usage: ${bold('pipework remove <pkg> [...]')}\n`)
|
|
13
|
+
process.exit(1)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const resolved = resolve(cwd)
|
|
17
|
+
const configPath = findConfigFile(resolved)
|
|
18
|
+
|
|
19
|
+
const source = readFileSync(configPath, 'utf-8')
|
|
20
|
+
const { result: updated, removed } = removeDependencies(source, packages)
|
|
21
|
+
|
|
22
|
+
if (removed.length === 0) {
|
|
23
|
+
warn(`None of the specified packages were found in dependencies.`)
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
writeFileSync(configPath, updated)
|
|
28
|
+
info(`Removed ${removed.join(', ')}`)
|
|
29
|
+
|
|
30
|
+
const notFound = packages.filter(p => !removed.includes(p))
|
|
31
|
+
if (notFound.length > 0) {
|
|
32
|
+
warn(`Not found in dependencies: ${notFound.join(', ')}`)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const { config, appName } = await loadConfig(resolved)
|
|
36
|
+
info('Syncing workspace...')
|
|
37
|
+
const result = syncWorkspace({ config, cwd: resolved, appName })
|
|
38
|
+
success(`Generated ${String(result.files.length)} file(s).`)
|
|
39
|
+
reportRemoved(result)
|
|
40
|
+
|
|
41
|
+
info('Running pnpm install...')
|
|
42
|
+
const outcome = runPnpmInstall({ cwd: resolved, requiredPipeworkVersion: result.pipeworkVersion })
|
|
43
|
+
if (!outcome.ok) {
|
|
44
|
+
error(outcome.message)
|
|
45
|
+
process.exit(1)
|
|
46
|
+
}
|
|
47
|
+
success(`Install complete — pipework@${outcome.installedPipeworkVersion} in node_modules.`)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function removeDependencies(
|
|
51
|
+
source: string,
|
|
52
|
+
packages: readonly string[],
|
|
53
|
+
): { result: string; removed: string[] } {
|
|
54
|
+
const removed: string[] = []
|
|
55
|
+
let result = source
|
|
56
|
+
|
|
57
|
+
for (const pkg of packages) {
|
|
58
|
+
const lineRegex = new RegExp(
|
|
59
|
+
`\\n?[ \\t]*['"]${escapeRegex(pkg)}['"]\\s*:\\s*['"][^'"]*['"],?[ \\t]*\\n?`,
|
|
60
|
+
)
|
|
61
|
+
if (lineRegex.test(result)) {
|
|
62
|
+
result = result.replace(lineRegex, '\n')
|
|
63
|
+
removed.push(pkg)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return { result, removed }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function escapeRegex(s: string): string {
|
|
71
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
|
72
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import { pathToFileURL } from 'node:url'
|
|
4
|
+
import { runScript } from '../../async/jobs/run-script.js'
|
|
5
|
+
import { bold, error, success } from '../output.js'
|
|
6
|
+
|
|
7
|
+
export interface RunCommandOptions {
|
|
8
|
+
script: string
|
|
9
|
+
cwd: string
|
|
10
|
+
tenant?: string | undefined
|
|
11
|
+
jobType?: string | undefined
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function run(options: RunCommandOptions): Promise<void> {
|
|
15
|
+
const scriptPath = resolve(options.cwd, options.script)
|
|
16
|
+
|
|
17
|
+
if (!existsSync(scriptPath)) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
`Script not found: ${options.script}\n\n` +
|
|
20
|
+
` Provide a path relative to the project root.\n` +
|
|
21
|
+
` Example: ${bold('pipework run ./scripts/seed.ts')}\n`,
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const { discoverInstance } = await import('../../core/config/discover.js')
|
|
26
|
+
|
|
27
|
+
const instance = await discoverInstance(options.cwd)
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
try {
|
|
31
|
+
await runScript(instance, async () => {
|
|
32
|
+
await import(pathToFileURL(scriptPath).href)
|
|
33
|
+
}, {
|
|
34
|
+
jobType: options.jobType ?? 'script',
|
|
35
|
+
tenant: options.tenant ?? null,
|
|
36
|
+
})
|
|
37
|
+
} catch (err) {
|
|
38
|
+
error(`Script failed: ${options.script}`)
|
|
39
|
+
throw err
|
|
40
|
+
}
|
|
41
|
+
const exitCode = process.exitCode
|
|
42
|
+
if (exitCode !== undefined && Number(exitCode) !== 0) {
|
|
43
|
+
error(`Script failed: ${options.script} (exit code ${String(exitCode)})`)
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
success(`Script completed: ${options.script}`)
|
|
47
|
+
} finally {
|
|
48
|
+
await instance.pool.closeAll()
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ScopeMode } from '../../workspace/affected.js'
|
|
2
|
+
|
|
3
|
+
export interface ParsedScope {
|
|
4
|
+
readonly scope: ScopeMode
|
|
5
|
+
readonly suite: string | undefined
|
|
6
|
+
/** `--fast` was given — `test` trims to the fast tiers. Issue #325. */
|
|
7
|
+
readonly fast: boolean
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function parseScope(values: {
|
|
11
|
+
all?: boolean | undefined
|
|
12
|
+
module?: string | undefined
|
|
13
|
+
staged?: boolean | undefined
|
|
14
|
+
fast?: boolean | undefined
|
|
15
|
+
full?: boolean | undefined
|
|
16
|
+
suite?: string | undefined
|
|
17
|
+
}): ParsedScope {
|
|
18
|
+
const flags = [
|
|
19
|
+
values.all === true ? '--all' : null,
|
|
20
|
+
values.module !== undefined ? '--module' : null,
|
|
21
|
+
values.staged === true ? '--staged' : null,
|
|
22
|
+
values.fast === true ? '--fast' : null,
|
|
23
|
+
values.full === true ? '--full' : null,
|
|
24
|
+
].filter((f): f is string => f !== null)
|
|
25
|
+
|
|
26
|
+
if (flags.length > 1) {
|
|
27
|
+
throw new Error(`${flags.join(' and ')} are mutually exclusive.`)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let scope: ScopeMode
|
|
31
|
+
if (values.full === true || values.all === true) {
|
|
32
|
+
// --full and --all both mean every module; --full additionally keeps all
|
|
33
|
+
// test tiers (the default whenever `fast` is false).
|
|
34
|
+
scope = { kind: 'all' }
|
|
35
|
+
} else if (values.fast === true) {
|
|
36
|
+
// --fast: only modules touched on this branch, diffed against the
|
|
37
|
+
// merge-base with the base branch. resolveAffected fails open to every
|
|
38
|
+
// module when that cannot be computed. Issue #325.
|
|
39
|
+
scope = { kind: 'diff', mode: 'branch' }
|
|
40
|
+
} else if (values.module !== undefined) {
|
|
41
|
+
scope = { kind: 'module', path: values.module }
|
|
42
|
+
} else if (values.staged === true) {
|
|
43
|
+
scope = { kind: 'diff', mode: 'staged' }
|
|
44
|
+
} else {
|
|
45
|
+
// Bare form: branch diff — merge-base to worktree, so committed work,
|
|
46
|
+
// uncommitted edits, and untracked files all count. The old default
|
|
47
|
+
// (`uncommitted`) scoped to the dirty tree only, so a committed-clean
|
|
48
|
+
// branch evaluated nothing and exited 0 — a vacuous green recorded three
|
|
49
|
+
// times by consumers. Unlike --fast this keeps every test tier.
|
|
50
|
+
scope = { kind: 'diff', mode: 'branch' }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return { scope, suite: values.suite, fast: values.fast === true }
|
|
54
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process'
|
|
2
|
+
import { dirname } from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { ConfigError } from '../../core/config/errors.js'
|
|
5
|
+
import { SURFACE_KINDS_ENV } from '../surface-kinds.js'
|
|
6
|
+
import { resolveRegisterPath, resolveBootstrapPath } from './dev.js'
|
|
7
|
+
|
|
8
|
+
export interface ServeOptions {
|
|
9
|
+
port: string | undefined
|
|
10
|
+
/** Run only the worker surfaces: no http server, no scripts. */
|
|
11
|
+
workerOnly: boolean
|
|
12
|
+
cwd: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// `pipework serve` — the production entrypoint. It discovers the manifold and binds
|
|
16
|
+
// every surface via the SAME bootstrap as `dev` (discoverInstance -> manifold.start),
|
|
17
|
+
// differing only in that it does NOT pass `--watch`: a stable long-running process,
|
|
18
|
+
// not a file-watcher. This is the supported replacement for hand-rolled serve scripts
|
|
19
|
+
// that reached into pipework/dist internals (e.g. `dist/core/config/discover.js`).
|
|
20
|
+
//
|
|
21
|
+
// Exported + pure so the "serve never watches" contract is unit-testable without
|
|
22
|
+
// spawning a process.
|
|
23
|
+
export function buildServeArgs(registerPath: string, bootstrapPath: string): string[] {
|
|
24
|
+
return ['--import', registerPath, bootstrapPath]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The environment `serve` gives its child. `--worker-only` selects the worker surfaces only (script
|
|
29
|
+
* surfaces are one-shot work that belongs to the main process, so a scaled worker never repeats them)
|
|
30
|
+
* and opens no port, so it refuses `--port`.
|
|
31
|
+
*/
|
|
32
|
+
export function buildServeEnv(options: ServeOptions, base: Record<string, string | undefined> = process.env): Record<string, string | undefined> {
|
|
33
|
+
if (options.workerOnly && options.port !== undefined) {
|
|
34
|
+
throw new ConfigError(
|
|
35
|
+
'--worker-only opens no port, so --port does not apply.',
|
|
36
|
+
'Drop --port, or drop --worker-only to run the http surface.',
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
const env: Record<string, string | undefined> = { ...base, 'PIPEWORK_CWD': options.cwd }
|
|
40
|
+
if (options.port !== undefined) {
|
|
41
|
+
env['PORT'] = options.port
|
|
42
|
+
}
|
|
43
|
+
if (options.workerOnly) {
|
|
44
|
+
env[SURFACE_KINDS_ENV] = 'worker'
|
|
45
|
+
// A PORT in the environment must not reach a process that listens nowhere.
|
|
46
|
+
delete env['PORT']
|
|
47
|
+
}
|
|
48
|
+
return env
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function serve(options: ServeOptions): void {
|
|
52
|
+
const cliDir = dirname(fileURLToPath(import.meta.url))
|
|
53
|
+
const env = buildServeEnv(options)
|
|
54
|
+
|
|
55
|
+
const args = buildServeArgs(resolveRegisterPath(cliDir), resolveBootstrapPath(cliDir))
|
|
56
|
+
|
|
57
|
+
const child = spawn('node', args, { cwd: options.cwd, stdio: 'inherit', env })
|
|
58
|
+
|
|
59
|
+
child.on('exit', (code, signal) => {
|
|
60
|
+
if (signal === 'SIGTERM' || signal === 'SIGINT') {
|
|
61
|
+
process.exit(0)
|
|
62
|
+
}
|
|
63
|
+
process.exit(code ?? 0)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
process.on('SIGTERM', () => child.kill('SIGTERM'))
|
|
67
|
+
process.on('SIGINT', () => child.kill('SIGINT'))
|
|
68
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** `--shard <index>/<count>`: run part `index` of `count` disjoint parts of one run. */
|
|
2
|
+
export interface Shard {
|
|
3
|
+
readonly index: number
|
|
4
|
+
readonly count: number
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function parseShard(value: string): Shard {
|
|
8
|
+
const match = /^(\d+)\/(\d+)$/.exec(value)
|
|
9
|
+
const index = match === null ? 0 : Number(match[1])
|
|
10
|
+
const count = match === null ? 0 : Number(match[2])
|
|
11
|
+
if (match === null || index < 1 || count < 1 || index > count) {
|
|
12
|
+
throw new Error(
|
|
13
|
+
`--shard takes <index>/<count> with 1 <= index <= count (for example --shard 2/4); got "${value}".`,
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
return { index, count }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function shardArg(shard: Shard): string {
|
|
20
|
+
return `${String(shard.index)}/${String(shard.count)}`
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The modules part `index` of `count` owns: sorted, then dealt round-robin, so
|
|
25
|
+
* the parts are disjoint and together hold every module.
|
|
26
|
+
*/
|
|
27
|
+
export function shardModules(modules: readonly string[], shard: Shard | undefined): string[] {
|
|
28
|
+
const sorted = [...modules].sort()
|
|
29
|
+
if (shard === undefined) return sorted
|
|
30
|
+
return sorted.filter((_, i) => i % shard.count === shard.index - 1)
|
|
31
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
2
|
+
|
|
3
|
+
// The `pipework: '<version>'` entries of a config source: a (possibly quoted) key named
|
|
4
|
+
// pipework whose value is a plain version literal, with an optional range prefix.
|
|
5
|
+
const PIPEWORK_PIN = /(?<![\w$.-])(['"]?)pipework\1(\s*:\s*)(['"])([\^~>=<]*)(\d+\.\d+\.\d+[^'"\n]*)\3/g
|
|
6
|
+
|
|
7
|
+
export type ConfigRewrite =
|
|
8
|
+
| { readonly kind: 'rewritten'; readonly source: string }
|
|
9
|
+
| { readonly kind: 'unchanged' }
|
|
10
|
+
| { readonly kind: 'none' }
|
|
11
|
+
| { readonly kind: 'ambiguous'; readonly count: number }
|
|
12
|
+
|
|
13
|
+
/** Sets the one `pipework` version literal in a config's source, keeping its range prefix. */
|
|
14
|
+
export function rewritePipeworkVersion(source: string, version: string): ConfigRewrite {
|
|
15
|
+
const matches = [...source.matchAll(PIPEWORK_PIN)]
|
|
16
|
+
if (matches.length === 0) return { kind: 'none' }
|
|
17
|
+
if (matches.length > 1) return { kind: 'ambiguous', count: matches.length }
|
|
18
|
+
const rewritten = source.replace(PIPEWORK_PIN, (_m, q: string, sep: string, quote: string, prefix: string) =>
|
|
19
|
+
`${q}pipework${q}${sep}${quote}${prefix}${version}${quote}`)
|
|
20
|
+
return rewritten === source ? { kind: 'unchanged' } : { kind: 'rewritten', source: rewritten }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Rewrites the config file in place; returns what happened so the caller can tell the user. */
|
|
24
|
+
export function rewriteConfigFileVersion(path: string, version: string): ConfigRewrite {
|
|
25
|
+
const result = rewritePipeworkVersion(readFileSync(path, 'utf-8'), version)
|
|
26
|
+
if (result.kind === 'rewritten') writeFileSync(path, result.source, 'utf-8')
|
|
27
|
+
return result
|
|
28
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import { join } from 'node:path'
|
|
3
|
+
import { error } from '../../output.js'
|
|
4
|
+
|
|
5
|
+
const CONFIG_FILENAMES = [
|
|
6
|
+
'pipework.config.ts',
|
|
7
|
+
'pipework.config.js',
|
|
8
|
+
'pipework.config.mjs',
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
export function findConfigFile(cwd: string): string {
|
|
12
|
+
for (const name of CONFIG_FILENAMES) {
|
|
13
|
+
const full = join(cwd, name)
|
|
14
|
+
if (existsSync(full)) return full
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
error(
|
|
18
|
+
'No pipework config file found.\n\n' +
|
|
19
|
+
' Run `pipework init` to create one, or check that you are in the right directory.\n',
|
|
20
|
+
)
|
|
21
|
+
process.exit(1)
|
|
22
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Blueprint } from '../../../core/config/schema.js'
|
|
2
|
+
import { findConfigFile } from './find-config.js'
|
|
3
|
+
import { error } from '../../output.js'
|
|
4
|
+
|
|
5
|
+
export interface LoadedConfig {
|
|
6
|
+
readonly config: Blueprint
|
|
7
|
+
readonly appName: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function loadConfig(cwd: string): Promise<LoadedConfig> {
|
|
11
|
+
findConfigFile(cwd)
|
|
12
|
+
|
|
13
|
+
const { discoverInstance } = await import('../../../core/config/discover.js')
|
|
14
|
+
|
|
15
|
+
let instance
|
|
16
|
+
try {
|
|
17
|
+
instance = await discoverInstance(cwd)
|
|
18
|
+
} catch (err) {
|
|
19
|
+
const message = err instanceof Error ? err.message : String(err)
|
|
20
|
+
error(
|
|
21
|
+
`pipework.config.ts found but failed to load:\n\n` +
|
|
22
|
+
` ${message}\n\n` +
|
|
23
|
+
` Check that all required environment variables are set.\n`,
|
|
24
|
+
)
|
|
25
|
+
process.exit(1)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const rawConfig = instance.config.raw as Blueprint
|
|
29
|
+
const appName = rawConfig.name ?? 'app'
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
config: rawConfig,
|
|
33
|
+
appName,
|
|
34
|
+
}
|
|
35
|
+
}
|