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,206 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
|
|
2
|
+
import { join, resolve } from 'node:path'
|
|
3
|
+
import type { ModuleConfig } from '../core/config/schema.js'
|
|
4
|
+
|
|
5
|
+
export interface ResolvedModule {
|
|
6
|
+
readonly key: string
|
|
7
|
+
readonly relativePath: string
|
|
8
|
+
readonly config: ModuleConfig
|
|
9
|
+
// Set by sync (which has fs access) — true when the module imports pipework at runtime,
|
|
10
|
+
// so the generator declares pipework in the module's dependencies. See generateModulePackageJson.
|
|
11
|
+
readonly importsPipework?: boolean
|
|
12
|
+
// The `name` in the module's own package.json — set only for a module with `managed: false`.
|
|
13
|
+
readonly packageName?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function resolveModules(
|
|
17
|
+
modules: Record<string, string | ModuleConfig> | undefined,
|
|
18
|
+
cwd: string,
|
|
19
|
+
): ResolvedModule[] {
|
|
20
|
+
if (modules === undefined) return []
|
|
21
|
+
|
|
22
|
+
const globs: Array<{ pattern: string; config: ModuleConfig }> = []
|
|
23
|
+
const explicit: Array<{ key: string; config: ModuleConfig }> = []
|
|
24
|
+
|
|
25
|
+
for (const [key, value] of Object.entries(modules)) {
|
|
26
|
+
const config = typeof value === 'string' ? {} : value
|
|
27
|
+
if (key.includes('*')) {
|
|
28
|
+
globs.push({ pattern: key, config })
|
|
29
|
+
} else {
|
|
30
|
+
explicit.push({ key, config })
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const expanded = new Map<string, ModuleConfig>()
|
|
35
|
+
|
|
36
|
+
for (const { pattern, config } of globs) {
|
|
37
|
+
for (const path of expandGlob(pattern, cwd)) {
|
|
38
|
+
expanded.set(path, config)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
for (const { key, config } of explicit) {
|
|
43
|
+
const existing = expanded.get(key)
|
|
44
|
+
if (existing !== undefined) {
|
|
45
|
+
expanded.set(key, mergeConfigs(existing, config))
|
|
46
|
+
} else {
|
|
47
|
+
expanded.set(key, config)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const results: ResolvedModule[] = []
|
|
52
|
+
for (const [relativePath, config] of [...expanded.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
53
|
+
const packageName = config.managed === false ? readOwnPackageName(relativePath, cwd) : undefined
|
|
54
|
+
results.push({ key: relativePath, relativePath, config, ...(packageName !== undefined ? { packageName } : {}) })
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return results
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function readOwnPackageName(relativePath: string, cwd: string): string {
|
|
61
|
+
const file = join(relativePath, 'package.json')
|
|
62
|
+
let parsed: unknown
|
|
63
|
+
try {
|
|
64
|
+
parsed = JSON.parse(readFileSync(join(cwd, file), 'utf-8'))
|
|
65
|
+
} catch (err) {
|
|
66
|
+
const why = (err as NodeJS.ErrnoException).code === 'ENOENT' ? 'does not exist' : 'is not valid JSON'
|
|
67
|
+
throw new Error(
|
|
68
|
+
`[pipework] Module "${relativePath}" has managed: false, but ${file} ${why}.\n\n` +
|
|
69
|
+
` A module that owns its manifests needs its own package.json with a "name".\n` +
|
|
70
|
+
` Fix: create ${file}, or remove managed: false to let pipework generate it.\n`,
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
const name = (parsed as Record<string, unknown> | null)?.['name']
|
|
74
|
+
if (typeof name !== 'string' || name === '') {
|
|
75
|
+
throw new Error(
|
|
76
|
+
`[pipework] Module "${relativePath}" has managed: false, but ${file} has no string "name".\n\n` +
|
|
77
|
+
` Pipework reads the package name from that file.\n` +
|
|
78
|
+
` Fix: add a "name" to ${file}, or remove managed: false to let pipework generate it.\n`,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
return name
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function expandGlob(pattern: string, cwd: string): string[] {
|
|
85
|
+
const parts = pattern.split('/')
|
|
86
|
+
const starIndex = parts.indexOf('*')
|
|
87
|
+
|
|
88
|
+
if (starIndex === -1) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`[pipework] Invalid modules glob: "${pattern}".\n\n` +
|
|
91
|
+
' Expected a glob pattern like "packages/*" or "apps/connectors/*".\n',
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const prefix = parts.slice(0, starIndex).join('/')
|
|
96
|
+
const parentDir = resolve(cwd, prefix)
|
|
97
|
+
|
|
98
|
+
let entries: string[]
|
|
99
|
+
try {
|
|
100
|
+
entries = readdirSync(parentDir)
|
|
101
|
+
} catch {
|
|
102
|
+
return []
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const results: string[] = []
|
|
106
|
+
for (const entry of entries.sort()) {
|
|
107
|
+
const fullPath = join(parentDir, entry)
|
|
108
|
+
try {
|
|
109
|
+
if (statSync(fullPath).isDirectory()) {
|
|
110
|
+
results.push(prefix + '/' + entry)
|
|
111
|
+
}
|
|
112
|
+
} catch {
|
|
113
|
+
continue
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return results
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function mergeConfigs(base: ModuleConfig, override: ModuleConfig): ModuleConfig {
|
|
121
|
+
return {
|
|
122
|
+
...base,
|
|
123
|
+
...override,
|
|
124
|
+
dependencies: override.dependencies !== undefined || base.dependencies !== undefined
|
|
125
|
+
? { ...base.dependencies, ...override.dependencies }
|
|
126
|
+
: undefined,
|
|
127
|
+
devDependencies: override.devDependencies !== undefined || base.devDependencies !== undefined
|
|
128
|
+
? { ...base.devDependencies, ...override.devDependencies }
|
|
129
|
+
: undefined,
|
|
130
|
+
scripts: override.scripts !== undefined || base.scripts !== undefined
|
|
131
|
+
? { ...base.scripts, ...override.scripts }
|
|
132
|
+
: undefined,
|
|
133
|
+
exports: override.exports !== undefined || base.exports !== undefined
|
|
134
|
+
? { ...base.exports, ...override.exports }
|
|
135
|
+
: undefined,
|
|
136
|
+
tsconfig: override.tsconfig !== undefined || base.tsconfig !== undefined
|
|
137
|
+
? { ...base.tsconfig, ...override.tsconfig }
|
|
138
|
+
: undefined,
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Every workspace package under `dir`, as paths relative to `dir`, deepest last.
|
|
144
|
+
*
|
|
145
|
+
* A package is a directory named by `dir`'s own workspace manifest (pnpm-workspace.yaml,
|
|
146
|
+
* or `workspaces` in package.json) that carries a package.json. A package that is itself
|
|
147
|
+
* a workspace root is expanded too — `packages/backend` declaring `app/*` yields
|
|
148
|
+
* `packages/backend`, `packages/backend/app/api`, and so on. Lint globs and lint targets
|
|
149
|
+
* are built from this, so a nested workspace is covered rather than silently skipped.
|
|
150
|
+
*/
|
|
151
|
+
export function discoverWorkspacePackages(dir: string, depth = 0): string[] {
|
|
152
|
+
if (depth > 8) return []
|
|
153
|
+
|
|
154
|
+
const out: string[] = []
|
|
155
|
+
for (const rel of readWorkspacePatterns(dir).flatMap(p => expandWorkspacePattern(p, dir))) {
|
|
156
|
+
if (!existsSync(join(dir, rel, 'package.json'))) continue
|
|
157
|
+
out.push(rel)
|
|
158
|
+
for (const nested of discoverWorkspacePackages(join(dir, rel), depth + 1)) {
|
|
159
|
+
out.push(rel + '/' + nested)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return [...new Set(out)].sort()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function readWorkspacePatterns(dir: string): string[] {
|
|
166
|
+
const yamlPath = join(dir, 'pnpm-workspace.yaml')
|
|
167
|
+
if (existsSync(yamlPath)) {
|
|
168
|
+
const patterns: string[] = []
|
|
169
|
+
for (const line of readFileSync(yamlPath, 'utf-8').split('\n')) {
|
|
170
|
+
const match = line.match(/^\s*-\s*["']?([^"'\s]+)["']?/)
|
|
171
|
+
if (match?.[1] !== undefined && match[1] !== '.') patterns.push(match[1])
|
|
172
|
+
}
|
|
173
|
+
return patterns
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const pkgPath = join(dir, 'package.json')
|
|
177
|
+
if (!existsSync(pkgPath)) return []
|
|
178
|
+
let parsed: unknown
|
|
179
|
+
try {
|
|
180
|
+
parsed = JSON.parse(readFileSync(pkgPath, 'utf-8'))
|
|
181
|
+
} catch {
|
|
182
|
+
return []
|
|
183
|
+
}
|
|
184
|
+
const workspaces = (parsed as Record<string, unknown> | null)?.['workspaces']
|
|
185
|
+
if (Array.isArray(workspaces)) return workspaces.filter((w): w is string => typeof w === 'string')
|
|
186
|
+
const packages = (workspaces as Record<string, unknown> | undefined)?.['packages']
|
|
187
|
+
if (Array.isArray(packages)) return packages.filter((w): w is string => typeof w === 'string')
|
|
188
|
+
return []
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// pnpm patterns are globs; only the trailing-`*` form (`packages/*`, `apps/**`) and a
|
|
192
|
+
// literal path appear in practice. Anything else is taken literally.
|
|
193
|
+
function expandWorkspacePattern(pattern: string, dir: string): string[] {
|
|
194
|
+
if (pattern.startsWith('!')) return []
|
|
195
|
+
const trimmed = pattern.replace(/\/\*\*?$/, '')
|
|
196
|
+
if (trimmed === pattern) return [pattern]
|
|
197
|
+
|
|
198
|
+
const baseDir = resolve(dir, trimmed)
|
|
199
|
+
let entries: string[]
|
|
200
|
+
try {
|
|
201
|
+
entries = readdirSync(baseDir, { withFileTypes: true }).filter(e => e.isDirectory()).map(e => e.name)
|
|
202
|
+
} catch {
|
|
203
|
+
return []
|
|
204
|
+
}
|
|
205
|
+
return entries.sort().map(name => (trimmed === '' ? name : trimmed + '/' + name))
|
|
206
|
+
}
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { computeChecksum } from './checksum.js'
|
|
2
|
+
import type { ResolvedModule } from './discover.js'
|
|
3
|
+
import { modulePackageName } from './module-package-name.js'
|
|
4
|
+
import { workspaceSourcePaths } from './source-paths.js'
|
|
5
|
+
|
|
6
|
+
const GENERATED_NOTICE = 'DO NOT EDIT — managed by Pipework. Deleted and regenerated by `pipework sync`.'
|
|
7
|
+
|
|
8
|
+
const DEFAULT_SCRIPTS: Readonly<Record<string, string>> = {
|
|
9
|
+
build: 'tsc',
|
|
10
|
+
lint: 'pipework lint',
|
|
11
|
+
test: 'vitest run',
|
|
12
|
+
// The config `pipework check` type-checks with: it resolves sibling packages from source.
|
|
13
|
+
'type-check': 'tsc --noEmit -p tsconfig.check.json',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// The pnpm a consumer gets when their config does not pin one. A box fact, not
|
|
17
|
+
// a pipework fact — `packageManager` in the config overrides it.
|
|
18
|
+
const DEFAULT_PACKAGE_MANAGER = 'pnpm@10.33.0'
|
|
19
|
+
|
|
20
|
+
const DEFAULT_DEV_DEPS: Readonly<Record<string, string>> = {
|
|
21
|
+
typescript: '^6.0.3',
|
|
22
|
+
vitest: '^4.1.5',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface WorkspaceConfig {
|
|
26
|
+
readonly name: string
|
|
27
|
+
readonly scripts?: Readonly<Record<string, string>>
|
|
28
|
+
readonly packageManager?: string
|
|
29
|
+
readonly dependencies?: Readonly<Record<string, string>>
|
|
30
|
+
readonly devDependencies?: Readonly<Record<string, string>>
|
|
31
|
+
readonly modules: readonly ResolvedModule[]
|
|
32
|
+
readonly pipeworkVersion: string
|
|
33
|
+
readonly hasVitest: boolean
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface GeneratedFile {
|
|
37
|
+
readonly relativePath: string
|
|
38
|
+
readonly content: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function generateWorkspace(config: WorkspaceConfig): GeneratedFile[] {
|
|
42
|
+
const files: GeneratedFile[] = []
|
|
43
|
+
|
|
44
|
+
files.push(generateRootPackageJson(config))
|
|
45
|
+
files.push(generatePreinstallGuard())
|
|
46
|
+
files.push(generateWorkspaceYaml(config))
|
|
47
|
+
files.push(generateBaseTsconfig())
|
|
48
|
+
|
|
49
|
+
files.push(generateEslintConfig())
|
|
50
|
+
|
|
51
|
+
if (config.hasVitest) {
|
|
52
|
+
files.push(generateVitestConfig())
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (config.modules.length > 0) {
|
|
56
|
+
files.push(generateCheckBaseTsconfig(config))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (const mod of config.modules) {
|
|
60
|
+
if (mod.config.managed === false) continue
|
|
61
|
+
files.push(generateModulePackageJson(mod, config))
|
|
62
|
+
files.push(generateModuleTsconfig(mod))
|
|
63
|
+
files.push(generateModuleCheckTsconfig(mod))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return files
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function generatePreinstallGuard(): GeneratedFile {
|
|
70
|
+
const script = [
|
|
71
|
+
`// ${GENERATED_NOTICE}`,
|
|
72
|
+
`'use strict';`,
|
|
73
|
+
`const fs = require('fs');`,
|
|
74
|
+
`const crypto = require('crypto');`,
|
|
75
|
+
``,
|
|
76
|
+
`function checksum(content) {`,
|
|
77
|
+
` const withoutChecksum = content.replace(/"_checksum":\\s*"[^"]*",?\\n?/, '');`,
|
|
78
|
+
` const hash = crypto.createHash('sha256').update(withoutChecksum).digest('hex').slice(0, 16);`,
|
|
79
|
+
` return 'sha256:' + hash;`,
|
|
80
|
+
`}`,
|
|
81
|
+
``,
|
|
82
|
+
`function check(file) {`,
|
|
83
|
+
` if (!fs.existsSync(file)) return;`,
|
|
84
|
+
` const raw = fs.readFileSync(file, 'utf8');`,
|
|
85
|
+
` let pkg;`,
|
|
86
|
+
` try { pkg = JSON.parse(raw); } catch { return; }`,
|
|
87
|
+
` if (!pkg._generated || !pkg._checksum) return;`,
|
|
88
|
+
` const expected = pkg._checksum;`,
|
|
89
|
+
` delete pkg._checksum;`,
|
|
90
|
+
` const actual = checksum(JSON.stringify(pkg, null, 2) + '\\n');`,
|
|
91
|
+
` if (expected !== actual) {`,
|
|
92
|
+
` console.error('\\n Pipework workspace files are stale.\\n Run: npx pipework install\\n');`,
|
|
93
|
+
` process.exit(1);`,
|
|
94
|
+
` }`,
|
|
95
|
+
`}`,
|
|
96
|
+
``,
|
|
97
|
+
`check('package.json');`,
|
|
98
|
+
``,
|
|
99
|
+
].join('\n')
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
relativePath: 'pipework-guard.cjs',
|
|
103
|
+
content: script,
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function generateRootPackageJson(config: WorkspaceConfig): GeneratedFile {
|
|
108
|
+
const pkg: Record<string, unknown> = {
|
|
109
|
+
_generated: GENERATED_NOTICE,
|
|
110
|
+
name: config.name,
|
|
111
|
+
private: true,
|
|
112
|
+
type: 'module',
|
|
113
|
+
packageManager: config.packageManager ?? DEFAULT_PACKAGE_MANAGER,
|
|
114
|
+
engines: { node: '>=22' },
|
|
115
|
+
scripts: {
|
|
116
|
+
preinstall: 'node -e "try{require(\'./pipework-guard.cjs\')}catch{}"',
|
|
117
|
+
...Object.fromEntries(
|
|
118
|
+
Object.entries(config.scripts ?? {}).filter(([k]) => k !== 'preinstall'),
|
|
119
|
+
),
|
|
120
|
+
},
|
|
121
|
+
...(config.dependencies !== undefined ? { dependencies: sortKeys(config.dependencies) } : {}),
|
|
122
|
+
devDependencies: sortKeys({
|
|
123
|
+
pipework: `^${config.pipeworkVersion}`,
|
|
124
|
+
...DEFAULT_DEV_DEPS,
|
|
125
|
+
}),
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const content = JSON.stringify(pkg, null, 2) + '\n'
|
|
129
|
+
const checksum = computeChecksum(content)
|
|
130
|
+
pkg['_checksum'] = checksum
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
relativePath: 'package.json',
|
|
134
|
+
content: JSON.stringify(pkg, null, 2) + '\n',
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function generateWorkspaceYaml(config: WorkspaceConfig): GeneratedFile {
|
|
139
|
+
const packages: string[] = ['.']
|
|
140
|
+
|
|
141
|
+
for (const mod of config.modules) {
|
|
142
|
+
packages.push(mod.relativePath)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const lines = [
|
|
146
|
+
`# ${GENERATED_NOTICE}`,
|
|
147
|
+
'packages:',
|
|
148
|
+
...packages.map(p => ` - "${p}"`),
|
|
149
|
+
'',
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
relativePath: 'pnpm-workspace.yaml',
|
|
154
|
+
content: lines.join('\n'),
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function generateBaseTsconfig(): GeneratedFile {
|
|
159
|
+
const tsconfig = {
|
|
160
|
+
compilerOptions: {
|
|
161
|
+
target: 'ES2022',
|
|
162
|
+
module: 'ESNext',
|
|
163
|
+
moduleResolution: 'bundler',
|
|
164
|
+
declaration: true,
|
|
165
|
+
declarationMap: true,
|
|
166
|
+
sourceMap: true,
|
|
167
|
+
strict: true,
|
|
168
|
+
exactOptionalPropertyTypes: true,
|
|
169
|
+
noUncheckedIndexedAccess: true,
|
|
170
|
+
noPropertyAccessFromIndexSignature: true,
|
|
171
|
+
useUnknownInCatchVariables: true,
|
|
172
|
+
noImplicitReturns: true,
|
|
173
|
+
noUnusedLocals: true,
|
|
174
|
+
esModuleInterop: true,
|
|
175
|
+
skipLibCheck: true,
|
|
176
|
+
forceConsistentCasingInFileNames: true,
|
|
177
|
+
resolveJsonModule: true,
|
|
178
|
+
isolatedModules: true,
|
|
179
|
+
verbatimModuleSyntax: true,
|
|
180
|
+
},
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
relativePath: 'tsconfig.base.json',
|
|
185
|
+
content: JSON.stringify(tsconfig, null, 2) + '\n',
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export const ESLINT_CONFIG_CONTENT = [
|
|
190
|
+
`// ${GENERATED_NOTICE}`,
|
|
191
|
+
`import { resolveLintConfig } from 'pipework/eslint'`,
|
|
192
|
+
``,
|
|
193
|
+
`// import.meta.dirname, not the process cwd: eslint resolves flat-config \`files\` globs`,
|
|
194
|
+
`// against this file's directory, so that is the root the globs must be built from.`,
|
|
195
|
+
`export default await resolveLintConfig(import.meta.dirname)`,
|
|
196
|
+
'',
|
|
197
|
+
].join('\n')
|
|
198
|
+
|
|
199
|
+
function generateEslintConfig(): GeneratedFile {
|
|
200
|
+
return {
|
|
201
|
+
relativePath: 'eslint.config.js',
|
|
202
|
+
content: ESLINT_CONFIG_CONTENT,
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export const VITEST_CONFIG_CONTENT = [
|
|
207
|
+
`// ${GENERATED_NOTICE}`,
|
|
208
|
+
`import { defineConfig } from 'vitest/config'`,
|
|
209
|
+
`import { resolveVitestConfig } from 'pipework/vitest'`,
|
|
210
|
+
``,
|
|
211
|
+
`export default defineConfig(await resolveVitestConfig())`,
|
|
212
|
+
'',
|
|
213
|
+
].join('\n')
|
|
214
|
+
|
|
215
|
+
function generateVitestConfig(): GeneratedFile {
|
|
216
|
+
return {
|
|
217
|
+
relativePath: 'vitest.config.ts',
|
|
218
|
+
content: VITEST_CONFIG_CONTENT,
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// A merged map where a module set a key to null: the key is removed, defaults included.
|
|
223
|
+
function withoutRemoved(map: Readonly<Record<string, string | null>>): Record<string, string> {
|
|
224
|
+
const kept: Record<string, string> = {}
|
|
225
|
+
for (const [key, value] of Object.entries(map)) {
|
|
226
|
+
if (value !== null) kept[key] = value
|
|
227
|
+
}
|
|
228
|
+
return kept
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function generateModulePackageJson(
|
|
232
|
+
mod: ResolvedModule,
|
|
233
|
+
config: WorkspaceConfig,
|
|
234
|
+
): GeneratedFile {
|
|
235
|
+
const moduleName = modulePackageName(mod, config.name)
|
|
236
|
+
const isPrivate = mod.config.private !== false
|
|
237
|
+
|
|
238
|
+
const mergedScripts = sortKeys(withoutRemoved({ ...DEFAULT_SCRIPTS, ...mod.config.scripts }))
|
|
239
|
+
const mergedDevDeps = sortKeys(withoutRemoved({
|
|
240
|
+
...DEFAULT_DEV_DEPS,
|
|
241
|
+
...config.devDependencies,
|
|
242
|
+
...mod.config.devDependencies,
|
|
243
|
+
}))
|
|
244
|
+
|
|
245
|
+
const pkg: Record<string, unknown> = {
|
|
246
|
+
_generated: GENERATED_NOTICE,
|
|
247
|
+
name: moduleName,
|
|
248
|
+
version: mod.config.version ?? '0.0.0',
|
|
249
|
+
private: isPrivate,
|
|
250
|
+
type: 'module',
|
|
251
|
+
engines: { node: '>=22' },
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const projectedExports = projectExports(mod.config.exports)
|
|
255
|
+
if (projectedExports !== undefined) {
|
|
256
|
+
pkg['exports'] = projectedExports
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (mod.config.files !== undefined) {
|
|
260
|
+
pkg['files'] = mod.config.files
|
|
261
|
+
}
|
|
262
|
+
if (mod.config.publishConfig !== undefined) {
|
|
263
|
+
pkg['publishConfig'] = mod.config.publishConfig
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
pkg['scripts'] = mergedScripts
|
|
267
|
+
|
|
268
|
+
const peerDeps = mod.config.peerDependencies
|
|
269
|
+
const deps: Record<string, string> = { ...mod.config.dependencies }
|
|
270
|
+
// A module that imports pipework at runtime declares it (not via root hoisting) — UNLESS it
|
|
271
|
+
// declares pipework as a peer (a leaf library), in which case the consumer provides pipework.
|
|
272
|
+
if (
|
|
273
|
+
mod.importsPipework === true &&
|
|
274
|
+
deps['pipework'] === undefined &&
|
|
275
|
+
peerDeps?.['pipework'] === undefined
|
|
276
|
+
) {
|
|
277
|
+
deps['pipework'] = config.pipeworkVersion
|
|
278
|
+
}
|
|
279
|
+
if (Object.keys(deps).length > 0) {
|
|
280
|
+
pkg['dependencies'] = sortKeys(deps)
|
|
281
|
+
}
|
|
282
|
+
if (peerDeps !== undefined && Object.keys(peerDeps).length > 0) {
|
|
283
|
+
pkg['peerDependencies'] = sortKeys(peerDeps)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
pkg['devDependencies'] = mergedDevDeps
|
|
287
|
+
|
|
288
|
+
const content = JSON.stringify(pkg, null, 2) + '\n'
|
|
289
|
+
const checksum = computeChecksum(content)
|
|
290
|
+
pkg['_checksum'] = checksum
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
relativePath: mod.relativePath + '/package.json',
|
|
294
|
+
content: JSON.stringify(pkg, null, 2) + '\n',
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function generateModuleTsconfig(mod: ResolvedModule): GeneratedFile {
|
|
299
|
+
const depth = mod.relativePath.split('/').length
|
|
300
|
+
const extendsPath = '../'.repeat(depth) + 'tsconfig.base.json'
|
|
301
|
+
|
|
302
|
+
const tsconfig: Record<string, unknown> = {
|
|
303
|
+
extends: extendsPath,
|
|
304
|
+
compilerOptions: {
|
|
305
|
+
rootDir: 'src',
|
|
306
|
+
outDir: 'dist',
|
|
307
|
+
...mod.config.tsconfig,
|
|
308
|
+
},
|
|
309
|
+
include: ['src'],
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return {
|
|
313
|
+
relativePath: mod.relativePath + '/tsconfig.json',
|
|
314
|
+
content: JSON.stringify(tsconfig, null, 2) + '\n',
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// `pipework check` type-checks each module from source, with no prior build.
|
|
319
|
+
// The build config (`tsconfig.json`) resolves siblings through `exports` →
|
|
320
|
+
// `dist/`, so it can only type-check once every dependency is built. The check
|
|
321
|
+
// config adds `paths` mappings (via `tsconfig.check.base.json`) that resolve
|
|
322
|
+
// `@scope/foo` straight to its `src/`, and overrides `rootDir` to the repo root
|
|
323
|
+
// so pulling a sibling's source into the program does not trip TS6059.
|
|
324
|
+
function generateModuleCheckTsconfig(mod: ResolvedModule): GeneratedFile {
|
|
325
|
+
const depth = mod.relativePath.split('/').length
|
|
326
|
+
const upToRoot = '../'.repeat(depth)
|
|
327
|
+
|
|
328
|
+
const tsconfig: Record<string, unknown> = {
|
|
329
|
+
extends: ['./tsconfig.json', upToRoot + 'tsconfig.check.base.json'],
|
|
330
|
+
compilerOptions: {
|
|
331
|
+
noEmit: true,
|
|
332
|
+
rootDir: upToRoot.slice(0, -1),
|
|
333
|
+
},
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return {
|
|
337
|
+
relativePath: mod.relativePath + '/tsconfig.check.json',
|
|
338
|
+
content: JSON.stringify(tsconfig, null, 2) + '\n',
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Maps every workspace package's export subpaths to their `src/` files, so
|
|
343
|
+
// `tsconfig.check.json` can resolve cross-package imports without a build.
|
|
344
|
+
// Shares `workspaceSourcePaths` with the vitest cross-package resolver so the
|
|
345
|
+
// two never drift.
|
|
346
|
+
function generateCheckBaseTsconfig(config: WorkspaceConfig): GeneratedFile {
|
|
347
|
+
const paths: Record<string, string[]> = {}
|
|
348
|
+
|
|
349
|
+
for (const [key, relPath] of workspaceSourcePaths(config.modules, config.name)) {
|
|
350
|
+
paths[key] = [`./${relPath}`]
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const tsconfig = {
|
|
354
|
+
compilerOptions: {
|
|
355
|
+
paths: sortKeys(paths),
|
|
356
|
+
},
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return {
|
|
360
|
+
relativePath: 'tsconfig.check.base.json',
|
|
361
|
+
content: JSON.stringify(tsconfig, null, 2) + '\n',
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function projectExports(
|
|
366
|
+
exports: Readonly<Record<string, string | { types: string; import: string }>> | undefined,
|
|
367
|
+
): Record<string, { types: string; import: string }> | undefined {
|
|
368
|
+
if (exports === undefined) {
|
|
369
|
+
return {
|
|
370
|
+
'.': { types: './dist/index.d.ts', import: './dist/index.js' },
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const result: Record<string, { types: string; import: string }> = {}
|
|
375
|
+
|
|
376
|
+
for (const [subpath, value] of Object.entries(exports)) {
|
|
377
|
+
if (typeof value === 'object') {
|
|
378
|
+
result[subpath] = value
|
|
379
|
+
} else {
|
|
380
|
+
result[subpath] = projectSourcePath(value)
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
return result
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function projectSourcePath(sourcePath: string): { types: string; import: string } {
|
|
388
|
+
const distPath = sourcePath.replace(/^\.\/src\//, './dist/')
|
|
389
|
+
const jsPath = distPath.replace(/\.ts$/, '.js')
|
|
390
|
+
const dtsPath = distPath.replace(/\.ts$/, '.d.ts')
|
|
391
|
+
|
|
392
|
+
return { types: dtsPath, import: jsPath }
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function sortKeys<T>(obj: Readonly<Record<string, T>>): Record<string, T> {
|
|
396
|
+
const sorted: Record<string, T> = {}
|
|
397
|
+
for (const key of Object.keys(obj).sort()) {
|
|
398
|
+
sorted[key] = obj[key]!
|
|
399
|
+
}
|
|
400
|
+
return sorted
|
|
401
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { sync, type SyncInput, type SyncResult } from './sync.js'
|
|
2
|
+
export { computeChecksum, checksumFromPackageJson, isStale } from './checksum.js'
|
|
3
|
+
export { resolveModules, type ResolvedModule } from './discover.js'
|
|
4
|
+
export { generateWorkspace, VITEST_CONFIG_CONTENT, type WorkspaceConfig, type GeneratedFile } from './generate.js'
|
|
5
|
+
export { buildModuleGraph, type ModuleGraph } from './dependency-graph.js'
|
|
6
|
+
export { changedFiles, filesToModules, type DiffMode } from './changed-files.js'
|
|
7
|
+
export { resolveAffected, type ScopeResult, type ScopeMode } from './affected.js'
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, type Dirent } from 'node:fs'
|
|
2
|
+
import { join } from 'node:path'
|
|
3
|
+
|
|
4
|
+
// A module that imports pipework at RUNTIME must declare pipework as a dependency rather
|
|
5
|
+
// than lean on root hoisting (the dep resolves today, but the module is not self-contained
|
|
6
|
+
// and breaks if hoisting changes). Detection: any non-test source file under the module's
|
|
7
|
+
// src/ with a value (non-type-only) import or re-export from 'pipework' or a 'pipework/...'
|
|
8
|
+
// subpath. Type-only imports are erased at build, and a module that imports pipework only
|
|
9
|
+
// from its tests is already covered by the generated devDependencies.
|
|
10
|
+
const RUNTIME_PIPEWORK_IMPORT =
|
|
11
|
+
/(?:^|\n)\s*(?:import|export)\s+(?!type\s)[^\n;]*?from\s*['"]pipework(?:\/[^'"]*)?['"]/
|
|
12
|
+
|
|
13
|
+
export function moduleImportsPipework(cwd: string, relativePath: string): boolean {
|
|
14
|
+
return scan(join(cwd, relativePath, 'src'))
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function scan(dir: string): boolean {
|
|
18
|
+
let entries: Dirent[]
|
|
19
|
+
try {
|
|
20
|
+
entries = readdirSync(dir, { withFileTypes: true })
|
|
21
|
+
} catch {
|
|
22
|
+
return false
|
|
23
|
+
}
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (entry.isDirectory()) {
|
|
26
|
+
if (entry.name === 'node_modules' || entry.name === 'dist') continue
|
|
27
|
+
if (scan(join(dir, entry.name))) return true
|
|
28
|
+
continue
|
|
29
|
+
}
|
|
30
|
+
if (!entry.name.endsWith('.ts')) continue
|
|
31
|
+
if (entry.name.endsWith('.d.ts') || entry.name.endsWith('.test.ts') || entry.name.endsWith('.spec.ts')) continue
|
|
32
|
+
try {
|
|
33
|
+
if (RUNTIME_PIPEWORK_IMPORT.test(readFileSync(join(dir, entry.name), 'utf-8'))) return true
|
|
34
|
+
} catch {
|
|
35
|
+
continue
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false
|
|
39
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { basename } from 'node:path'
|
|
2
|
+
import type { ResolvedModule } from './discover.js'
|
|
3
|
+
|
|
4
|
+
export function modulePackageName(mod: ResolvedModule, projectName: string): string {
|
|
5
|
+
if (mod.config.managed === false) {
|
|
6
|
+
if (mod.packageName === undefined) {
|
|
7
|
+
throw new Error(`[pipework] Module "${mod.relativePath}" has managed: false but its package name was not read from ${mod.relativePath}/package.json (resolve modules with resolveModules).`)
|
|
8
|
+
}
|
|
9
|
+
return mod.packageName
|
|
10
|
+
}
|
|
11
|
+
return mod.config.name ?? `@${projectName}/${basename(mod.relativePath)}`
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Git resolves the repository from environment variables (GIT_DIR,
|
|
2
|
+
// GIT_WORK_TREE, GIT_INDEX_FILE, ...) in preference to a subprocess's working
|
|
3
|
+
// directory. When git tooling runs inside a git hook, those variables are set
|
|
4
|
+
// and point at the hook's repository — so a `git` call meant to inspect a
|
|
5
|
+
// given `cwd` silently operates on the hook's repo instead, reads the wrong
|
|
6
|
+
// index, and can even mutate the wrong repo. Stripping them makes `cwd`
|
|
7
|
+
// authoritative again.
|
|
8
|
+
const GIT_LOCATION_VARS = [
|
|
9
|
+
'GIT_DIR',
|
|
10
|
+
'GIT_WORK_TREE',
|
|
11
|
+
'GIT_INDEX_FILE',
|
|
12
|
+
'GIT_OBJECT_DIRECTORY',
|
|
13
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
14
|
+
'GIT_COMMON_DIR',
|
|
15
|
+
'GIT_NAMESPACE',
|
|
16
|
+
'GIT_PREFIX',
|
|
17
|
+
] as const
|
|
18
|
+
|
|
19
|
+
export function scrubGitEnv(): NodeJS.ProcessEnv {
|
|
20
|
+
const env = { ...process.env }
|
|
21
|
+
for (const key of GIT_LOCATION_VARS) delete env[key]
|
|
22
|
+
return env
|
|
23
|
+
}
|