pipework 0.252.0 → 0.253.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/infra/support/handle.d.ts +8 -1
- package/dist/infra/support/handle.d.ts.map +1 -1
- package/dist/infra/support/handle.js +9 -2
- package/dist/infra/support/handle.js.map +1 -1
- package/dist/infra/support/namespace.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/async/jobs/abortable-delay.ts +18 -0
- package/src/async/jobs/claims.ts +52 -0
- package/src/async/jobs/cron.ts +179 -0
- package/src/async/jobs/errors.ts +56 -0
- package/src/async/jobs/exclusion.ts +117 -0
- package/src/async/jobs/execute.ts +219 -0
- package/src/async/jobs/index.ts +10 -0
- package/src/async/jobs/listener.ts +135 -0
- package/src/async/jobs/namespace.ts +20 -0
- package/src/async/jobs/queue-door.ts +44 -0
- package/src/async/jobs/queue.ts +1012 -0
- package/src/async/jobs/run-script.ts +67 -0
- package/src/async/jobs/scheduler.ts +218 -0
- package/src/async/jobs/schedules-table.ts +37 -0
- package/src/async/jobs/serialize-error.ts +48 -0
- package/src/async/jobs/table.ts +191 -0
- package/src/async/pipeline/define.ts +53 -0
- package/src/async/pipeline/errors.ts +35 -0
- package/src/async/pipeline/execute.ts +53 -0
- package/src/async/pipeline/index.ts +13 -0
- package/src/async/pipeline/namespace.ts +12 -0
- package/src/async/pipeline/resume.ts +67 -0
- package/src/async/pipeline/run-steps.ts +98 -0
- package/src/async/pipeline/types.ts +57 -0
- package/src/async/state-machine/define.ts +64 -0
- package/src/async/state-machine/errors.ts +29 -0
- package/src/async/state-machine/index.ts +3 -0
- package/src/async/state-machine/namespace.ts +12 -0
- package/src/async/state-machine/transition.ts +90 -0
- package/src/async/state-machine/types.ts +37 -0
- package/src/async/steps/errors.ts +31 -0
- package/src/async/steps/graph.ts +1214 -0
- package/src/async/steps/hash.ts +40 -0
- package/src/async/steps/index.ts +7 -0
- package/src/async/steps/namespace.ts +7 -0
- package/src/async/steps/table.ts +97 -0
- package/src/async/steps/types.ts +318 -0
- package/src/audit/chain/index.ts +9 -0
- package/src/audit/chain/install.ts +113 -0
- package/src/audit/chain/retire.ts +52 -0
- package/src/audit/chain/verify.ts +257 -0
- package/src/audit/query/cursor.ts +37 -0
- package/src/audit/query/index.ts +9 -0
- package/src/audit/query/query.ts +223 -0
- package/src/audit/schema/audit-record-fields.ts +68 -0
- package/src/audit/schema/audit-record.ts +23 -0
- package/src/auth/auth/audit.ts +31 -0
- package/src/auth/auth/chain.ts +84 -0
- package/src/auth/auth/cookie.ts +136 -0
- package/src/auth/auth/email-links.ts +311 -0
- package/src/auth/auth/guard.ts +128 -0
- package/src/auth/auth/index.ts +18 -0
- package/src/auth/auth/multi-org.ts +337 -0
- package/src/auth/auth/namespace.ts +34 -0
- package/src/auth/auth/parse-expiry.ts +13 -0
- package/src/auth/auth/passwords.ts +110 -0
- package/src/auth/auth/schema.ts +110 -0
- package/src/auth/auth/sessions.ts +565 -0
- package/src/auth/auth/sign-in.ts +156 -0
- package/src/auth/auth/signing-keys.ts +69 -0
- package/src/auth/auth/types.ts +26 -0
- package/src/auth/auth/uuid.ts +10 -0
- package/src/auth/rbac/cache.ts +55 -0
- package/src/auth/rbac/check.ts +30 -0
- package/src/auth/rbac/create.ts +35 -0
- package/src/auth/rbac/index.ts +5 -0
- package/src/auth/rbac/middleware.ts +20 -0
- package/src/auth/rbac/namespace.ts +15 -0
- package/src/auth/rbac/resolve.ts +31 -0
- package/src/auth/rbac/schema.sql +31 -0
- package/src/auth/rbac/seed.ts +67 -0
- package/src/auth/rbac/tables.ts +32 -0
- package/src/auth/rbac/types.ts +65 -0
- package/src/auth/tenant/extract.ts +33 -0
- package/src/auth/tenant/in-tenant.ts +49 -0
- package/src/auth/tenant/index.ts +7 -0
- package/src/auth/tenant/namespace.ts +23 -0
- package/src/auth/tenant/propagate.ts +20 -0
- package/src/auth/tenant/rls.ts +120 -0
- package/src/auth/tenant/scope.ts +33 -0
- package/src/auth/tenant/scoped-db.ts +581 -0
- package/src/auth/tenant/types.ts +14 -0
- package/src/auth/tenant/validate.ts +27 -0
- package/src/cli/commands/add.ts +158 -0
- package/src/cli/commands/alerts.ts +98 -0
- package/src/cli/commands/check.ts +1418 -0
- package/src/cli/commands/codemod.ts +78 -0
- package/src/cli/commands/db.ts +356 -0
- package/src/cli/commands/dev.ts +101 -0
- package/src/cli/commands/generate.ts +75 -0
- package/src/cli/commands/init.ts +36 -0
- package/src/cli/commands/install.ts +28 -0
- package/src/cli/commands/lint.ts +62 -0
- package/src/cli/commands/migrate.ts +132 -0
- package/src/cli/commands/openapi.ts +63 -0
- package/src/cli/commands/remove.ts +72 -0
- package/src/cli/commands/run.ts +50 -0
- package/src/cli/commands/scope.ts +54 -0
- package/src/cli/commands/serve.ts +68 -0
- package/src/cli/commands/shard.ts +31 -0
- package/src/cli/commands/shared/config-pipework-version.ts +28 -0
- package/src/cli/commands/shared/find-config.ts +22 -0
- package/src/cli/commands/shared/load-config.ts +35 -0
- package/src/cli/commands/shared/pnpm-install.ts +95 -0
- package/src/cli/commands/shared/report-removed.ts +8 -0
- package/src/cli/commands/sync.ts +32 -0
- package/src/cli/commands/test.ts +307 -0
- package/src/cli/commands/upgrade.ts +48 -0
- package/src/cli/dev-bootstrap.ts +24 -0
- package/src/cli/errors.ts +10 -0
- package/src/cli/index.ts +303 -0
- package/src/cli/output.ts +17 -0
- package/src/cli/port.ts +15 -0
- package/src/cli/surface-kinds.ts +20 -0
- package/src/client/index.ts +4 -0
- package/src/client/poll.ts +130 -0
- package/src/client/report-fault.ts +119 -0
- package/src/core/config/app-pool.ts +19 -0
- package/src/core/config/aws-env.ts +29 -0
- package/src/core/config/base-dir.ts +24 -0
- package/src/core/config/discover.ts +64 -0
- package/src/core/config/env-resolve.ts +87 -0
- package/src/core/config/env-types.ts +116 -0
- package/src/core/config/env.ts +55 -0
- package/src/core/config/errors.ts +9 -0
- package/src/core/config/import-config.ts +40 -0
- package/src/core/config/index.ts +8 -0
- package/src/core/config/load.ts +417 -0
- package/src/core/config/namespace.ts +14 -0
- package/src/core/config/resolve.ts +195 -0
- package/src/core/config/schema.ts +488 -0
- package/src/core/config/statement-observer.ts +48 -0
- package/src/core/config/ts-inline-hooks.ts +75 -0
- package/src/core/config/ts-register.ts +4 -0
- package/src/core/config/ts-resolve-hooks.ts +101 -0
- package/src/core/errors/base.ts +49 -0
- package/src/core/errors/http.ts +146 -0
- package/src/core/errors/index.ts +2 -0
- package/src/core/errors/namespace.ts +31 -0
- package/src/core/lifecycle/drain.ts +33 -0
- package/src/core/lifecycle/health.ts +72 -0
- package/src/core/lifecycle/index.ts +4 -0
- package/src/core/lifecycle/namespace.ts +7 -0
- package/src/core/lifecycle/startup.ts +102 -0
- package/src/core/lifecycle/types.ts +36 -0
- package/src/core/logging/context.ts +60 -0
- package/src/core/logging/error-chain.ts +68 -0
- package/src/core/logging/index.ts +5 -0
- package/src/core/logging/logger.ts +65 -0
- package/src/core/logging/namespace.ts +16 -0
- package/src/core/logging/proxy.ts +22 -0
- package/src/core/logging/redact-match.ts +24 -0
- package/src/core/logging/types.ts +47 -0
- package/src/core/pipework.ts +566 -0
- package/src/core/runtime/broker.ts +69 -0
- package/src/core/surface/http.ts +133 -0
- package/src/core/surface/index.ts +11 -0
- package/src/core/surface/job-timeout.ts +40 -0
- package/src/core/surface/namespace.ts +13 -0
- package/src/core/surface/script.ts +33 -0
- package/src/core/surface/start.ts +142 -0
- package/src/core/surface/types.ts +225 -0
- package/src/core/surface/validate.ts +88 -0
- package/src/core/surface/worker.ts +528 -0
- package/src/core/validation/connectivity.ts +49 -0
- package/src/core/validation/domain.ts +99 -0
- package/src/core/validation/index.ts +5 -0
- package/src/core/validation/queue-tables.ts +312 -0
- package/src/core/validation/rls-role.ts +138 -0
- package/src/core/validation/startup.ts +51 -0
- package/src/core/validation/surfaces.ts +65 -0
- package/src/core/validation/types.ts +25 -0
- package/src/data/db/advisory-lock.ts +55 -0
- package/src/data/db/aggregates.ts +172 -0
- package/src/data/db/array-elements.ts +111 -0
- package/src/data/db/bulk-set.ts +53 -0
- package/src/data/db/col/index.ts +14 -0
- package/src/data/db/composed.ts +53 -0
- package/src/data/db/db.ts +276 -0
- package/src/data/db/excluded.ts +16 -0
- package/src/data/db/expressions.ts +473 -0
- package/src/data/db/filter.ts +90 -0
- package/src/data/db/function-source.ts +114 -0
- package/src/data/db/identifiers.ts +16 -0
- package/src/data/db/idx/index.ts +9 -0
- package/src/data/db/in-list.ts +49 -0
- package/src/data/db/index.ts +9 -0
- package/src/data/db/insert-split.ts +137 -0
- package/src/data/db/instrumentation.ts +82 -0
- package/src/data/db/maintenance.ts +28 -0
- package/src/data/db/namespace.ts +107 -0
- package/src/data/db/owner-labels.ts +9 -0
- package/src/data/db/pool.ts +187 -0
- package/src/data/db/query-label.ts +13 -0
- package/src/data/db/query-watch.ts +116 -0
- package/src/data/db/raw-client-warning.ts +37 -0
- package/src/data/db/readonly.ts +23 -0
- package/src/data/db/reservation.ts +151 -0
- package/src/data/db/schema-features.ts +14 -0
- package/src/data/db/serializable.ts +83 -0
- package/src/data/db/sql.ts +1 -0
- package/src/data/db/timeouts.ts +76 -0
- package/src/data/db/types.ts +18 -0
- package/src/data/db/unbound.ts +33 -0
- package/src/data/db/values.ts +29 -0
- package/src/data/domain/brand.ts +15 -0
- package/src/data/domain/build-factory.ts +193 -0
- package/src/data/domain/build-schema.ts +161 -0
- package/src/data/domain/build-table.ts +355 -0
- package/src/data/domain/define.ts +239 -0
- package/src/data/domain/external-registry.ts +34 -0
- package/src/data/domain/external.ts +77 -0
- package/src/data/domain/field.ts +279 -0
- package/src/data/domain/index.ts +13 -0
- package/src/data/domain/naming.ts +6 -0
- package/src/data/domain/projections.ts +57 -0
- package/src/data/domain/trace-safe-projection.ts +31 -0
- package/src/data/domain/traits.ts +108 -0
- package/src/data/domain/types.ts +289 -0
- package/src/data/jsonb/composed.ts +18 -0
- package/src/data/jsonb/index.ts +1 -0
- package/src/data/jsonb/namespace.ts +30 -0
- package/src/data/jsonb/query.ts +86 -0
- package/src/data/migrate/append-only-generate.ts +47 -0
- package/src/data/migrate/applied.ts +47 -0
- package/src/data/migrate/apply.ts +309 -0
- package/src/data/migrate/check.ts +119 -0
- package/src/data/migrate/diff.ts +357 -0
- package/src/data/migrate/door-generate.ts +130 -0
- package/src/data/migrate/framework-rls.ts +58 -0
- package/src/data/migrate/generate.ts +201 -0
- package/src/data/migrate/history.ts +215 -0
- package/src/data/migrate/index.ts +9 -0
- package/src/data/migrate/internal-definitions.ts +175 -0
- package/src/data/migrate/post-process.ts +73 -0
- package/src/data/migrate/pragma.ts +73 -0
- package/src/data/migrate/provision-framework.ts +147 -0
- package/src/data/migrate/rls-generate.ts +61 -0
- package/src/data/migrate/run.ts +124 -0
- package/src/data/migrate/safety.ts +167 -0
- package/src/data/migrate/snapshot.ts +368 -0
- package/src/data/migrate/sql-emit.ts +392 -0
- package/src/data/migrate/statements.ts +312 -0
- package/src/data/query/alias.ts +126 -0
- package/src/data/query/batch.ts +8 -0
- package/src/data/query/cache/core/cache.ts +78 -0
- package/src/data/query/cache/core/index.ts +1 -0
- package/src/data/query/cache/core/types.ts +29 -0
- package/src/data/query/cache/readme.md +230 -0
- package/src/data/query/casing.ts +76 -0
- package/src/data/query/collation.ts +11 -0
- package/src/data/query/column-builder.ts +370 -0
- package/src/data/query/column.ts +150 -0
- package/src/data/query/entity.ts +42 -0
- package/src/data/query/errors.ts +33 -0
- package/src/data/query/index.ts +14 -0
- package/src/data/query/logger.ts +47 -0
- package/src/data/query/operations.ts +45 -0
- package/src/data/query/pg-core/alias.ts +12 -0
- package/src/data/query/pg-core/checks.ts +32 -0
- package/src/data/query/pg-core/columns/all.ts +71 -0
- package/src/data/query/pg-core/columns/bigint.ts +110 -0
- package/src/data/query/pg-core/columns/bigserial.ts +128 -0
- package/src/data/query/pg-core/columns/boolean.ts +43 -0
- package/src/data/query/pg-core/columns/char.ts +85 -0
- package/src/data/query/pg-core/columns/cidr.ts +43 -0
- package/src/data/query/pg-core/columns/common.ts +366 -0
- package/src/data/query/pg-core/columns/custom.ts +232 -0
- package/src/data/query/pg-core/columns/date.common.ts +15 -0
- package/src/data/query/pg-core/columns/date.ts +112 -0
- package/src/data/query/pg-core/columns/double-precision.ts +55 -0
- package/src/data/query/pg-core/columns/enum.ts +201 -0
- package/src/data/query/pg-core/columns/index.ts +35 -0
- package/src/data/query/pg-core/columns/inet.ts +43 -0
- package/src/data/query/pg-core/columns/int.common.ts +57 -0
- package/src/data/query/pg-core/columns/integer.ts +53 -0
- package/src/data/query/pg-core/columns/interval.ts +83 -0
- package/src/data/query/pg-core/columns/json.ts +58 -0
- package/src/data/query/pg-core/columns/jsonb.ts +56 -0
- package/src/data/query/pg-core/columns/line.ts +117 -0
- package/src/data/query/pg-core/columns/macaddr.ts +43 -0
- package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
- package/src/data/query/pg-core/columns/numeric.ts +227 -0
- package/src/data/query/pg-core/columns/point.ts +127 -0
- package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
- package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
- package/src/data/query/pg-core/columns/real.ts +58 -0
- package/src/data/query/pg-core/columns/serial.ts +55 -0
- package/src/data/query/pg-core/columns/smallint.ts +53 -0
- package/src/data/query/pg-core/columns/smallserial.ts +60 -0
- package/src/data/query/pg-core/columns/text.ts +67 -0
- package/src/data/query/pg-core/columns/time.ts +72 -0
- package/src/data/query/pg-core/columns/timestamp.ts +163 -0
- package/src/data/query/pg-core/columns/uuid.ts +51 -0
- package/src/data/query/pg-core/columns/varchar.ts +89 -0
- package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
- package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
- package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
- package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
- package/src/data/query/pg-core/db.ts +674 -0
- package/src/data/query/pg-core/dialect.ts +1404 -0
- package/src/data/query/pg-core/expressions.ts +25 -0
- package/src/data/query/pg-core/foreign-keys.ts +130 -0
- package/src/data/query/pg-core/index.ts +21 -0
- package/src/data/query/pg-core/indexes.ts +276 -0
- package/src/data/query/pg-core/policies.ts +56 -0
- package/src/data/query/pg-core/primary-keys.ts +62 -0
- package/src/data/query/pg-core/query-builders/count.ts +86 -0
- package/src/data/query/pg-core/query-builders/delete.ts +293 -0
- package/src/data/query/pg-core/query-builders/index.ts +7 -0
- package/src/data/query/pg-core/query-builders/insert.ts +452 -0
- package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
- package/src/data/query/pg-core/query-builders/query.ts +157 -0
- package/src/data/query/pg-core/query-builders/raw.ts +49 -0
- package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
- package/src/data/query/pg-core/query-builders/select.ts +1346 -0
- package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
- package/src/data/query/pg-core/query-builders/update.ts +626 -0
- package/src/data/query/pg-core/roles.ts +41 -0
- package/src/data/query/pg-core/schema.ts +72 -0
- package/src/data/query/pg-core/sequence.ts +41 -0
- package/src/data/query/pg-core/session.ts +292 -0
- package/src/data/query/pg-core/subquery.ts +46 -0
- package/src/data/query/pg-core/table.ts +252 -0
- package/src/data/query/pg-core/unique-constraint.ts +73 -0
- package/src/data/query/pg-core/utils/array.ts +95 -0
- package/src/data/query/pg-core/utils/index.ts +1 -0
- package/src/data/query/pg-core/utils.ts +104 -0
- package/src/data/query/pg-core/view-base.ts +14 -0
- package/src/data/query/pg-core/view-common.ts +1 -0
- package/src/data/query/pg-core/view.ts +435 -0
- package/src/data/query/pg-core/with-builder.ts +41 -0
- package/src/data/query/postgres-js/README.md +46 -0
- package/src/data/query/postgres-js/array-parser.ts +45 -0
- package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
- package/src/data/query/postgres-js/driver.ts +163 -0
- package/src/data/query/postgres-js/index.ts +2 -0
- package/src/data/query/postgres-js/session.ts +234 -0
- package/src/data/query/primary-key.ts +11 -0
- package/src/data/query/query-builders/query-builder.ts +19 -0
- package/src/data/query/query-builders/select.types.ts +175 -0
- package/src/data/query/query-promise.ts +35 -0
- package/src/data/query/relations.ts +725 -0
- package/src/data/query/runnable-query.ts +12 -0
- package/src/data/query/selection-proxy.ts +121 -0
- package/src/data/query/session.ts +8 -0
- package/src/data/query/sql/expressions/conditions.ts +741 -0
- package/src/data/query/sql/expressions/index.ts +2 -0
- package/src/data/query/sql/expressions/select.ts +45 -0
- package/src/data/query/sql/functions/aggregate.ts +129 -0
- package/src/data/query/sql/functions/index.ts +2 -0
- package/src/data/query/sql/functions/vector.ts +178 -0
- package/src/data/query/sql/index.ts +3 -0
- package/src/data/query/sql/sql.ts +794 -0
- package/src/data/query/subquery.ts +53 -0
- package/src/data/query/table.ts +208 -0
- package/src/data/query/table.utils.ts +2 -0
- package/src/data/query/tracing-utils.ts +3 -0
- package/src/data/query/tracing.ts +11 -0
- package/src/data/query/utils.ts +357 -0
- package/src/data/query/version.ts +4 -0
- package/src/data/query/view-common.ts +1 -0
- package/src/data/schema/branded.ts +13 -0
- package/src/data/schema/generated/coerce.ts +5 -0
- package/src/data/schema/generated/combinator.ts +6 -0
- package/src/data/schema/generated/encoding.ts +5 -0
- package/src/data/schema/generated/error.ts +6 -0
- package/src/data/schema/generated/format.ts +5 -0
- package/src/data/schema/generated/type-constructor.ts +10 -0
- package/src/data/schema/generated/type.ts +6 -0
- package/src/data/schema/index.ts +6 -0
- package/src/data/schema/json-schema.ts +33 -0
- package/src/data/schema/namespace.ts +55 -0
- package/src/data/schema/parse.ts +39 -0
- package/src/data/schema/types.ts +39 -0
- package/src/data/temporal/append-only.ts +134 -0
- package/src/data/temporal/close.ts +27 -0
- package/src/data/temporal/columns.ts +10 -0
- package/src/data/temporal/definition-queries.ts +70 -0
- package/src/data/temporal/errors.ts +10 -0
- package/src/data/temporal/get-current.ts +22 -0
- package/src/data/temporal/index.ts +9 -0
- package/src/data/temporal/namespace.ts +36 -0
- package/src/data/temporal/query.ts +25 -0
- package/src/data/temporal/resolve.ts +17 -0
- package/src/data/temporal/revise.ts +67 -0
- package/src/data/temporal/types.ts +22 -0
- package/src/data/valve/artifact.ts +33 -0
- package/src/data/valve/contract-diff.ts +21 -0
- package/src/data/valve/cross.ts +57 -0
- package/src/data/valve/crossing-ledger.ts +50 -0
- package/src/data/valve/decision.ts +44 -0
- package/src/data/valve/durable-crossing.ts +52 -0
- package/src/data/valve/execute-crossing.ts +77 -0
- package/src/data/valve/faucet.ts +56 -0
- package/src/data/valve/gate.ts +114 -0
- package/src/data/valve/graph.ts +77 -0
- package/src/data/valve/index.ts +53 -0
- package/src/data/valve/namespace.ts +57 -0
- package/src/data/valve/registry.ts +50 -0
- package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
- package/src/data/valve/schema/valve-crossing.ts +9 -0
- package/src/data/valve/supply.ts +154 -0
- package/src/data/valve/types.ts +143 -0
- package/src/data/vector/columns.ts +27 -0
- package/src/data/vector/index.ts +4 -0
- package/src/data/vector/namespace.ts +33 -0
- package/src/data/vector/query.ts +85 -0
- package/src/data/vector/validate.ts +16 -0
- package/src/data/write/audit/actor.ts +15 -0
- package/src/data/write/audit/audit-columns.ts +18 -0
- package/src/data/write/audit/audit-select.ts +111 -0
- package/src/data/write/audit/bound-transaction.ts +14 -0
- package/src/data/write/audit/cte-compile.ts +32 -0
- package/src/data/write/audit/decode-returning.ts +47 -0
- package/src/data/write/audit/final-select.ts +43 -0
- package/src/data/write/audit/infra-audit.ts +36 -0
- package/src/data/write/audit/primary-key.ts +65 -0
- package/src/data/write/audit/projection.ts +41 -0
- package/src/data/write/audit/read-touches.ts +86 -0
- package/src/data/write/audit/touch-match.ts +78 -0
- package/src/data/write/audit/verb-delete.ts +62 -0
- package/src/data/write/audit/verb-insert.ts +36 -0
- package/src/data/write/audit/verb-select.ts +47 -0
- package/src/data/write/audit/verb-update.ts +60 -0
- package/src/data/write/audit/verb-upsert.ts +104 -0
- package/src/data/write/conflict.ts +43 -0
- package/src/data/write/delete.ts +38 -0
- package/src/data/write/execute.ts +243 -0
- package/src/data/write/index.ts +11 -0
- package/src/data/write/insert.ts +63 -0
- package/src/data/write/state.ts +43 -0
- package/src/data/write/update.ts +54 -0
- package/src/data/write/upsert.ts +58 -0
- package/src/data/write/values.ts +19 -0
- package/src/index.ts +230 -0
- package/src/infra/access-links/code.ts +70 -0
- package/src/infra/access-links/handle.ts +892 -0
- package/src/infra/access-links/index.ts +9 -0
- package/src/infra/access-links/namespace.ts +30 -0
- package/src/infra/access-links/person-check.ts +177 -0
- package/src/infra/access-links/schema.ts +71 -0
- package/src/infra/alerts/async-sources.ts +231 -0
- package/src/infra/alerts/audit.ts +36 -0
- package/src/infra/alerts/beat.ts +123 -0
- package/src/infra/alerts/client-faults.ts +111 -0
- package/src/infra/alerts/faults.ts +156 -0
- package/src/infra/alerts/handle.ts +778 -0
- package/src/infra/alerts/http.ts +192 -0
- package/src/infra/alerts/index.ts +12 -0
- package/src/infra/alerts/infra-sources.ts +180 -0
- package/src/infra/alerts/namespace.ts +81 -0
- package/src/infra/alerts/redact.ts +21 -0
- package/src/infra/alerts/request-faults.ts +41 -0
- package/src/infra/alerts/schema.ts +124 -0
- package/src/infra/alerts/sinks.ts +125 -0
- package/src/infra/alerts/source-options.ts +26 -0
- package/src/infra/alerts/sources.ts +503 -0
- package/src/infra/alerts/subsystem-sources.ts +137 -0
- package/src/infra/audit/emit.ts +87 -0
- package/src/infra/audit/index.ts +2 -0
- package/src/infra/audit/namespace.ts +22 -0
- package/src/infra/audit/schema.sql +35 -0
- package/src/infra/audit/types.ts +18 -0
- package/src/infra/aws/credentials.ts +147 -0
- package/src/infra/aws/sigv4.ts +140 -0
- package/src/infra/cache/create.ts +58 -0
- package/src/infra/cache/entry.ts +81 -0
- package/src/infra/cache/index.ts +4 -0
- package/src/infra/cache/namespace.ts +10 -0
- package/src/infra/cache/tenant.ts +93 -0
- package/src/infra/cache/types.ts +24 -0
- package/src/infra/crawl/audit.ts +35 -0
- package/src/infra/crawl/errors.ts +25 -0
- package/src/infra/crawl/handle.ts +693 -0
- package/src/infra/crawl/index.ts +9 -0
- package/src/infra/crawl/links.ts +160 -0
- package/src/infra/crawl/namespace.ts +36 -0
- package/src/infra/crawl/robots.ts +100 -0
- package/src/infra/crawl/schema.ts +89 -0
- package/src/infra/credit-line/handle.ts +883 -0
- package/src/infra/credit-line/index.ts +6 -0
- package/src/infra/credit-line/namespace.ts +7 -0
- package/src/infra/credit-line/schema.ts +96 -0
- package/src/infra/credits/handle.ts +706 -0
- package/src/infra/credits/index.ts +5 -0
- package/src/infra/credits/namespace.ts +7 -0
- package/src/infra/credits/schema.ts +83 -0
- package/src/infra/email/audit.ts +36 -0
- package/src/infra/email/inbound.ts +622 -0
- package/src/infra/email/index.ts +11 -0
- package/src/infra/email/mail.ts +517 -0
- package/src/infra/email/mime.ts +447 -0
- package/src/infra/email/namespace.ts +22 -0
- package/src/infra/email/providers.ts +111 -0
- package/src/infra/email/schema.ts +96 -0
- package/src/infra/email/sns.ts +200 -0
- package/src/infra/email/unsubscribe.ts +44 -0
- package/src/infra/fetch/address.ts +88 -0
- package/src/infra/fetch/connect-retry.ts +87 -0
- package/src/infra/fetch/handle.ts +329 -0
- package/src/infra/fetch/index.ts +7 -0
- package/src/infra/fetch/namespace.ts +70 -0
- package/src/infra/idempotency/index.ts +3 -0
- package/src/infra/idempotency/middleware.ts +87 -0
- package/src/infra/idempotency/store.ts +92 -0
- package/src/infra/idempotency/types.ts +30 -0
- package/src/infra/join-requests/handle.ts +312 -0
- package/src/infra/join-requests/index.ts +2 -0
- package/src/infra/join-requests/namespace.ts +7 -0
- package/src/infra/join-requests/schema.ts +33 -0
- package/src/infra/outbox/core.ts +165 -0
- package/src/infra/quota/errors.ts +32 -0
- package/src/infra/quota/handle.ts +215 -0
- package/src/infra/quota/index.ts +5 -0
- package/src/infra/quota/namespace.ts +7 -0
- package/src/infra/quota/schema.ts +15 -0
- package/src/infra/storage/backend.ts +34 -0
- package/src/infra/storage/handle.ts +513 -0
- package/src/infra/storage/index.ts +9 -0
- package/src/infra/storage/local.ts +104 -0
- package/src/infra/storage/namespace.ts +13 -0
- package/src/infra/storage/s3.ts +257 -0
- package/src/infra/storage/schema.ts +24 -0
- package/src/infra/support/handle.ts +869 -0
- package/src/infra/support/http.ts +229 -0
- package/src/infra/support/index.ts +7 -0
- package/src/infra/support/namespace.ts +12 -0
- package/src/infra/support/schema.ts +96 -0
- package/src/infra/webhook/inbound.ts +45 -0
- package/src/infra/webhook/index.ts +5 -0
- package/src/infra/webhook/namespace.ts +24 -0
- package/src/infra/webhook/outbound.ts +315 -0
- package/src/infra/webhook/sign.ts +32 -0
- package/src/infra/webhook/verify.ts +82 -0
- package/src/invariants/assert.ts +26 -0
- package/src/invariants/index.ts +1 -0
- package/src/lint/config.ts +56 -0
- package/src/lint/doctrine.ts +163 -0
- package/src/lint/include.ts +97 -0
- package/src/lint/index.ts +3 -0
- package/src/lint/preset.ts +10 -0
- package/src/lint/resolver.ts +218 -0
- package/src/lint/rules/no-reexports.ts +46 -0
- package/src/request/behavior/audited.ts +85 -0
- package/src/request/behavior/cached.ts +62 -0
- package/src/request/behavior/compose.ts +28 -0
- package/src/request/behavior/index.ts +5 -0
- package/src/request/behavior/namespace.ts +16 -0
- package/src/request/behavior/types.ts +26 -0
- package/src/request/behavior/versioned.ts +54 -0
- package/src/request/context/create.ts +103 -0
- package/src/request/context/guard.ts +49 -0
- package/src/request/context/index.ts +4 -0
- package/src/request/context/run-in-transaction.ts +200 -0
- package/src/request/context/store.ts +28 -0
- package/src/request/context/types.ts +50 -0
- package/src/request/di/builder.ts +535 -0
- package/src/request/di/index.ts +8 -0
- package/src/request/di/resolve.ts +271 -0
- package/src/request/di/types.ts +262 -0
- package/src/request/fitting/namespace.ts +7 -0
- package/src/request/fixture/batch.ts +71 -0
- package/src/request/fixture/builder.ts +26 -0
- package/src/request/fixture/errors.ts +10 -0
- package/src/request/fixture/index.ts +8 -0
- package/src/request/fixture/namespace.ts +23 -0
- package/src/request/fixture/paginate.ts +44 -0
- package/src/request/fixture/to-handlers.ts +260 -0
- package/src/request/fixture/types.ts +79 -0
- package/src/request/flow/act-as.ts +78 -0
- package/src/request/flow/namespace.ts +17 -0
- package/src/request/http/error-step.ts +42 -0
- package/src/request/http/file.ts +141 -0
- package/src/request/http/index.ts +4 -0
- package/src/request/http/middleware.ts +141 -0
- package/src/request/http/namespace.ts +5 -0
- package/src/request/http/rate-limit-classes.ts +170 -0
- package/src/request/http/response.ts +82 -0
- package/src/request/http/server.ts +916 -0
- package/src/request/http/sniff.ts +261 -0
- package/src/request/http/types.ts +250 -0
- package/src/request/http/upload.ts +284 -0
- package/src/request/internal/text.ts +6 -0
- package/src/request/openapi/generate.ts +205 -0
- package/src/request/openapi/index.ts +2 -0
- package/src/request/openapi/namespace.ts +7 -0
- package/src/test/auth.ts +13 -0
- package/src/test/auto-setup.ts +45 -0
- package/src/test/context.ts +91 -0
- package/src/test/crawl-fixture.ts +157 -0
- package/src/test/discover-fork.ts +17 -0
- package/src/test/fingerprint.ts +135 -0
- package/src/test/globals.d.ts +7 -0
- package/src/test/index.ts +19 -0
- package/src/test/namespace.ts +87 -0
- package/src/test/plugin.ts +189 -0
- package/src/test/progress.ts +185 -0
- package/src/test/reap-after-run.ts +28 -0
- package/src/test/reap.ts +286 -0
- package/src/test/reset.ts +253 -0
- package/src/test/savepoints.ts +172 -0
- package/src/test/setup.ts +1422 -0
- package/src/test/system-channel.ts +50 -0
- package/src/test/vitest-plugin.ts +142 -0
- package/src/test/vitest-workspace.ts +507 -0
- package/src/test/vitest.ts +333 -0
- package/src/test/watch.ts +105 -0
- package/src/trace/capture/bounded-serializer.ts +146 -0
- package/src/trace/cardinality/analyze.ts +173 -0
- package/src/trace/cardinality/branch-context.ts +214 -0
- package/src/trace/cardinality/check.ts +33 -0
- package/src/trace/cardinality/classify-edge.ts +64 -0
- package/src/trace/cardinality/structural-max.ts +107 -0
- package/src/trace/check/coverage-check.ts +188 -0
- package/src/trace/check/flow-check.ts +103 -0
- package/src/trace/check/flow-step-site.ts +234 -0
- package/src/trace/check/io-pattern.ts +116 -0
- package/src/trace/codemod/add-cardinality.ts +152 -0
- package/src/trace/codemod/run.ts +80 -0
- package/src/trace/entry/child-trace.ts +21 -0
- package/src/trace/entry/close-trace.ts +87 -0
- package/src/trace/entry/finalize-trace.ts +28 -0
- package/src/trace/entry/open-trace.ts +138 -0
- package/src/trace/entry/parent-trace.ts +20 -0
- package/src/trace/entry/parse-traceparent.ts +39 -0
- package/src/trace/entry/process-start.ts +38 -0
- package/src/trace/entry/trace-context.ts +26 -0
- package/src/trace/entry/tracing-enabled.ts +10 -0
- package/src/trace/external/record.ts +195 -0
- package/src/trace/external/report.ts +66 -0
- package/src/trace/namespace.ts +19 -0
- package/src/trace/partition/day.ts +47 -0
- package/src/trace/partition/index.ts +14 -0
- package/src/trace/partition/partition-name.ts +23 -0
- package/src/trace/partition/plan.ts +82 -0
- package/src/trace/partition/schedule.ts +26 -0
- package/src/trace/partition/startup-hook.ts +39 -0
- package/src/trace/partition/sync.ts +154 -0
- package/src/trace/partition/tables.ts +53 -0
- package/src/trace/read/tree.ts +83 -0
- package/src/trace/retain/copy-on-error.ts +76 -0
- package/src/trace/runtime/expire-stale-traces.ts +54 -0
- package/src/trace/runtime/flow-step.ts +147 -0
- package/src/trace/runtime/flush-steps.ts +31 -0
- package/src/trace/runtime/pending-writes.ts +54 -0
- package/src/trace/runtime/step-buffer.ts +298 -0
- package/src/trace/runtime/step-error.ts +21 -0
- package/src/trace/runtime/step-meta.ts +55 -0
- package/src/trace/runtime/thenable.ts +12 -0
- package/src/trace/runtime/truncate-trace.ts +62 -0
- package/src/trace/schema/trace-fields.ts +52 -0
- package/src/trace/schema/trace-retained.ts +22 -0
- package/src/trace/schema/trace-step-fields.ts +44 -0
- package/src/trace/schema/trace-step-retained.ts +25 -0
- package/src/trace/schema/trace-step.ts +18 -0
- package/src/trace/schema/trace.ts +12 -0
- package/src/trace/transformer/apply.ts +79 -0
- package/src/trace/transformer/build-meta-literal.ts +30 -0
- package/src/trace/transformer/find-flow-step-sites.ts +85 -0
- package/src/trace/transformer/inject-flow-step-import.ts +39 -0
- package/src/trace/transformer/transform-error.ts +14 -0
- package/src/trace/transformer/transform-flow-steps.ts +123 -0
- package/src/trace/transformer/wrap-function-declaration.ts +62 -0
- package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
- package/src/workspace/affected.ts +110 -0
- package/src/workspace/changed-files.ts +163 -0
- package/src/workspace/check-deps.ts +213 -0
- package/src/workspace/checksum.ts +20 -0
- package/src/workspace/dependency-graph.ts +67 -0
- package/src/workspace/detect-pipework-copies.ts +93 -0
- package/src/workspace/discover.ts +206 -0
- package/src/workspace/generate.ts +401 -0
- package/src/workspace/index.ts +7 -0
- package/src/workspace/module-imports-pipework.ts +39 -0
- package/src/workspace/module-package-name.ts +12 -0
- package/src/workspace/scrub-git-env.ts +23 -0
- package/src/workspace/source-paths.ts +36 -0
- package/src/workspace/sync.ts +182 -0
- package/dist/REFERENCE.md +0 -1477
- package/dist/infra/access-links/rate-limit.d.ts +0 -10
- package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
- package/dist/infra/access-links/rate-limit.js +0 -28
- package/dist/infra/access-links/rate-limit.js.map +0 -1
- package/dist/infra/email/sigv4.d.ts +0 -24
- package/dist/infra/email/sigv4.d.ts.map +0 -1
- package/dist/infra/email/sigv4.js +0 -55
- package/dist/infra/email/sigv4.js.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Applies the flow-step transformer to one source file: the entry point both
|
|
2
|
+
// the vitest plugin and the Node dev/serve loader call. Returns null without
|
|
3
|
+
// parsing when the source carries no `@flow_step`, so unannotated files cost a
|
|
4
|
+
// substring search. Types are kept in the output; the caller's own TypeScript
|
|
5
|
+
// stripping still runs after this.
|
|
6
|
+
|
|
7
|
+
import { existsSync } from 'node:fs'
|
|
8
|
+
import { dirname, join, resolve } from 'node:path'
|
|
9
|
+
|
|
10
|
+
import ts from 'typescript'
|
|
11
|
+
|
|
12
|
+
import { createFlowStepTransformer } from './transform-flow-steps.js'
|
|
13
|
+
import type { FlowStepTransformError } from './transform-error.js'
|
|
14
|
+
|
|
15
|
+
export interface AppliedFlowSteps {
|
|
16
|
+
readonly code: string
|
|
17
|
+
readonly errors: readonly FlowStepTransformError[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const rootCache = new Map<string, string>()
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The directory `ref` paths are relative to: the nearest ancestor holding
|
|
24
|
+
* `pipework.config.ts` (the directory `pipework check` runs from), else the
|
|
25
|
+
* nearest holding `package.json`, else the file's own directory.
|
|
26
|
+
*/
|
|
27
|
+
export function flowStepProjectRoot(fileName: string): string {
|
|
28
|
+
const start = dirname(resolve(fileName))
|
|
29
|
+
const cached = rootCache.get(start)
|
|
30
|
+
if (cached !== undefined) return cached
|
|
31
|
+
const found = walkUp(start, 'pipework.config.ts') ?? walkUp(start, 'package.json') ?? start
|
|
32
|
+
rootCache.set(start, found)
|
|
33
|
+
return found
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function walkUp(start: string, marker: string): string | null {
|
|
37
|
+
let dir = start
|
|
38
|
+
for (;;) {
|
|
39
|
+
if (existsSync(join(dir, marker))) return dir
|
|
40
|
+
const parent = dirname(dir)
|
|
41
|
+
if (parent === dir) return null
|
|
42
|
+
dir = parent
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Wraps every `@flow_step` declaration in `source`. Returns null when there is
|
|
48
|
+
* nothing to wrap. Throws one error naming every hard transform error: an
|
|
49
|
+
* annotated function left unwrapped records no trace and no audit.
|
|
50
|
+
*/
|
|
51
|
+
export function applyFlowStepTransform(
|
|
52
|
+
source: string,
|
|
53
|
+
fileName: string,
|
|
54
|
+
projectRoot: string = flowStepProjectRoot(fileName),
|
|
55
|
+
): AppliedFlowSteps | null {
|
|
56
|
+
if (!source.includes('@flow_step')) return null
|
|
57
|
+
const errors: FlowStepTransformError[] = []
|
|
58
|
+
const sourceFile = ts.createSourceFile(fileName, source, ts.ScriptTarget.ESNext, true)
|
|
59
|
+
const transformer = createFlowStepTransformer({
|
|
60
|
+
projectRoot,
|
|
61
|
+
runtimeImport: 'pipework',
|
|
62
|
+
onError: e => errors.push(e),
|
|
63
|
+
})
|
|
64
|
+
const result = ts.transform(sourceFile, [transformer])
|
|
65
|
+
try {
|
|
66
|
+
if (errors.length > 0) {
|
|
67
|
+
const lines = errors.map(e => ` ${e.file}:${String(e.line)} ${e.code}: ${e.message}`)
|
|
68
|
+
throw new Error(
|
|
69
|
+
`[pipework] @flow_step could not be applied — the annotated function(s) would run unwrapped:\n${lines.join('\n')}`,
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed })
|
|
73
|
+
const transformed = result.transformed[0]
|
|
74
|
+
if (transformed === undefined || transformed === sourceFile) return null
|
|
75
|
+
return { code: printer.printFile(transformed), errors }
|
|
76
|
+
} finally {
|
|
77
|
+
result.dispose()
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Builds the `FlowStepMeta` object literal the transformer bakes in at every
|
|
2
|
+
// wrap site. The `ref` is the `path:symbol` node id — the same shape the
|
|
3
|
+
// annotation grammar uses for `@upstream` / `@downstream` targets.
|
|
4
|
+
|
|
5
|
+
import ts from 'typescript'
|
|
6
|
+
|
|
7
|
+
export interface MetaTouchTarget {
|
|
8
|
+
readonly entity: string
|
|
9
|
+
readonly verb: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// `touches` (the `@touches Entity:verb` targets) is baked in only when
|
|
13
|
+
// non-empty, so an unaudited step keeps the plain `{ ref }` literal.
|
|
14
|
+
export function buildMetaLiteral(
|
|
15
|
+
factory: ts.NodeFactory,
|
|
16
|
+
ref: string,
|
|
17
|
+
touches: readonly MetaTouchTarget[] = [],
|
|
18
|
+
): ts.ObjectLiteralExpression {
|
|
19
|
+
const properties = [factory.createPropertyAssignment('ref', factory.createStringLiteral(ref))]
|
|
20
|
+
if (touches.length > 0) {
|
|
21
|
+
properties.push(factory.createPropertyAssignment(
|
|
22
|
+
'touches',
|
|
23
|
+
factory.createArrayLiteralExpression(touches.map(t => factory.createObjectLiteralExpression([
|
|
24
|
+
factory.createPropertyAssignment('entity', factory.createStringLiteral(t.entity)),
|
|
25
|
+
factory.createPropertyAssignment('verb', factory.createStringLiteral(t.verb)),
|
|
26
|
+
]))),
|
|
27
|
+
))
|
|
28
|
+
}
|
|
29
|
+
return factory.createObjectLiteralExpression(properties, false)
|
|
30
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Locates `@flow_step` annotation sites in a TS source file. A site pairs the
|
|
2
|
+
// parsed annotation with the top-level statement it documents and what shape
|
|
3
|
+
// that statement is — a named function declaration, a named single-declarator
|
|
4
|
+
// variable bound to a function, or something the transformer can't wrap. The
|
|
5
|
+
// flow-step transformer (component 5) reads this to decide what to rewrite.
|
|
6
|
+
|
|
7
|
+
import ts from 'typescript'
|
|
8
|
+
|
|
9
|
+
import { parseFlowStepAnnotation, type FlowStepParseResult } from 'pipework-flow-parser'
|
|
10
|
+
|
|
11
|
+
export type FlowStepSiteShape =
|
|
12
|
+
| { readonly kind: 'function-declaration'; readonly name: string }
|
|
13
|
+
| { readonly kind: 'variable-declaration'; readonly name: string }
|
|
14
|
+
| { readonly kind: 'rejected'; readonly reason: string }
|
|
15
|
+
|
|
16
|
+
export interface FlowStepSite {
|
|
17
|
+
readonly statement: ts.Statement
|
|
18
|
+
readonly shape: FlowStepSiteShape
|
|
19
|
+
readonly annotation: Exclude<FlowStepParseResult, { kind: 'not-a-flow-step' }>
|
|
20
|
+
/** 1-based line where the statement begins. */
|
|
21
|
+
readonly line: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Returns every `@flow_step` site in `sourceFile`, in source order. */
|
|
25
|
+
export function findFlowStepSites(sourceFile: ts.SourceFile): readonly FlowStepSite[] {
|
|
26
|
+
const sites: FlowStepSite[] = []
|
|
27
|
+
const text = sourceFile.getFullText()
|
|
28
|
+
for (const statement of sourceFile.statements) {
|
|
29
|
+
const annotation = leadingFlowStepAnnotation(statement, text)
|
|
30
|
+
if (annotation === null) continue
|
|
31
|
+
const line = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile)).line + 1
|
|
32
|
+
sites.push({ statement, shape: classifyShape(statement), annotation, line })
|
|
33
|
+
}
|
|
34
|
+
return sites
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function leadingFlowStepAnnotation(
|
|
38
|
+
statement: ts.Statement,
|
|
39
|
+
text: string,
|
|
40
|
+
): Exclude<FlowStepParseResult, { kind: 'not-a-flow-step' }> | null {
|
|
41
|
+
const ranges = ts.getLeadingCommentRanges(text, statement.getFullStart())
|
|
42
|
+
if (ranges === undefined) return null
|
|
43
|
+
for (const range of ranges) {
|
|
44
|
+
if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) continue
|
|
45
|
+
const block = text.slice(range.pos, range.end)
|
|
46
|
+
if (!block.startsWith('/**')) continue
|
|
47
|
+
const parsed = parseFlowStepAnnotation(block)
|
|
48
|
+
if (parsed.kind !== 'not-a-flow-step') return parsed
|
|
49
|
+
}
|
|
50
|
+
return null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function classifyShape(statement: ts.Statement): FlowStepSiteShape {
|
|
54
|
+
if (ts.isFunctionDeclaration(statement)) {
|
|
55
|
+
if (statement.name === undefined) {
|
|
56
|
+
return { kind: 'rejected', reason: 'function declaration has no name — anonymous default exports cannot be wrapped' }
|
|
57
|
+
}
|
|
58
|
+
if (hasDefaultModifier(statement)) {
|
|
59
|
+
return { kind: 'rejected', reason: 'default-exported function declarations cannot be wrapped; export the wrapper from a named binding instead' }
|
|
60
|
+
}
|
|
61
|
+
return { kind: 'function-declaration', name: statement.name.text }
|
|
62
|
+
}
|
|
63
|
+
if (ts.isVariableStatement(statement)) {
|
|
64
|
+
const declarations = statement.declarationList.declarations
|
|
65
|
+
if (declarations.length !== 1) {
|
|
66
|
+
return { kind: 'rejected', reason: 'multi-declarator variable statements cannot be wrapped — give the flow-step its own `const` binding' }
|
|
67
|
+
}
|
|
68
|
+
const decl = declarations[0]!
|
|
69
|
+
if (decl.initializer === undefined) {
|
|
70
|
+
return { kind: 'rejected', reason: 'flow-step variable has no initializer — bind it to an arrow or function expression' }
|
|
71
|
+
}
|
|
72
|
+
if (!ts.isArrowFunction(decl.initializer) && !ts.isFunctionExpression(decl.initializer)) {
|
|
73
|
+
return { kind: 'rejected', reason: 'flow-step variable initializer is not a function — bind it to an arrow or function expression' }
|
|
74
|
+
}
|
|
75
|
+
if (!ts.isIdentifier(decl.name)) {
|
|
76
|
+
return { kind: 'rejected', reason: 'flow-step variable name must be an identifier — destructuring patterns cannot be wrapped' }
|
|
77
|
+
}
|
|
78
|
+
return { kind: 'variable-declaration', name: decl.name.text }
|
|
79
|
+
}
|
|
80
|
+
return { kind: 'rejected', reason: 'flow-step annotation must document a function declaration or a single-declarator `const` bound to a function' }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function hasDefaultModifier(node: ts.HasModifiers): boolean {
|
|
84
|
+
return ts.getModifiers(node)?.some(m => m.kind === ts.SyntaxKind.DefaultKeyword) ?? false
|
|
85
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Ensures the wrapped source file imports `__flowStep` from the runtime
|
|
2
|
+
// package. Re-uses an existing named import from the same module specifier if
|
|
3
|
+
// one is present; otherwise injects a fresh import above the file's existing
|
|
4
|
+
// imports. A no-op when no flow step was wrapped.
|
|
5
|
+
|
|
6
|
+
import ts from 'typescript'
|
|
7
|
+
|
|
8
|
+
export function injectFlowStepImport(
|
|
9
|
+
sourceFile: ts.SourceFile,
|
|
10
|
+
runtimeImport: string,
|
|
11
|
+
factory: ts.NodeFactory,
|
|
12
|
+
): ts.SourceFile {
|
|
13
|
+
for (const statement of sourceFile.statements) {
|
|
14
|
+
if (!ts.isImportDeclaration(statement)) continue
|
|
15
|
+
if (!ts.isStringLiteral(statement.moduleSpecifier)) continue
|
|
16
|
+
if (statement.moduleSpecifier.text !== runtimeImport) continue
|
|
17
|
+
const clause = statement.importClause
|
|
18
|
+
if (clause === undefined || clause.namedBindings === undefined) continue
|
|
19
|
+
if (!ts.isNamedImports(clause.namedBindings)) continue
|
|
20
|
+
if (clause.namedBindings.elements.some(e => e.name.text === '__flowStep')) {
|
|
21
|
+
return sourceFile
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const newImport = factory.createImportDeclaration(
|
|
26
|
+
undefined,
|
|
27
|
+
factory.createImportClause(
|
|
28
|
+
false,
|
|
29
|
+
undefined,
|
|
30
|
+
factory.createNamedImports([
|
|
31
|
+
factory.createImportSpecifier(false, undefined, factory.createIdentifier('__flowStep')),
|
|
32
|
+
]),
|
|
33
|
+
),
|
|
34
|
+
factory.createStringLiteral(runtimeImport),
|
|
35
|
+
undefined,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return factory.updateSourceFile(sourceFile, [newImport, ...sourceFile.statements])
|
|
39
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Hard build errors the flow-step transformer can raise. Every code names one
|
|
2
|
+
// concrete malformation; every message tells the author what is wrong, what
|
|
3
|
+
// they probably meant, and how to fix it. See PLAN.tracing.md, Q3.
|
|
4
|
+
|
|
5
|
+
export type FlowStepTransformErrorCode =
|
|
6
|
+
| 'orphan-annotation'
|
|
7
|
+
| 'invalid-annotation'
|
|
8
|
+
|
|
9
|
+
export interface FlowStepTransformError {
|
|
10
|
+
readonly code: FlowStepTransformErrorCode
|
|
11
|
+
readonly file: string
|
|
12
|
+
readonly line: number
|
|
13
|
+
readonly message: string
|
|
14
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// The flow-step build transformer (component 5). A `ts.TransformerFactory`
|
|
2
|
+
// that finds every `@flow_step`-annotated top-level declaration in a source
|
|
3
|
+
// file and rewrites it as a value-wrapping pair: a renamed implementation and
|
|
4
|
+
// a `__flowStep(meta, impl)` binding that re-exposes the original name. The
|
|
5
|
+
// implementation body is preserved verbatim — there is no body rewriting.
|
|
6
|
+
//
|
|
7
|
+
// Off-the-traced-path overhead is one `getContext()` lookup and a branch (see
|
|
8
|
+
// `__flowStep`). `meta` is baked in as a literal at transform time: the
|
|
9
|
+
// wrapper never computes the step's identity.
|
|
10
|
+
//
|
|
11
|
+
// Hard errors (orphan annotations, default exports, unsupported shapes) are
|
|
12
|
+
// reported via `onError` and the offending statement is left untouched. The
|
|
13
|
+
// caller decides whether to fail the build.
|
|
14
|
+
|
|
15
|
+
import { posix, relative, sep } from 'node:path'
|
|
16
|
+
|
|
17
|
+
import ts from 'typescript'
|
|
18
|
+
|
|
19
|
+
import { findFlowStepSites, type FlowStepSite, type FlowStepSiteShape } from './find-flow-step-sites.js'
|
|
20
|
+
import type { MetaTouchTarget } from './build-meta-literal.js'
|
|
21
|
+
import { injectFlowStepImport } from './inject-flow-step-import.js'
|
|
22
|
+
import { wrapFunctionDeclaration } from './wrap-function-declaration.js'
|
|
23
|
+
import { wrapVariableDeclaration } from './wrap-variable-declaration.js'
|
|
24
|
+
import type { FlowStepTransformError } from './transform-error.js'
|
|
25
|
+
|
|
26
|
+
export interface FlowStepTransformOptions {
|
|
27
|
+
/** Project root — `ref` is derived as `<relative-path>:<symbol>`. */
|
|
28
|
+
readonly projectRoot: string
|
|
29
|
+
/** Module specifier the injected `__flowStep` import resolves to. */
|
|
30
|
+
readonly runtimeImport: string
|
|
31
|
+
/** Sink for hard build errors. The transformer never throws. */
|
|
32
|
+
readonly onError: (err: FlowStepTransformError) => void
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function createFlowStepTransformer(
|
|
36
|
+
options: FlowStepTransformOptions,
|
|
37
|
+
): ts.TransformerFactory<ts.SourceFile> {
|
|
38
|
+
return context => sourceFile => transformSourceFile(sourceFile, options, context.factory)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function transformSourceFile(
|
|
42
|
+
sourceFile: ts.SourceFile,
|
|
43
|
+
options: FlowStepTransformOptions,
|
|
44
|
+
factory: ts.NodeFactory,
|
|
45
|
+
): ts.SourceFile {
|
|
46
|
+
const sites = findFlowStepSites(sourceFile)
|
|
47
|
+
if (sites.length === 0) return sourceFile
|
|
48
|
+
|
|
49
|
+
const relPath = toPosixPath(relative(options.projectRoot, sourceFile.fileName))
|
|
50
|
+
let wrappedAny = false
|
|
51
|
+
const replacements = new Map<ts.Statement, readonly ts.Statement[]>()
|
|
52
|
+
|
|
53
|
+
for (const site of sites) {
|
|
54
|
+
const wrapped = wrapSite(site, sourceFile.fileName, relPath, factory, options.onError)
|
|
55
|
+
if (wrapped === null) continue
|
|
56
|
+
replacements.set(site.statement, wrapped)
|
|
57
|
+
wrappedAny = true
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!wrappedAny) return sourceFile
|
|
61
|
+
|
|
62
|
+
const newStatements: ts.Statement[] = []
|
|
63
|
+
for (const statement of sourceFile.statements) {
|
|
64
|
+
const wrapped = replacements.get(statement)
|
|
65
|
+
if (wrapped === undefined) {
|
|
66
|
+
newStatements.push(statement)
|
|
67
|
+
continue
|
|
68
|
+
}
|
|
69
|
+
newStatements.push(...wrapped)
|
|
70
|
+
}
|
|
71
|
+
const rewritten = factory.updateSourceFile(sourceFile, newStatements)
|
|
72
|
+
return injectFlowStepImport(rewritten, options.runtimeImport, factory)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function wrapSite(
|
|
76
|
+
site: FlowStepSite,
|
|
77
|
+
fileName: string,
|
|
78
|
+
relPath: string,
|
|
79
|
+
factory: ts.NodeFactory,
|
|
80
|
+
onError: (err: FlowStepTransformError) => void,
|
|
81
|
+
): readonly ts.Statement[] | null {
|
|
82
|
+
if (site.annotation.kind === 'invalid') {
|
|
83
|
+
for (const err of site.annotation.errors) {
|
|
84
|
+
onError({
|
|
85
|
+
code: 'invalid-annotation',
|
|
86
|
+
file: fileName,
|
|
87
|
+
line: site.line,
|
|
88
|
+
message: err.message,
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
return null
|
|
92
|
+
}
|
|
93
|
+
const shape = site.shape
|
|
94
|
+
if (shape.kind === 'rejected') {
|
|
95
|
+
onError({
|
|
96
|
+
code: 'orphan-annotation',
|
|
97
|
+
file: fileName,
|
|
98
|
+
line: site.line,
|
|
99
|
+
message: shape.reason,
|
|
100
|
+
})
|
|
101
|
+
return null
|
|
102
|
+
}
|
|
103
|
+
const ref = `${relPath}:${shape.name}`
|
|
104
|
+
const touches = site.annotation.annotation.touches
|
|
105
|
+
return dispatch(shape, site.statement, ref, factory, touches)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function dispatch(
|
|
109
|
+
shape: Exclude<FlowStepSiteShape, { kind: 'rejected' }>,
|
|
110
|
+
statement: ts.Statement,
|
|
111
|
+
ref: string,
|
|
112
|
+
factory: ts.NodeFactory,
|
|
113
|
+
touches: readonly MetaTouchTarget[],
|
|
114
|
+
): readonly ts.Statement[] {
|
|
115
|
+
if (shape.kind === 'function-declaration') {
|
|
116
|
+
return wrapFunctionDeclaration(statement as ts.FunctionDeclaration, shape.name, ref, factory, touches)
|
|
117
|
+
}
|
|
118
|
+
return wrapVariableDeclaration(statement as ts.VariableStatement, shape.name, ref, factory, touches)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function toPosixPath(filePath: string): string {
|
|
122
|
+
return sep === posix.sep ? filePath : filePath.split(sep).join(posix.sep)
|
|
123
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Wraps a `@flow_step`-annotated function declaration:
|
|
2
|
+
//
|
|
3
|
+
// /** @flow_step */
|
|
4
|
+
// export function foo(x: number): number { return x }
|
|
5
|
+
//
|
|
6
|
+
// becomes
|
|
7
|
+
//
|
|
8
|
+
// function foo__impl(x: number): number { return x }
|
|
9
|
+
// export const foo = __flowStep({ ref: 'src/x.ts:foo' }, foo__impl)
|
|
10
|
+
//
|
|
11
|
+
// The original body is preserved verbatim by reusing the implementation node;
|
|
12
|
+
// the wrapper is a fresh value binding. `export` is moved from the impl onto
|
|
13
|
+
// the wrapper so the public name keeps its existing visibility.
|
|
14
|
+
|
|
15
|
+
import ts from 'typescript'
|
|
16
|
+
|
|
17
|
+
import { buildMetaLiteral, type MetaTouchTarget } from './build-meta-literal.js'
|
|
18
|
+
|
|
19
|
+
export function wrapFunctionDeclaration(
|
|
20
|
+
original: ts.FunctionDeclaration,
|
|
21
|
+
name: string,
|
|
22
|
+
ref: string,
|
|
23
|
+
factory: ts.NodeFactory,
|
|
24
|
+
touches: readonly MetaTouchTarget[] = [],
|
|
25
|
+
): readonly ts.Statement[] {
|
|
26
|
+
const implName = `${name}__impl`
|
|
27
|
+
const originalModifiers = ts.getModifiers(original) ?? []
|
|
28
|
+
const isExported = originalModifiers.some(m => m.kind === ts.SyntaxKind.ExportKeyword)
|
|
29
|
+
const implModifiers = originalModifiers.filter(m => m.kind !== ts.SyntaxKind.ExportKeyword)
|
|
30
|
+
|
|
31
|
+
const impl = factory.createFunctionDeclaration(
|
|
32
|
+
implModifiers,
|
|
33
|
+
original.asteriskToken,
|
|
34
|
+
factory.createIdentifier(implName),
|
|
35
|
+
original.typeParameters,
|
|
36
|
+
original.parameters,
|
|
37
|
+
original.type,
|
|
38
|
+
original.body,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const wrapperModifiers = isExported
|
|
42
|
+
? [factory.createModifier(ts.SyntaxKind.ExportKeyword)]
|
|
43
|
+
: undefined
|
|
44
|
+
const wrapper = factory.createVariableStatement(
|
|
45
|
+
wrapperModifiers,
|
|
46
|
+
factory.createVariableDeclarationList(
|
|
47
|
+
[factory.createVariableDeclaration(
|
|
48
|
+
factory.createIdentifier(name),
|
|
49
|
+
undefined,
|
|
50
|
+
undefined,
|
|
51
|
+
factory.createCallExpression(
|
|
52
|
+
factory.createIdentifier('__flowStep'),
|
|
53
|
+
undefined,
|
|
54
|
+
[buildMetaLiteral(factory, ref, touches), factory.createIdentifier(implName)],
|
|
55
|
+
),
|
|
56
|
+
)],
|
|
57
|
+
ts.NodeFlags.Const,
|
|
58
|
+
),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
return [impl, wrapper]
|
|
62
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Wraps a `@flow_step`-annotated single-declarator `const`:
|
|
2
|
+
//
|
|
3
|
+
// /** @flow_step */
|
|
4
|
+
// export const foo = async (x: number): Promise<number> => x + 1
|
|
5
|
+
//
|
|
6
|
+
// becomes
|
|
7
|
+
//
|
|
8
|
+
// const foo__impl = async (x: number): Promise<number> => x + 1
|
|
9
|
+
// export const foo = __flowStep({ ref: 'src/x.ts:foo' }, foo__impl)
|
|
10
|
+
//
|
|
11
|
+
// The original initializer (arrow or function expression) is preserved by
|
|
12
|
+
// reference. `export` is moved from the impl binding onto the wrapper binding.
|
|
13
|
+
|
|
14
|
+
import ts from 'typescript'
|
|
15
|
+
|
|
16
|
+
import { buildMetaLiteral, type MetaTouchTarget } from './build-meta-literal.js'
|
|
17
|
+
|
|
18
|
+
export function wrapVariableDeclaration(
|
|
19
|
+
original: ts.VariableStatement,
|
|
20
|
+
name: string,
|
|
21
|
+
ref: string,
|
|
22
|
+
factory: ts.NodeFactory,
|
|
23
|
+
touches: readonly MetaTouchTarget[] = [],
|
|
24
|
+
): readonly ts.Statement[] {
|
|
25
|
+
const originalModifiers = ts.getModifiers(original) ?? []
|
|
26
|
+
const isExported = originalModifiers.some(m => m.kind === ts.SyntaxKind.ExportKeyword)
|
|
27
|
+
const declarator = original.declarationList.declarations[0]
|
|
28
|
+
if (declarator === undefined) {
|
|
29
|
+
throw new Error('wrapVariableDeclaration called on an empty declaration list — site classifier should have rejected this')
|
|
30
|
+
}
|
|
31
|
+
const implName = `${name}__impl`
|
|
32
|
+
|
|
33
|
+
const impl = factory.createVariableStatement(
|
|
34
|
+
undefined,
|
|
35
|
+
factory.createVariableDeclarationList(
|
|
36
|
+
[factory.createVariableDeclaration(
|
|
37
|
+
factory.createIdentifier(implName),
|
|
38
|
+
undefined,
|
|
39
|
+
declarator.type,
|
|
40
|
+
declarator.initializer,
|
|
41
|
+
)],
|
|
42
|
+
ts.NodeFlags.Const,
|
|
43
|
+
),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
const wrapperModifiers = isExported
|
|
47
|
+
? [factory.createModifier(ts.SyntaxKind.ExportKeyword)]
|
|
48
|
+
: undefined
|
|
49
|
+
const wrapper = factory.createVariableStatement(
|
|
50
|
+
wrapperModifiers,
|
|
51
|
+
factory.createVariableDeclarationList(
|
|
52
|
+
[factory.createVariableDeclaration(
|
|
53
|
+
factory.createIdentifier(name),
|
|
54
|
+
undefined,
|
|
55
|
+
undefined,
|
|
56
|
+
factory.createCallExpression(
|
|
57
|
+
factory.createIdentifier('__flowStep'),
|
|
58
|
+
undefined,
|
|
59
|
+
[buildMetaLiteral(factory, ref, touches), factory.createIdentifier(implName)],
|
|
60
|
+
),
|
|
61
|
+
)],
|
|
62
|
+
ts.NodeFlags.Const,
|
|
63
|
+
),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
return [impl, wrapper]
|
|
67
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { ResolvedModule } from './discover.js'
|
|
2
|
+
import type { DiffMode } from './changed-files.js'
|
|
3
|
+
import { changedFiles, filesToModules, resolveBaseBranch } from './changed-files.js'
|
|
4
|
+
import { buildModuleGraph } from './dependency-graph.js'
|
|
5
|
+
|
|
6
|
+
export interface ScopeResult {
|
|
7
|
+
readonly modules: ReadonlySet<string>
|
|
8
|
+
readonly all: boolean
|
|
9
|
+
/**
|
|
10
|
+
* The affected set could not be computed (no git, no base branch, …) so the
|
|
11
|
+
* scope was widened to every module rather than silently scoped to nothing.
|
|
12
|
+
* The caller should log this loudly. Issue #325.
|
|
13
|
+
*/
|
|
14
|
+
readonly failedOpen?: boolean
|
|
15
|
+
/**
|
|
16
|
+
* Human-readable statement of what this scope was computed FROM — the diff
|
|
17
|
+
* mode, base ref, and file count, or the flag that pinned it. Callers print
|
|
18
|
+
* it next to any result they report, so scope-of-invocation is always
|
|
19
|
+
* visible next to scope-of-claim and a green can never silently rest on an
|
|
20
|
+
* empty basis.
|
|
21
|
+
*/
|
|
22
|
+
readonly basis: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type ScopeMode =
|
|
26
|
+
| { kind: 'all' }
|
|
27
|
+
| { kind: 'module'; path: string }
|
|
28
|
+
| { kind: 'diff'; mode: DiffMode }
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* `configDir` anchors the diff: module paths are relative to the directory
|
|
32
|
+
* holding pipework.config.ts, so `changedFiles` must report paths in that same
|
|
33
|
+
* coordinate system. Passing the invocation cwd here reintroduces the
|
|
34
|
+
* path-prefix mismatch that made every scoped run widen to all modules
|
|
35
|
+
* whenever the config dir sat below the git toplevel.
|
|
36
|
+
*/
|
|
37
|
+
export function resolveAffected(
|
|
38
|
+
configDir: string,
|
|
39
|
+
resolvedModules: readonly ResolvedModule[],
|
|
40
|
+
projectName: string,
|
|
41
|
+
scope: ScopeMode,
|
|
42
|
+
baseBranches?: readonly string[],
|
|
43
|
+
): ScopeResult {
|
|
44
|
+
const allPaths = new Set(resolvedModules.map(m => m.relativePath))
|
|
45
|
+
|
|
46
|
+
if (resolvedModules.length === 0) {
|
|
47
|
+
return { modules: allPaths, all: true, basis: 'every module (none declared)' }
|
|
48
|
+
}
|
|
49
|
+
if (scope.kind === 'all') {
|
|
50
|
+
return { modules: allPaths, all: true, basis: 'every module (--all/--full)' }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (scope.kind === 'module') {
|
|
54
|
+
if (!allPaths.has(scope.path)) {
|
|
55
|
+
const known = [...allPaths].sort().join(', ')
|
|
56
|
+
throw new Error(
|
|
57
|
+
`Unknown module "${scope.path}".\n\n Known modules: ${known}\n`,
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
return { modules: new Set([scope.path]), all: false, basis: `--module ${scope.path}` }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const modeLabel = diffLabel(configDir, scope.mode, baseBranches)
|
|
64
|
+
|
|
65
|
+
const files = changedFiles(configDir, scope.mode, baseBranches)
|
|
66
|
+
if (files === null) {
|
|
67
|
+
// The diff could not be computed — fail open to every module rather than
|
|
68
|
+
// silently check nothing. Issue #325.
|
|
69
|
+
return {
|
|
70
|
+
modules: allPaths,
|
|
71
|
+
all: true,
|
|
72
|
+
failedOpen: true,
|
|
73
|
+
basis: `${modeLabel} — could not be computed; failed open to every module`,
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const fileCount = `${String(files.length)} changed file${files.length === 1 ? '' : 's'}`
|
|
77
|
+
if (files.length === 0) {
|
|
78
|
+
return { modules: new Set(), all: false, basis: `${modeLabel} — 0 changed files` }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const mapped = filesToModules(files, [...allPaths])
|
|
82
|
+
if (mapped.rootChanged) {
|
|
83
|
+
return {
|
|
84
|
+
modules: allPaths,
|
|
85
|
+
all: true,
|
|
86
|
+
basis: `${modeLabel} — ${fileCount}, including changes outside any module; widened to all modules`,
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (mapped.modules.size === 0) {
|
|
91
|
+
return { modules: new Set(), all: false, basis: `${modeLabel} — ${fileCount}, none inside a module` }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const graph = buildModuleGraph(resolvedModules, projectName)
|
|
95
|
+
return {
|
|
96
|
+
modules: graph.affected(mapped.modules),
|
|
97
|
+
all: false,
|
|
98
|
+
basis: `${modeLabel} — ${fileCount}`,
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function diffLabel(configDir: string, mode: DiffMode, baseBranches?: readonly string[]): string {
|
|
103
|
+
if (mode === 'branch') {
|
|
104
|
+
const base = resolveBaseBranch(configDir, baseBranches)
|
|
105
|
+
return base === null
|
|
106
|
+
? 'diff vs base branch (no base branch found)'
|
|
107
|
+
: `diff vs merge-base with '${base}'`
|
|
108
|
+
}
|
|
109
|
+
return mode === 'staged' ? 'staged changes' : 'uncommitted changes'
|
|
110
|
+
}
|