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.
Files changed (730) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/core/config/load.d.ts +2 -0
  3. package/dist/core/config/load.d.ts.map +1 -1
  4. package/dist/core/config/load.js +1 -0
  5. package/dist/core/config/load.js.map +1 -1
  6. package/dist/core/config/namespace.d.ts +1 -0
  7. package/dist/core/config/namespace.d.ts.map +1 -1
  8. package/dist/core/config/schema.d.ts +2 -0
  9. package/dist/core/config/schema.d.ts.map +1 -1
  10. package/dist/core/config/schema.js +1 -0
  11. package/dist/core/config/schema.js.map +1 -1
  12. package/dist/core/surface/types.d.ts +1 -0
  13. package/dist/core/surface/types.d.ts.map +1 -1
  14. package/dist/data/db/namespace.d.ts +3 -0
  15. package/dist/data/db/namespace.d.ts.map +1 -1
  16. package/dist/data/db/namespace.js +3 -0
  17. package/dist/data/db/namespace.js.map +1 -1
  18. package/dist/data/db/pool.d.ts.map +1 -1
  19. package/dist/data/db/pool.js +6 -1
  20. package/dist/data/db/pool.js.map +1 -1
  21. package/dist/data/db/query-label.d.ts +5 -0
  22. package/dist/data/db/query-label.d.ts.map +1 -0
  23. package/dist/data/db/query-label.js +11 -0
  24. package/dist/data/db/query-label.js.map +1 -0
  25. package/dist/data/db/query-watch.d.ts +21 -0
  26. package/dist/data/db/query-watch.d.ts.map +1 -0
  27. package/dist/data/db/query-watch.js +90 -0
  28. package/dist/data/db/query-watch.js.map +1 -0
  29. package/dist/data/query/postgres-js/driver.js +1 -1
  30. package/dist/data/query/postgres-js/driver.js.map +1 -1
  31. package/dist/data/query/postgres-js/session.d.ts +5 -1
  32. package/dist/data/query/postgres-js/session.d.ts.map +1 -1
  33. package/dist/data/query/postgres-js/session.js +16 -11
  34. package/dist/data/query/postgres-js/session.js.map +1 -1
  35. package/dist/data/query/utils.d.ts +2 -0
  36. package/dist/data/query/utils.d.ts.map +1 -1
  37. package/dist/data/query/utils.js.map +1 -1
  38. package/dist/infra/credits/schema.d.ts +1 -1
  39. package/dist/test/plugin.d.ts.map +1 -1
  40. package/dist/test/plugin.js +10 -4
  41. package/dist/test/plugin.js.map +1 -1
  42. package/package.json +4 -3
  43. package/src/async/jobs/abortable-delay.ts +18 -0
  44. package/src/async/jobs/claims.ts +52 -0
  45. package/src/async/jobs/cron.ts +179 -0
  46. package/src/async/jobs/errors.ts +56 -0
  47. package/src/async/jobs/exclusion.ts +117 -0
  48. package/src/async/jobs/execute.ts +219 -0
  49. package/src/async/jobs/index.ts +10 -0
  50. package/src/async/jobs/listener.ts +135 -0
  51. package/src/async/jobs/namespace.ts +20 -0
  52. package/src/async/jobs/queue-door.ts +44 -0
  53. package/src/async/jobs/queue.ts +1012 -0
  54. package/src/async/jobs/run-script.ts +67 -0
  55. package/src/async/jobs/scheduler.ts +218 -0
  56. package/src/async/jobs/schedules-table.ts +37 -0
  57. package/src/async/jobs/serialize-error.ts +48 -0
  58. package/src/async/jobs/table.ts +191 -0
  59. package/src/async/pipeline/define.ts +53 -0
  60. package/src/async/pipeline/errors.ts +35 -0
  61. package/src/async/pipeline/execute.ts +53 -0
  62. package/src/async/pipeline/index.ts +13 -0
  63. package/src/async/pipeline/namespace.ts +12 -0
  64. package/src/async/pipeline/resume.ts +67 -0
  65. package/src/async/pipeline/run-steps.ts +98 -0
  66. package/src/async/pipeline/types.ts +57 -0
  67. package/src/async/state-machine/define.ts +64 -0
  68. package/src/async/state-machine/errors.ts +29 -0
  69. package/src/async/state-machine/index.ts +3 -0
  70. package/src/async/state-machine/namespace.ts +12 -0
  71. package/src/async/state-machine/transition.ts +90 -0
  72. package/src/async/state-machine/types.ts +37 -0
  73. package/src/async/steps/errors.ts +31 -0
  74. package/src/async/steps/graph.ts +1214 -0
  75. package/src/async/steps/hash.ts +40 -0
  76. package/src/async/steps/index.ts +7 -0
  77. package/src/async/steps/namespace.ts +7 -0
  78. package/src/async/steps/table.ts +97 -0
  79. package/src/async/steps/types.ts +318 -0
  80. package/src/audit/chain/index.ts +9 -0
  81. package/src/audit/chain/install.ts +113 -0
  82. package/src/audit/chain/retire.ts +52 -0
  83. package/src/audit/chain/verify.ts +257 -0
  84. package/src/audit/query/cursor.ts +37 -0
  85. package/src/audit/query/index.ts +9 -0
  86. package/src/audit/query/query.ts +223 -0
  87. package/src/audit/schema/audit-record-fields.ts +68 -0
  88. package/src/audit/schema/audit-record.ts +23 -0
  89. package/src/auth/auth/audit.ts +31 -0
  90. package/src/auth/auth/chain.ts +84 -0
  91. package/src/auth/auth/cookie.ts +136 -0
  92. package/src/auth/auth/email-links.ts +311 -0
  93. package/src/auth/auth/guard.ts +128 -0
  94. package/src/auth/auth/index.ts +18 -0
  95. package/src/auth/auth/multi-org.ts +337 -0
  96. package/src/auth/auth/namespace.ts +34 -0
  97. package/src/auth/auth/parse-expiry.ts +13 -0
  98. package/src/auth/auth/passwords.ts +110 -0
  99. package/src/auth/auth/schema.ts +110 -0
  100. package/src/auth/auth/sessions.ts +565 -0
  101. package/src/auth/auth/sign-in.ts +156 -0
  102. package/src/auth/auth/signing-keys.ts +69 -0
  103. package/src/auth/auth/types.ts +26 -0
  104. package/src/auth/auth/uuid.ts +10 -0
  105. package/src/auth/rbac/cache.ts +55 -0
  106. package/src/auth/rbac/check.ts +30 -0
  107. package/src/auth/rbac/create.ts +35 -0
  108. package/src/auth/rbac/index.ts +5 -0
  109. package/src/auth/rbac/middleware.ts +20 -0
  110. package/src/auth/rbac/namespace.ts +15 -0
  111. package/src/auth/rbac/resolve.ts +31 -0
  112. package/src/auth/rbac/schema.sql +31 -0
  113. package/src/auth/rbac/seed.ts +67 -0
  114. package/src/auth/rbac/tables.ts +32 -0
  115. package/src/auth/rbac/types.ts +65 -0
  116. package/src/auth/tenant/extract.ts +33 -0
  117. package/src/auth/tenant/in-tenant.ts +49 -0
  118. package/src/auth/tenant/index.ts +7 -0
  119. package/src/auth/tenant/namespace.ts +23 -0
  120. package/src/auth/tenant/propagate.ts +20 -0
  121. package/src/auth/tenant/rls.ts +120 -0
  122. package/src/auth/tenant/scope.ts +33 -0
  123. package/src/auth/tenant/scoped-db.ts +581 -0
  124. package/src/auth/tenant/types.ts +14 -0
  125. package/src/auth/tenant/validate.ts +27 -0
  126. package/src/cli/commands/add.ts +158 -0
  127. package/src/cli/commands/alerts.ts +98 -0
  128. package/src/cli/commands/check.ts +1418 -0
  129. package/src/cli/commands/codemod.ts +78 -0
  130. package/src/cli/commands/db.ts +356 -0
  131. package/src/cli/commands/dev.ts +101 -0
  132. package/src/cli/commands/generate.ts +75 -0
  133. package/src/cli/commands/init.ts +36 -0
  134. package/src/cli/commands/install.ts +28 -0
  135. package/src/cli/commands/lint.ts +62 -0
  136. package/src/cli/commands/migrate.ts +132 -0
  137. package/src/cli/commands/openapi.ts +63 -0
  138. package/src/cli/commands/remove.ts +72 -0
  139. package/src/cli/commands/run.ts +50 -0
  140. package/src/cli/commands/scope.ts +54 -0
  141. package/src/cli/commands/serve.ts +68 -0
  142. package/src/cli/commands/shard.ts +31 -0
  143. package/src/cli/commands/shared/config-pipework-version.ts +28 -0
  144. package/src/cli/commands/shared/find-config.ts +22 -0
  145. package/src/cli/commands/shared/load-config.ts +35 -0
  146. package/src/cli/commands/shared/pnpm-install.ts +95 -0
  147. package/src/cli/commands/shared/report-removed.ts +8 -0
  148. package/src/cli/commands/sync.ts +32 -0
  149. package/src/cli/commands/test.ts +307 -0
  150. package/src/cli/commands/upgrade.ts +48 -0
  151. package/src/cli/dev-bootstrap.ts +24 -0
  152. package/src/cli/errors.ts +10 -0
  153. package/src/cli/index.ts +303 -0
  154. package/src/cli/output.ts +17 -0
  155. package/src/cli/port.ts +15 -0
  156. package/src/cli/surface-kinds.ts +20 -0
  157. package/src/client/index.ts +4 -0
  158. package/src/client/poll.ts +130 -0
  159. package/src/client/report-fault.ts +119 -0
  160. package/src/core/config/app-pool.ts +19 -0
  161. package/src/core/config/aws-env.ts +29 -0
  162. package/src/core/config/base-dir.ts +24 -0
  163. package/src/core/config/discover.ts +64 -0
  164. package/src/core/config/env-resolve.ts +87 -0
  165. package/src/core/config/env-types.ts +116 -0
  166. package/src/core/config/env.ts +55 -0
  167. package/src/core/config/errors.ts +9 -0
  168. package/src/core/config/import-config.ts +40 -0
  169. package/src/core/config/index.ts +8 -0
  170. package/src/core/config/load.ts +417 -0
  171. package/src/core/config/namespace.ts +14 -0
  172. package/src/core/config/resolve.ts +195 -0
  173. package/src/core/config/schema.ts +488 -0
  174. package/src/core/config/statement-observer.ts +48 -0
  175. package/src/core/config/ts-inline-hooks.ts +75 -0
  176. package/src/core/config/ts-register.ts +4 -0
  177. package/src/core/config/ts-resolve-hooks.ts +101 -0
  178. package/src/core/errors/base.ts +49 -0
  179. package/src/core/errors/http.ts +146 -0
  180. package/src/core/errors/index.ts +2 -0
  181. package/src/core/errors/namespace.ts +31 -0
  182. package/src/core/lifecycle/drain.ts +33 -0
  183. package/src/core/lifecycle/health.ts +72 -0
  184. package/src/core/lifecycle/index.ts +4 -0
  185. package/src/core/lifecycle/namespace.ts +7 -0
  186. package/src/core/lifecycle/startup.ts +102 -0
  187. package/src/core/lifecycle/types.ts +36 -0
  188. package/src/core/logging/context.ts +60 -0
  189. package/src/core/logging/error-chain.ts +68 -0
  190. package/src/core/logging/index.ts +5 -0
  191. package/src/core/logging/logger.ts +65 -0
  192. package/src/core/logging/namespace.ts +16 -0
  193. package/src/core/logging/proxy.ts +22 -0
  194. package/src/core/logging/redact-match.ts +24 -0
  195. package/src/core/logging/types.ts +47 -0
  196. package/src/core/pipework.ts +566 -0
  197. package/src/core/runtime/broker.ts +69 -0
  198. package/src/core/surface/http.ts +133 -0
  199. package/src/core/surface/index.ts +11 -0
  200. package/src/core/surface/job-timeout.ts +40 -0
  201. package/src/core/surface/namespace.ts +13 -0
  202. package/src/core/surface/script.ts +33 -0
  203. package/src/core/surface/start.ts +142 -0
  204. package/src/core/surface/types.ts +225 -0
  205. package/src/core/surface/validate.ts +88 -0
  206. package/src/core/surface/worker.ts +528 -0
  207. package/src/core/validation/connectivity.ts +49 -0
  208. package/src/core/validation/domain.ts +99 -0
  209. package/src/core/validation/index.ts +5 -0
  210. package/src/core/validation/queue-tables.ts +312 -0
  211. package/src/core/validation/rls-role.ts +138 -0
  212. package/src/core/validation/startup.ts +51 -0
  213. package/src/core/validation/surfaces.ts +65 -0
  214. package/src/core/validation/types.ts +25 -0
  215. package/src/data/db/advisory-lock.ts +55 -0
  216. package/src/data/db/aggregates.ts +172 -0
  217. package/src/data/db/array-elements.ts +111 -0
  218. package/src/data/db/bulk-set.ts +53 -0
  219. package/src/data/db/col/index.ts +14 -0
  220. package/src/data/db/composed.ts +53 -0
  221. package/src/data/db/db.ts +276 -0
  222. package/src/data/db/excluded.ts +16 -0
  223. package/src/data/db/expressions.ts +473 -0
  224. package/src/data/db/filter.ts +90 -0
  225. package/src/data/db/function-source.ts +114 -0
  226. package/src/data/db/identifiers.ts +16 -0
  227. package/src/data/db/idx/index.ts +9 -0
  228. package/src/data/db/in-list.ts +49 -0
  229. package/src/data/db/index.ts +9 -0
  230. package/src/data/db/insert-split.ts +137 -0
  231. package/src/data/db/instrumentation.ts +82 -0
  232. package/src/data/db/maintenance.ts +28 -0
  233. package/src/data/db/namespace.ts +107 -0
  234. package/src/data/db/owner-labels.ts +9 -0
  235. package/src/data/db/pool.ts +187 -0
  236. package/src/data/db/query-label.ts +13 -0
  237. package/src/data/db/query-watch.ts +116 -0
  238. package/src/data/db/raw-client-warning.ts +37 -0
  239. package/src/data/db/readonly.ts +23 -0
  240. package/src/data/db/reservation.ts +151 -0
  241. package/src/data/db/schema-features.ts +14 -0
  242. package/src/data/db/serializable.ts +83 -0
  243. package/src/data/db/sql.ts +1 -0
  244. package/src/data/db/timeouts.ts +76 -0
  245. package/src/data/db/types.ts +18 -0
  246. package/src/data/db/unbound.ts +33 -0
  247. package/src/data/db/values.ts +29 -0
  248. package/src/data/domain/brand.ts +15 -0
  249. package/src/data/domain/build-factory.ts +193 -0
  250. package/src/data/domain/build-schema.ts +161 -0
  251. package/src/data/domain/build-table.ts +355 -0
  252. package/src/data/domain/define.ts +239 -0
  253. package/src/data/domain/external-registry.ts +34 -0
  254. package/src/data/domain/external.ts +77 -0
  255. package/src/data/domain/field.ts +279 -0
  256. package/src/data/domain/index.ts +13 -0
  257. package/src/data/domain/naming.ts +6 -0
  258. package/src/data/domain/projections.ts +57 -0
  259. package/src/data/domain/trace-safe-projection.ts +31 -0
  260. package/src/data/domain/traits.ts +108 -0
  261. package/src/data/domain/types.ts +289 -0
  262. package/src/data/jsonb/composed.ts +18 -0
  263. package/src/data/jsonb/index.ts +1 -0
  264. package/src/data/jsonb/namespace.ts +30 -0
  265. package/src/data/jsonb/query.ts +86 -0
  266. package/src/data/migrate/append-only-generate.ts +47 -0
  267. package/src/data/migrate/applied.ts +47 -0
  268. package/src/data/migrate/apply.ts +309 -0
  269. package/src/data/migrate/check.ts +119 -0
  270. package/src/data/migrate/diff.ts +357 -0
  271. package/src/data/migrate/door-generate.ts +130 -0
  272. package/src/data/migrate/framework-rls.ts +58 -0
  273. package/src/data/migrate/generate.ts +201 -0
  274. package/src/data/migrate/history.ts +215 -0
  275. package/src/data/migrate/index.ts +9 -0
  276. package/src/data/migrate/internal-definitions.ts +175 -0
  277. package/src/data/migrate/post-process.ts +73 -0
  278. package/src/data/migrate/pragma.ts +73 -0
  279. package/src/data/migrate/provision-framework.ts +147 -0
  280. package/src/data/migrate/rls-generate.ts +61 -0
  281. package/src/data/migrate/run.ts +124 -0
  282. package/src/data/migrate/safety.ts +167 -0
  283. package/src/data/migrate/snapshot.ts +368 -0
  284. package/src/data/migrate/sql-emit.ts +392 -0
  285. package/src/data/migrate/statements.ts +312 -0
  286. package/src/data/query/alias.ts +126 -0
  287. package/src/data/query/batch.ts +8 -0
  288. package/src/data/query/cache/core/cache.ts +78 -0
  289. package/src/data/query/cache/core/index.ts +1 -0
  290. package/src/data/query/cache/core/types.ts +29 -0
  291. package/src/data/query/cache/readme.md +230 -0
  292. package/src/data/query/casing.ts +76 -0
  293. package/src/data/query/collation.ts +11 -0
  294. package/src/data/query/column-builder.ts +370 -0
  295. package/src/data/query/column.ts +150 -0
  296. package/src/data/query/entity.ts +42 -0
  297. package/src/data/query/errors.ts +33 -0
  298. package/src/data/query/index.ts +14 -0
  299. package/src/data/query/logger.ts +47 -0
  300. package/src/data/query/operations.ts +45 -0
  301. package/src/data/query/pg-core/alias.ts +12 -0
  302. package/src/data/query/pg-core/checks.ts +32 -0
  303. package/src/data/query/pg-core/columns/all.ts +71 -0
  304. package/src/data/query/pg-core/columns/bigint.ts +110 -0
  305. package/src/data/query/pg-core/columns/bigserial.ts +128 -0
  306. package/src/data/query/pg-core/columns/boolean.ts +43 -0
  307. package/src/data/query/pg-core/columns/char.ts +85 -0
  308. package/src/data/query/pg-core/columns/cidr.ts +43 -0
  309. package/src/data/query/pg-core/columns/common.ts +366 -0
  310. package/src/data/query/pg-core/columns/custom.ts +232 -0
  311. package/src/data/query/pg-core/columns/date.common.ts +15 -0
  312. package/src/data/query/pg-core/columns/date.ts +112 -0
  313. package/src/data/query/pg-core/columns/double-precision.ts +55 -0
  314. package/src/data/query/pg-core/columns/enum.ts +201 -0
  315. package/src/data/query/pg-core/columns/index.ts +35 -0
  316. package/src/data/query/pg-core/columns/inet.ts +43 -0
  317. package/src/data/query/pg-core/columns/int.common.ts +57 -0
  318. package/src/data/query/pg-core/columns/integer.ts +53 -0
  319. package/src/data/query/pg-core/columns/interval.ts +83 -0
  320. package/src/data/query/pg-core/columns/json.ts +58 -0
  321. package/src/data/query/pg-core/columns/jsonb.ts +56 -0
  322. package/src/data/query/pg-core/columns/line.ts +117 -0
  323. package/src/data/query/pg-core/columns/macaddr.ts +43 -0
  324. package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
  325. package/src/data/query/pg-core/columns/numeric.ts +227 -0
  326. package/src/data/query/pg-core/columns/point.ts +127 -0
  327. package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
  328. package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
  329. package/src/data/query/pg-core/columns/real.ts +58 -0
  330. package/src/data/query/pg-core/columns/serial.ts +55 -0
  331. package/src/data/query/pg-core/columns/smallint.ts +53 -0
  332. package/src/data/query/pg-core/columns/smallserial.ts +60 -0
  333. package/src/data/query/pg-core/columns/text.ts +67 -0
  334. package/src/data/query/pg-core/columns/time.ts +72 -0
  335. package/src/data/query/pg-core/columns/timestamp.ts +163 -0
  336. package/src/data/query/pg-core/columns/uuid.ts +51 -0
  337. package/src/data/query/pg-core/columns/varchar.ts +89 -0
  338. package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
  339. package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
  340. package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
  341. package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
  342. package/src/data/query/pg-core/db.ts +674 -0
  343. package/src/data/query/pg-core/dialect.ts +1404 -0
  344. package/src/data/query/pg-core/expressions.ts +25 -0
  345. package/src/data/query/pg-core/foreign-keys.ts +130 -0
  346. package/src/data/query/pg-core/index.ts +21 -0
  347. package/src/data/query/pg-core/indexes.ts +276 -0
  348. package/src/data/query/pg-core/policies.ts +56 -0
  349. package/src/data/query/pg-core/primary-keys.ts +62 -0
  350. package/src/data/query/pg-core/query-builders/count.ts +86 -0
  351. package/src/data/query/pg-core/query-builders/delete.ts +293 -0
  352. package/src/data/query/pg-core/query-builders/index.ts +7 -0
  353. package/src/data/query/pg-core/query-builders/insert.ts +452 -0
  354. package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
  355. package/src/data/query/pg-core/query-builders/query.ts +157 -0
  356. package/src/data/query/pg-core/query-builders/raw.ts +49 -0
  357. package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
  358. package/src/data/query/pg-core/query-builders/select.ts +1346 -0
  359. package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
  360. package/src/data/query/pg-core/query-builders/update.ts +626 -0
  361. package/src/data/query/pg-core/roles.ts +41 -0
  362. package/src/data/query/pg-core/schema.ts +72 -0
  363. package/src/data/query/pg-core/sequence.ts +41 -0
  364. package/src/data/query/pg-core/session.ts +292 -0
  365. package/src/data/query/pg-core/subquery.ts +46 -0
  366. package/src/data/query/pg-core/table.ts +252 -0
  367. package/src/data/query/pg-core/unique-constraint.ts +73 -0
  368. package/src/data/query/pg-core/utils/array.ts +95 -0
  369. package/src/data/query/pg-core/utils/index.ts +1 -0
  370. package/src/data/query/pg-core/utils.ts +104 -0
  371. package/src/data/query/pg-core/view-base.ts +14 -0
  372. package/src/data/query/pg-core/view-common.ts +1 -0
  373. package/src/data/query/pg-core/view.ts +435 -0
  374. package/src/data/query/pg-core/with-builder.ts +41 -0
  375. package/src/data/query/postgres-js/README.md +46 -0
  376. package/src/data/query/postgres-js/array-parser.ts +45 -0
  377. package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
  378. package/src/data/query/postgres-js/driver.ts +163 -0
  379. package/src/data/query/postgres-js/index.ts +2 -0
  380. package/src/data/query/postgres-js/session.ts +234 -0
  381. package/src/data/query/primary-key.ts +11 -0
  382. package/src/data/query/query-builders/query-builder.ts +19 -0
  383. package/src/data/query/query-builders/select.types.ts +175 -0
  384. package/src/data/query/query-promise.ts +35 -0
  385. package/src/data/query/relations.ts +725 -0
  386. package/src/data/query/runnable-query.ts +12 -0
  387. package/src/data/query/selection-proxy.ts +121 -0
  388. package/src/data/query/session.ts +8 -0
  389. package/src/data/query/sql/expressions/conditions.ts +741 -0
  390. package/src/data/query/sql/expressions/index.ts +2 -0
  391. package/src/data/query/sql/expressions/select.ts +45 -0
  392. package/src/data/query/sql/functions/aggregate.ts +129 -0
  393. package/src/data/query/sql/functions/index.ts +2 -0
  394. package/src/data/query/sql/functions/vector.ts +178 -0
  395. package/src/data/query/sql/index.ts +3 -0
  396. package/src/data/query/sql/sql.ts +794 -0
  397. package/src/data/query/subquery.ts +53 -0
  398. package/src/data/query/table.ts +208 -0
  399. package/src/data/query/table.utils.ts +2 -0
  400. package/src/data/query/tracing-utils.ts +3 -0
  401. package/src/data/query/tracing.ts +11 -0
  402. package/src/data/query/utils.ts +357 -0
  403. package/src/data/query/version.ts +4 -0
  404. package/src/data/query/view-common.ts +1 -0
  405. package/src/data/schema/branded.ts +13 -0
  406. package/src/data/schema/generated/coerce.ts +5 -0
  407. package/src/data/schema/generated/combinator.ts +6 -0
  408. package/src/data/schema/generated/encoding.ts +5 -0
  409. package/src/data/schema/generated/error.ts +6 -0
  410. package/src/data/schema/generated/format.ts +5 -0
  411. package/src/data/schema/generated/type-constructor.ts +10 -0
  412. package/src/data/schema/generated/type.ts +6 -0
  413. package/src/data/schema/index.ts +6 -0
  414. package/src/data/schema/json-schema.ts +33 -0
  415. package/src/data/schema/namespace.ts +55 -0
  416. package/src/data/schema/parse.ts +39 -0
  417. package/src/data/schema/types.ts +39 -0
  418. package/src/data/temporal/append-only.ts +134 -0
  419. package/src/data/temporal/close.ts +27 -0
  420. package/src/data/temporal/columns.ts +10 -0
  421. package/src/data/temporal/definition-queries.ts +70 -0
  422. package/src/data/temporal/errors.ts +10 -0
  423. package/src/data/temporal/get-current.ts +22 -0
  424. package/src/data/temporal/index.ts +9 -0
  425. package/src/data/temporal/namespace.ts +36 -0
  426. package/src/data/temporal/query.ts +25 -0
  427. package/src/data/temporal/resolve.ts +17 -0
  428. package/src/data/temporal/revise.ts +67 -0
  429. package/src/data/temporal/types.ts +22 -0
  430. package/src/data/valve/artifact.ts +33 -0
  431. package/src/data/valve/contract-diff.ts +21 -0
  432. package/src/data/valve/cross.ts +57 -0
  433. package/src/data/valve/crossing-ledger.ts +50 -0
  434. package/src/data/valve/decision.ts +44 -0
  435. package/src/data/valve/durable-crossing.ts +52 -0
  436. package/src/data/valve/execute-crossing.ts +77 -0
  437. package/src/data/valve/faucet.ts +56 -0
  438. package/src/data/valve/gate.ts +114 -0
  439. package/src/data/valve/graph.ts +77 -0
  440. package/src/data/valve/index.ts +53 -0
  441. package/src/data/valve/namespace.ts +57 -0
  442. package/src/data/valve/registry.ts +50 -0
  443. package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
  444. package/src/data/valve/schema/valve-crossing.ts +9 -0
  445. package/src/data/valve/supply.ts +154 -0
  446. package/src/data/valve/types.ts +143 -0
  447. package/src/data/vector/columns.ts +27 -0
  448. package/src/data/vector/index.ts +4 -0
  449. package/src/data/vector/namespace.ts +33 -0
  450. package/src/data/vector/query.ts +85 -0
  451. package/src/data/vector/validate.ts +16 -0
  452. package/src/data/write/audit/actor.ts +15 -0
  453. package/src/data/write/audit/audit-columns.ts +18 -0
  454. package/src/data/write/audit/audit-select.ts +111 -0
  455. package/src/data/write/audit/bound-transaction.ts +14 -0
  456. package/src/data/write/audit/cte-compile.ts +32 -0
  457. package/src/data/write/audit/decode-returning.ts +47 -0
  458. package/src/data/write/audit/final-select.ts +43 -0
  459. package/src/data/write/audit/infra-audit.ts +36 -0
  460. package/src/data/write/audit/primary-key.ts +65 -0
  461. package/src/data/write/audit/projection.ts +41 -0
  462. package/src/data/write/audit/read-touches.ts +86 -0
  463. package/src/data/write/audit/touch-match.ts +78 -0
  464. package/src/data/write/audit/verb-delete.ts +62 -0
  465. package/src/data/write/audit/verb-insert.ts +36 -0
  466. package/src/data/write/audit/verb-select.ts +47 -0
  467. package/src/data/write/audit/verb-update.ts +60 -0
  468. package/src/data/write/audit/verb-upsert.ts +104 -0
  469. package/src/data/write/conflict.ts +43 -0
  470. package/src/data/write/delete.ts +38 -0
  471. package/src/data/write/execute.ts +243 -0
  472. package/src/data/write/index.ts +11 -0
  473. package/src/data/write/insert.ts +63 -0
  474. package/src/data/write/state.ts +43 -0
  475. package/src/data/write/update.ts +54 -0
  476. package/src/data/write/upsert.ts +58 -0
  477. package/src/data/write/values.ts +19 -0
  478. package/src/index.ts +230 -0
  479. package/src/infra/access-links/code.ts +70 -0
  480. package/src/infra/access-links/handle.ts +892 -0
  481. package/src/infra/access-links/index.ts +9 -0
  482. package/src/infra/access-links/namespace.ts +30 -0
  483. package/src/infra/access-links/person-check.ts +177 -0
  484. package/src/infra/access-links/schema.ts +71 -0
  485. package/src/infra/alerts/async-sources.ts +231 -0
  486. package/src/infra/alerts/audit.ts +36 -0
  487. package/src/infra/alerts/beat.ts +123 -0
  488. package/src/infra/alerts/client-faults.ts +111 -0
  489. package/src/infra/alerts/faults.ts +156 -0
  490. package/src/infra/alerts/handle.ts +778 -0
  491. package/src/infra/alerts/http.ts +192 -0
  492. package/src/infra/alerts/index.ts +12 -0
  493. package/src/infra/alerts/infra-sources.ts +180 -0
  494. package/src/infra/alerts/namespace.ts +81 -0
  495. package/src/infra/alerts/redact.ts +21 -0
  496. package/src/infra/alerts/request-faults.ts +41 -0
  497. package/src/infra/alerts/schema.ts +124 -0
  498. package/src/infra/alerts/sinks.ts +125 -0
  499. package/src/infra/alerts/source-options.ts +26 -0
  500. package/src/infra/alerts/sources.ts +503 -0
  501. package/src/infra/alerts/subsystem-sources.ts +137 -0
  502. package/src/infra/audit/emit.ts +87 -0
  503. package/src/infra/audit/index.ts +2 -0
  504. package/src/infra/audit/namespace.ts +22 -0
  505. package/src/infra/audit/schema.sql +35 -0
  506. package/src/infra/audit/types.ts +18 -0
  507. package/src/infra/aws/credentials.ts +147 -0
  508. package/src/infra/aws/sigv4.ts +140 -0
  509. package/src/infra/cache/create.ts +58 -0
  510. package/src/infra/cache/entry.ts +81 -0
  511. package/src/infra/cache/index.ts +4 -0
  512. package/src/infra/cache/namespace.ts +10 -0
  513. package/src/infra/cache/tenant.ts +93 -0
  514. package/src/infra/cache/types.ts +24 -0
  515. package/src/infra/crawl/audit.ts +35 -0
  516. package/src/infra/crawl/errors.ts +25 -0
  517. package/src/infra/crawl/handle.ts +693 -0
  518. package/src/infra/crawl/index.ts +9 -0
  519. package/src/infra/crawl/links.ts +160 -0
  520. package/src/infra/crawl/namespace.ts +36 -0
  521. package/src/infra/crawl/robots.ts +100 -0
  522. package/src/infra/crawl/schema.ts +89 -0
  523. package/src/infra/credit-line/handle.ts +883 -0
  524. package/src/infra/credit-line/index.ts +6 -0
  525. package/src/infra/credit-line/namespace.ts +7 -0
  526. package/src/infra/credit-line/schema.ts +96 -0
  527. package/src/infra/credits/handle.ts +706 -0
  528. package/src/infra/credits/index.ts +5 -0
  529. package/src/infra/credits/namespace.ts +7 -0
  530. package/src/infra/credits/schema.ts +83 -0
  531. package/src/infra/email/audit.ts +36 -0
  532. package/src/infra/email/inbound.ts +622 -0
  533. package/src/infra/email/index.ts +11 -0
  534. package/src/infra/email/mail.ts +517 -0
  535. package/src/infra/email/mime.ts +447 -0
  536. package/src/infra/email/namespace.ts +22 -0
  537. package/src/infra/email/providers.ts +111 -0
  538. package/src/infra/email/schema.ts +96 -0
  539. package/src/infra/email/sns.ts +200 -0
  540. package/src/infra/email/unsubscribe.ts +44 -0
  541. package/src/infra/fetch/address.ts +88 -0
  542. package/src/infra/fetch/connect-retry.ts +87 -0
  543. package/src/infra/fetch/handle.ts +329 -0
  544. package/src/infra/fetch/index.ts +7 -0
  545. package/src/infra/fetch/namespace.ts +70 -0
  546. package/src/infra/idempotency/index.ts +3 -0
  547. package/src/infra/idempotency/middleware.ts +87 -0
  548. package/src/infra/idempotency/store.ts +92 -0
  549. package/src/infra/idempotency/types.ts +30 -0
  550. package/src/infra/join-requests/handle.ts +312 -0
  551. package/src/infra/join-requests/index.ts +2 -0
  552. package/src/infra/join-requests/namespace.ts +7 -0
  553. package/src/infra/join-requests/schema.ts +33 -0
  554. package/src/infra/outbox/core.ts +165 -0
  555. package/src/infra/quota/errors.ts +32 -0
  556. package/src/infra/quota/handle.ts +215 -0
  557. package/src/infra/quota/index.ts +5 -0
  558. package/src/infra/quota/namespace.ts +7 -0
  559. package/src/infra/quota/schema.ts +15 -0
  560. package/src/infra/storage/backend.ts +34 -0
  561. package/src/infra/storage/handle.ts +513 -0
  562. package/src/infra/storage/index.ts +9 -0
  563. package/src/infra/storage/local.ts +104 -0
  564. package/src/infra/storage/namespace.ts +13 -0
  565. package/src/infra/storage/s3.ts +257 -0
  566. package/src/infra/storage/schema.ts +24 -0
  567. package/src/infra/support/handle.ts +854 -0
  568. package/src/infra/support/http.ts +229 -0
  569. package/src/infra/support/index.ts +7 -0
  570. package/src/infra/support/namespace.ts +12 -0
  571. package/src/infra/support/schema.ts +96 -0
  572. package/src/infra/webhook/inbound.ts +45 -0
  573. package/src/infra/webhook/index.ts +5 -0
  574. package/src/infra/webhook/namespace.ts +24 -0
  575. package/src/infra/webhook/outbound.ts +315 -0
  576. package/src/infra/webhook/sign.ts +32 -0
  577. package/src/infra/webhook/verify.ts +82 -0
  578. package/src/invariants/assert.ts +26 -0
  579. package/src/invariants/index.ts +1 -0
  580. package/src/lint/config.ts +56 -0
  581. package/src/lint/doctrine.ts +163 -0
  582. package/src/lint/include.ts +97 -0
  583. package/src/lint/index.ts +3 -0
  584. package/src/lint/preset.ts +10 -0
  585. package/src/lint/resolver.ts +218 -0
  586. package/src/lint/rules/no-reexports.ts +46 -0
  587. package/src/request/behavior/audited.ts +85 -0
  588. package/src/request/behavior/cached.ts +62 -0
  589. package/src/request/behavior/compose.ts +28 -0
  590. package/src/request/behavior/index.ts +5 -0
  591. package/src/request/behavior/namespace.ts +16 -0
  592. package/src/request/behavior/types.ts +26 -0
  593. package/src/request/behavior/versioned.ts +54 -0
  594. package/src/request/context/create.ts +103 -0
  595. package/src/request/context/guard.ts +49 -0
  596. package/src/request/context/index.ts +4 -0
  597. package/src/request/context/run-in-transaction.ts +200 -0
  598. package/src/request/context/store.ts +28 -0
  599. package/src/request/context/types.ts +50 -0
  600. package/src/request/di/builder.ts +535 -0
  601. package/src/request/di/index.ts +8 -0
  602. package/src/request/di/resolve.ts +271 -0
  603. package/src/request/di/types.ts +262 -0
  604. package/src/request/fitting/namespace.ts +7 -0
  605. package/src/request/fixture/batch.ts +71 -0
  606. package/src/request/fixture/builder.ts +26 -0
  607. package/src/request/fixture/errors.ts +10 -0
  608. package/src/request/fixture/index.ts +8 -0
  609. package/src/request/fixture/namespace.ts +23 -0
  610. package/src/request/fixture/paginate.ts +44 -0
  611. package/src/request/fixture/to-handlers.ts +260 -0
  612. package/src/request/fixture/types.ts +79 -0
  613. package/src/request/flow/act-as.ts +78 -0
  614. package/src/request/flow/namespace.ts +17 -0
  615. package/src/request/http/error-step.ts +42 -0
  616. package/src/request/http/file.ts +141 -0
  617. package/src/request/http/index.ts +4 -0
  618. package/src/request/http/middleware.ts +141 -0
  619. package/src/request/http/namespace.ts +5 -0
  620. package/src/request/http/rate-limit-classes.ts +170 -0
  621. package/src/request/http/response.ts +82 -0
  622. package/src/request/http/server.ts +916 -0
  623. package/src/request/http/sniff.ts +261 -0
  624. package/src/request/http/types.ts +250 -0
  625. package/src/request/http/upload.ts +284 -0
  626. package/src/request/internal/text.ts +6 -0
  627. package/src/request/openapi/generate.ts +205 -0
  628. package/src/request/openapi/index.ts +2 -0
  629. package/src/request/openapi/namespace.ts +7 -0
  630. package/src/test/auth.ts +13 -0
  631. package/src/test/auto-setup.ts +45 -0
  632. package/src/test/context.ts +91 -0
  633. package/src/test/crawl-fixture.ts +157 -0
  634. package/src/test/discover-fork.ts +17 -0
  635. package/src/test/fingerprint.ts +135 -0
  636. package/src/test/globals.d.ts +7 -0
  637. package/src/test/index.ts +19 -0
  638. package/src/test/namespace.ts +87 -0
  639. package/src/test/plugin.ts +189 -0
  640. package/src/test/progress.ts +185 -0
  641. package/src/test/reap-after-run.ts +28 -0
  642. package/src/test/reap.ts +286 -0
  643. package/src/test/reset.ts +253 -0
  644. package/src/test/savepoints.ts +172 -0
  645. package/src/test/setup.ts +1422 -0
  646. package/src/test/system-channel.ts +50 -0
  647. package/src/test/vitest-plugin.ts +142 -0
  648. package/src/test/vitest-workspace.ts +507 -0
  649. package/src/test/vitest.ts +333 -0
  650. package/src/test/watch.ts +105 -0
  651. package/src/trace/capture/bounded-serializer.ts +146 -0
  652. package/src/trace/cardinality/analyze.ts +173 -0
  653. package/src/trace/cardinality/branch-context.ts +214 -0
  654. package/src/trace/cardinality/check.ts +33 -0
  655. package/src/trace/cardinality/classify-edge.ts +64 -0
  656. package/src/trace/cardinality/structural-max.ts +107 -0
  657. package/src/trace/check/coverage-check.ts +188 -0
  658. package/src/trace/check/flow-check.ts +103 -0
  659. package/src/trace/check/flow-step-site.ts +234 -0
  660. package/src/trace/check/io-pattern.ts +116 -0
  661. package/src/trace/codemod/add-cardinality.ts +152 -0
  662. package/src/trace/codemod/run.ts +80 -0
  663. package/src/trace/entry/child-trace.ts +21 -0
  664. package/src/trace/entry/close-trace.ts +87 -0
  665. package/src/trace/entry/finalize-trace.ts +28 -0
  666. package/src/trace/entry/open-trace.ts +138 -0
  667. package/src/trace/entry/parent-trace.ts +20 -0
  668. package/src/trace/entry/parse-traceparent.ts +39 -0
  669. package/src/trace/entry/process-start.ts +38 -0
  670. package/src/trace/entry/trace-context.ts +26 -0
  671. package/src/trace/entry/tracing-enabled.ts +10 -0
  672. package/src/trace/external/record.ts +195 -0
  673. package/src/trace/external/report.ts +66 -0
  674. package/src/trace/namespace.ts +19 -0
  675. package/src/trace/partition/day.ts +47 -0
  676. package/src/trace/partition/index.ts +14 -0
  677. package/src/trace/partition/partition-name.ts +23 -0
  678. package/src/trace/partition/plan.ts +82 -0
  679. package/src/trace/partition/schedule.ts +26 -0
  680. package/src/trace/partition/startup-hook.ts +39 -0
  681. package/src/trace/partition/sync.ts +154 -0
  682. package/src/trace/partition/tables.ts +53 -0
  683. package/src/trace/read/tree.ts +83 -0
  684. package/src/trace/retain/copy-on-error.ts +76 -0
  685. package/src/trace/runtime/expire-stale-traces.ts +54 -0
  686. package/src/trace/runtime/flow-step.ts +147 -0
  687. package/src/trace/runtime/flush-steps.ts +31 -0
  688. package/src/trace/runtime/pending-writes.ts +54 -0
  689. package/src/trace/runtime/step-buffer.ts +298 -0
  690. package/src/trace/runtime/step-error.ts +21 -0
  691. package/src/trace/runtime/step-meta.ts +55 -0
  692. package/src/trace/runtime/thenable.ts +12 -0
  693. package/src/trace/runtime/truncate-trace.ts +62 -0
  694. package/src/trace/schema/trace-fields.ts +52 -0
  695. package/src/trace/schema/trace-retained.ts +22 -0
  696. package/src/trace/schema/trace-step-fields.ts +44 -0
  697. package/src/trace/schema/trace-step-retained.ts +25 -0
  698. package/src/trace/schema/trace-step.ts +18 -0
  699. package/src/trace/schema/trace.ts +12 -0
  700. package/src/trace/transformer/apply.ts +79 -0
  701. package/src/trace/transformer/build-meta-literal.ts +30 -0
  702. package/src/trace/transformer/find-flow-step-sites.ts +85 -0
  703. package/src/trace/transformer/inject-flow-step-import.ts +39 -0
  704. package/src/trace/transformer/transform-error.ts +14 -0
  705. package/src/trace/transformer/transform-flow-steps.ts +123 -0
  706. package/src/trace/transformer/wrap-function-declaration.ts +62 -0
  707. package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
  708. package/src/workspace/affected.ts +110 -0
  709. package/src/workspace/changed-files.ts +163 -0
  710. package/src/workspace/check-deps.ts +213 -0
  711. package/src/workspace/checksum.ts +20 -0
  712. package/src/workspace/dependency-graph.ts +67 -0
  713. package/src/workspace/detect-pipework-copies.ts +93 -0
  714. package/src/workspace/discover.ts +206 -0
  715. package/src/workspace/generate.ts +401 -0
  716. package/src/workspace/index.ts +7 -0
  717. package/src/workspace/module-imports-pipework.ts +39 -0
  718. package/src/workspace/module-package-name.ts +12 -0
  719. package/src/workspace/scrub-git-env.ts +23 -0
  720. package/src/workspace/source-paths.ts +36 -0
  721. package/src/workspace/sync.ts +182 -0
  722. package/dist/REFERENCE.md +0 -1477
  723. package/dist/infra/access-links/rate-limit.d.ts +0 -10
  724. package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
  725. package/dist/infra/access-links/rate-limit.js +0 -28
  726. package/dist/infra/access-links/rate-limit.js.map +0 -1
  727. package/dist/infra/email/sigv4.d.ts +0 -24
  728. package/dist/infra/email/sigv4.d.ts.map +0 -1
  729. package/dist/infra/email/sigv4.js +0 -55
  730. 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
+ }