pipework 0.252.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 (690) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/package.json +4 -3
  3. package/src/async/jobs/abortable-delay.ts +18 -0
  4. package/src/async/jobs/claims.ts +52 -0
  5. package/src/async/jobs/cron.ts +179 -0
  6. package/src/async/jobs/errors.ts +56 -0
  7. package/src/async/jobs/exclusion.ts +117 -0
  8. package/src/async/jobs/execute.ts +219 -0
  9. package/src/async/jobs/index.ts +10 -0
  10. package/src/async/jobs/listener.ts +135 -0
  11. package/src/async/jobs/namespace.ts +20 -0
  12. package/src/async/jobs/queue-door.ts +44 -0
  13. package/src/async/jobs/queue.ts +1012 -0
  14. package/src/async/jobs/run-script.ts +67 -0
  15. package/src/async/jobs/scheduler.ts +218 -0
  16. package/src/async/jobs/schedules-table.ts +37 -0
  17. package/src/async/jobs/serialize-error.ts +48 -0
  18. package/src/async/jobs/table.ts +191 -0
  19. package/src/async/pipeline/define.ts +53 -0
  20. package/src/async/pipeline/errors.ts +35 -0
  21. package/src/async/pipeline/execute.ts +53 -0
  22. package/src/async/pipeline/index.ts +13 -0
  23. package/src/async/pipeline/namespace.ts +12 -0
  24. package/src/async/pipeline/resume.ts +67 -0
  25. package/src/async/pipeline/run-steps.ts +98 -0
  26. package/src/async/pipeline/types.ts +57 -0
  27. package/src/async/state-machine/define.ts +64 -0
  28. package/src/async/state-machine/errors.ts +29 -0
  29. package/src/async/state-machine/index.ts +3 -0
  30. package/src/async/state-machine/namespace.ts +12 -0
  31. package/src/async/state-machine/transition.ts +90 -0
  32. package/src/async/state-machine/types.ts +37 -0
  33. package/src/async/steps/errors.ts +31 -0
  34. package/src/async/steps/graph.ts +1214 -0
  35. package/src/async/steps/hash.ts +40 -0
  36. package/src/async/steps/index.ts +7 -0
  37. package/src/async/steps/namespace.ts +7 -0
  38. package/src/async/steps/table.ts +97 -0
  39. package/src/async/steps/types.ts +318 -0
  40. package/src/audit/chain/index.ts +9 -0
  41. package/src/audit/chain/install.ts +113 -0
  42. package/src/audit/chain/retire.ts +52 -0
  43. package/src/audit/chain/verify.ts +257 -0
  44. package/src/audit/query/cursor.ts +37 -0
  45. package/src/audit/query/index.ts +9 -0
  46. package/src/audit/query/query.ts +223 -0
  47. package/src/audit/schema/audit-record-fields.ts +68 -0
  48. package/src/audit/schema/audit-record.ts +23 -0
  49. package/src/auth/auth/audit.ts +31 -0
  50. package/src/auth/auth/chain.ts +84 -0
  51. package/src/auth/auth/cookie.ts +136 -0
  52. package/src/auth/auth/email-links.ts +311 -0
  53. package/src/auth/auth/guard.ts +128 -0
  54. package/src/auth/auth/index.ts +18 -0
  55. package/src/auth/auth/multi-org.ts +337 -0
  56. package/src/auth/auth/namespace.ts +34 -0
  57. package/src/auth/auth/parse-expiry.ts +13 -0
  58. package/src/auth/auth/passwords.ts +110 -0
  59. package/src/auth/auth/schema.ts +110 -0
  60. package/src/auth/auth/sessions.ts +565 -0
  61. package/src/auth/auth/sign-in.ts +156 -0
  62. package/src/auth/auth/signing-keys.ts +69 -0
  63. package/src/auth/auth/types.ts +26 -0
  64. package/src/auth/auth/uuid.ts +10 -0
  65. package/src/auth/rbac/cache.ts +55 -0
  66. package/src/auth/rbac/check.ts +30 -0
  67. package/src/auth/rbac/create.ts +35 -0
  68. package/src/auth/rbac/index.ts +5 -0
  69. package/src/auth/rbac/middleware.ts +20 -0
  70. package/src/auth/rbac/namespace.ts +15 -0
  71. package/src/auth/rbac/resolve.ts +31 -0
  72. package/src/auth/rbac/schema.sql +31 -0
  73. package/src/auth/rbac/seed.ts +67 -0
  74. package/src/auth/rbac/tables.ts +32 -0
  75. package/src/auth/rbac/types.ts +65 -0
  76. package/src/auth/tenant/extract.ts +33 -0
  77. package/src/auth/tenant/in-tenant.ts +49 -0
  78. package/src/auth/tenant/index.ts +7 -0
  79. package/src/auth/tenant/namespace.ts +23 -0
  80. package/src/auth/tenant/propagate.ts +20 -0
  81. package/src/auth/tenant/rls.ts +120 -0
  82. package/src/auth/tenant/scope.ts +33 -0
  83. package/src/auth/tenant/scoped-db.ts +581 -0
  84. package/src/auth/tenant/types.ts +14 -0
  85. package/src/auth/tenant/validate.ts +27 -0
  86. package/src/cli/commands/add.ts +158 -0
  87. package/src/cli/commands/alerts.ts +98 -0
  88. package/src/cli/commands/check.ts +1418 -0
  89. package/src/cli/commands/codemod.ts +78 -0
  90. package/src/cli/commands/db.ts +356 -0
  91. package/src/cli/commands/dev.ts +101 -0
  92. package/src/cli/commands/generate.ts +75 -0
  93. package/src/cli/commands/init.ts +36 -0
  94. package/src/cli/commands/install.ts +28 -0
  95. package/src/cli/commands/lint.ts +62 -0
  96. package/src/cli/commands/migrate.ts +132 -0
  97. package/src/cli/commands/openapi.ts +63 -0
  98. package/src/cli/commands/remove.ts +72 -0
  99. package/src/cli/commands/run.ts +50 -0
  100. package/src/cli/commands/scope.ts +54 -0
  101. package/src/cli/commands/serve.ts +68 -0
  102. package/src/cli/commands/shard.ts +31 -0
  103. package/src/cli/commands/shared/config-pipework-version.ts +28 -0
  104. package/src/cli/commands/shared/find-config.ts +22 -0
  105. package/src/cli/commands/shared/load-config.ts +35 -0
  106. package/src/cli/commands/shared/pnpm-install.ts +95 -0
  107. package/src/cli/commands/shared/report-removed.ts +8 -0
  108. package/src/cli/commands/sync.ts +32 -0
  109. package/src/cli/commands/test.ts +307 -0
  110. package/src/cli/commands/upgrade.ts +48 -0
  111. package/src/cli/dev-bootstrap.ts +24 -0
  112. package/src/cli/errors.ts +10 -0
  113. package/src/cli/index.ts +303 -0
  114. package/src/cli/output.ts +17 -0
  115. package/src/cli/port.ts +15 -0
  116. package/src/cli/surface-kinds.ts +20 -0
  117. package/src/client/index.ts +4 -0
  118. package/src/client/poll.ts +130 -0
  119. package/src/client/report-fault.ts +119 -0
  120. package/src/core/config/app-pool.ts +19 -0
  121. package/src/core/config/aws-env.ts +29 -0
  122. package/src/core/config/base-dir.ts +24 -0
  123. package/src/core/config/discover.ts +64 -0
  124. package/src/core/config/env-resolve.ts +87 -0
  125. package/src/core/config/env-types.ts +116 -0
  126. package/src/core/config/env.ts +55 -0
  127. package/src/core/config/errors.ts +9 -0
  128. package/src/core/config/import-config.ts +40 -0
  129. package/src/core/config/index.ts +8 -0
  130. package/src/core/config/load.ts +417 -0
  131. package/src/core/config/namespace.ts +14 -0
  132. package/src/core/config/resolve.ts +195 -0
  133. package/src/core/config/schema.ts +488 -0
  134. package/src/core/config/statement-observer.ts +48 -0
  135. package/src/core/config/ts-inline-hooks.ts +75 -0
  136. package/src/core/config/ts-register.ts +4 -0
  137. package/src/core/config/ts-resolve-hooks.ts +101 -0
  138. package/src/core/errors/base.ts +49 -0
  139. package/src/core/errors/http.ts +146 -0
  140. package/src/core/errors/index.ts +2 -0
  141. package/src/core/errors/namespace.ts +31 -0
  142. package/src/core/lifecycle/drain.ts +33 -0
  143. package/src/core/lifecycle/health.ts +72 -0
  144. package/src/core/lifecycle/index.ts +4 -0
  145. package/src/core/lifecycle/namespace.ts +7 -0
  146. package/src/core/lifecycle/startup.ts +102 -0
  147. package/src/core/lifecycle/types.ts +36 -0
  148. package/src/core/logging/context.ts +60 -0
  149. package/src/core/logging/error-chain.ts +68 -0
  150. package/src/core/logging/index.ts +5 -0
  151. package/src/core/logging/logger.ts +65 -0
  152. package/src/core/logging/namespace.ts +16 -0
  153. package/src/core/logging/proxy.ts +22 -0
  154. package/src/core/logging/redact-match.ts +24 -0
  155. package/src/core/logging/types.ts +47 -0
  156. package/src/core/pipework.ts +566 -0
  157. package/src/core/runtime/broker.ts +69 -0
  158. package/src/core/surface/http.ts +133 -0
  159. package/src/core/surface/index.ts +11 -0
  160. package/src/core/surface/job-timeout.ts +40 -0
  161. package/src/core/surface/namespace.ts +13 -0
  162. package/src/core/surface/script.ts +33 -0
  163. package/src/core/surface/start.ts +142 -0
  164. package/src/core/surface/types.ts +225 -0
  165. package/src/core/surface/validate.ts +88 -0
  166. package/src/core/surface/worker.ts +528 -0
  167. package/src/core/validation/connectivity.ts +49 -0
  168. package/src/core/validation/domain.ts +99 -0
  169. package/src/core/validation/index.ts +5 -0
  170. package/src/core/validation/queue-tables.ts +312 -0
  171. package/src/core/validation/rls-role.ts +138 -0
  172. package/src/core/validation/startup.ts +51 -0
  173. package/src/core/validation/surfaces.ts +65 -0
  174. package/src/core/validation/types.ts +25 -0
  175. package/src/data/db/advisory-lock.ts +55 -0
  176. package/src/data/db/aggregates.ts +172 -0
  177. package/src/data/db/array-elements.ts +111 -0
  178. package/src/data/db/bulk-set.ts +53 -0
  179. package/src/data/db/col/index.ts +14 -0
  180. package/src/data/db/composed.ts +53 -0
  181. package/src/data/db/db.ts +276 -0
  182. package/src/data/db/excluded.ts +16 -0
  183. package/src/data/db/expressions.ts +473 -0
  184. package/src/data/db/filter.ts +90 -0
  185. package/src/data/db/function-source.ts +114 -0
  186. package/src/data/db/identifiers.ts +16 -0
  187. package/src/data/db/idx/index.ts +9 -0
  188. package/src/data/db/in-list.ts +49 -0
  189. package/src/data/db/index.ts +9 -0
  190. package/src/data/db/insert-split.ts +137 -0
  191. package/src/data/db/instrumentation.ts +82 -0
  192. package/src/data/db/maintenance.ts +28 -0
  193. package/src/data/db/namespace.ts +107 -0
  194. package/src/data/db/owner-labels.ts +9 -0
  195. package/src/data/db/pool.ts +187 -0
  196. package/src/data/db/query-label.ts +13 -0
  197. package/src/data/db/query-watch.ts +116 -0
  198. package/src/data/db/raw-client-warning.ts +37 -0
  199. package/src/data/db/readonly.ts +23 -0
  200. package/src/data/db/reservation.ts +151 -0
  201. package/src/data/db/schema-features.ts +14 -0
  202. package/src/data/db/serializable.ts +83 -0
  203. package/src/data/db/sql.ts +1 -0
  204. package/src/data/db/timeouts.ts +76 -0
  205. package/src/data/db/types.ts +18 -0
  206. package/src/data/db/unbound.ts +33 -0
  207. package/src/data/db/values.ts +29 -0
  208. package/src/data/domain/brand.ts +15 -0
  209. package/src/data/domain/build-factory.ts +193 -0
  210. package/src/data/domain/build-schema.ts +161 -0
  211. package/src/data/domain/build-table.ts +355 -0
  212. package/src/data/domain/define.ts +239 -0
  213. package/src/data/domain/external-registry.ts +34 -0
  214. package/src/data/domain/external.ts +77 -0
  215. package/src/data/domain/field.ts +279 -0
  216. package/src/data/domain/index.ts +13 -0
  217. package/src/data/domain/naming.ts +6 -0
  218. package/src/data/domain/projections.ts +57 -0
  219. package/src/data/domain/trace-safe-projection.ts +31 -0
  220. package/src/data/domain/traits.ts +108 -0
  221. package/src/data/domain/types.ts +289 -0
  222. package/src/data/jsonb/composed.ts +18 -0
  223. package/src/data/jsonb/index.ts +1 -0
  224. package/src/data/jsonb/namespace.ts +30 -0
  225. package/src/data/jsonb/query.ts +86 -0
  226. package/src/data/migrate/append-only-generate.ts +47 -0
  227. package/src/data/migrate/applied.ts +47 -0
  228. package/src/data/migrate/apply.ts +309 -0
  229. package/src/data/migrate/check.ts +119 -0
  230. package/src/data/migrate/diff.ts +357 -0
  231. package/src/data/migrate/door-generate.ts +130 -0
  232. package/src/data/migrate/framework-rls.ts +58 -0
  233. package/src/data/migrate/generate.ts +201 -0
  234. package/src/data/migrate/history.ts +215 -0
  235. package/src/data/migrate/index.ts +9 -0
  236. package/src/data/migrate/internal-definitions.ts +175 -0
  237. package/src/data/migrate/post-process.ts +73 -0
  238. package/src/data/migrate/pragma.ts +73 -0
  239. package/src/data/migrate/provision-framework.ts +147 -0
  240. package/src/data/migrate/rls-generate.ts +61 -0
  241. package/src/data/migrate/run.ts +124 -0
  242. package/src/data/migrate/safety.ts +167 -0
  243. package/src/data/migrate/snapshot.ts +368 -0
  244. package/src/data/migrate/sql-emit.ts +392 -0
  245. package/src/data/migrate/statements.ts +312 -0
  246. package/src/data/query/alias.ts +126 -0
  247. package/src/data/query/batch.ts +8 -0
  248. package/src/data/query/cache/core/cache.ts +78 -0
  249. package/src/data/query/cache/core/index.ts +1 -0
  250. package/src/data/query/cache/core/types.ts +29 -0
  251. package/src/data/query/cache/readme.md +230 -0
  252. package/src/data/query/casing.ts +76 -0
  253. package/src/data/query/collation.ts +11 -0
  254. package/src/data/query/column-builder.ts +370 -0
  255. package/src/data/query/column.ts +150 -0
  256. package/src/data/query/entity.ts +42 -0
  257. package/src/data/query/errors.ts +33 -0
  258. package/src/data/query/index.ts +14 -0
  259. package/src/data/query/logger.ts +47 -0
  260. package/src/data/query/operations.ts +45 -0
  261. package/src/data/query/pg-core/alias.ts +12 -0
  262. package/src/data/query/pg-core/checks.ts +32 -0
  263. package/src/data/query/pg-core/columns/all.ts +71 -0
  264. package/src/data/query/pg-core/columns/bigint.ts +110 -0
  265. package/src/data/query/pg-core/columns/bigserial.ts +128 -0
  266. package/src/data/query/pg-core/columns/boolean.ts +43 -0
  267. package/src/data/query/pg-core/columns/char.ts +85 -0
  268. package/src/data/query/pg-core/columns/cidr.ts +43 -0
  269. package/src/data/query/pg-core/columns/common.ts +366 -0
  270. package/src/data/query/pg-core/columns/custom.ts +232 -0
  271. package/src/data/query/pg-core/columns/date.common.ts +15 -0
  272. package/src/data/query/pg-core/columns/date.ts +112 -0
  273. package/src/data/query/pg-core/columns/double-precision.ts +55 -0
  274. package/src/data/query/pg-core/columns/enum.ts +201 -0
  275. package/src/data/query/pg-core/columns/index.ts +35 -0
  276. package/src/data/query/pg-core/columns/inet.ts +43 -0
  277. package/src/data/query/pg-core/columns/int.common.ts +57 -0
  278. package/src/data/query/pg-core/columns/integer.ts +53 -0
  279. package/src/data/query/pg-core/columns/interval.ts +83 -0
  280. package/src/data/query/pg-core/columns/json.ts +58 -0
  281. package/src/data/query/pg-core/columns/jsonb.ts +56 -0
  282. package/src/data/query/pg-core/columns/line.ts +117 -0
  283. package/src/data/query/pg-core/columns/macaddr.ts +43 -0
  284. package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
  285. package/src/data/query/pg-core/columns/numeric.ts +227 -0
  286. package/src/data/query/pg-core/columns/point.ts +127 -0
  287. package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
  288. package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
  289. package/src/data/query/pg-core/columns/real.ts +58 -0
  290. package/src/data/query/pg-core/columns/serial.ts +55 -0
  291. package/src/data/query/pg-core/columns/smallint.ts +53 -0
  292. package/src/data/query/pg-core/columns/smallserial.ts +60 -0
  293. package/src/data/query/pg-core/columns/text.ts +67 -0
  294. package/src/data/query/pg-core/columns/time.ts +72 -0
  295. package/src/data/query/pg-core/columns/timestamp.ts +163 -0
  296. package/src/data/query/pg-core/columns/uuid.ts +51 -0
  297. package/src/data/query/pg-core/columns/varchar.ts +89 -0
  298. package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
  299. package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
  300. package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
  301. package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
  302. package/src/data/query/pg-core/db.ts +674 -0
  303. package/src/data/query/pg-core/dialect.ts +1404 -0
  304. package/src/data/query/pg-core/expressions.ts +25 -0
  305. package/src/data/query/pg-core/foreign-keys.ts +130 -0
  306. package/src/data/query/pg-core/index.ts +21 -0
  307. package/src/data/query/pg-core/indexes.ts +276 -0
  308. package/src/data/query/pg-core/policies.ts +56 -0
  309. package/src/data/query/pg-core/primary-keys.ts +62 -0
  310. package/src/data/query/pg-core/query-builders/count.ts +86 -0
  311. package/src/data/query/pg-core/query-builders/delete.ts +293 -0
  312. package/src/data/query/pg-core/query-builders/index.ts +7 -0
  313. package/src/data/query/pg-core/query-builders/insert.ts +452 -0
  314. package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
  315. package/src/data/query/pg-core/query-builders/query.ts +157 -0
  316. package/src/data/query/pg-core/query-builders/raw.ts +49 -0
  317. package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
  318. package/src/data/query/pg-core/query-builders/select.ts +1346 -0
  319. package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
  320. package/src/data/query/pg-core/query-builders/update.ts +626 -0
  321. package/src/data/query/pg-core/roles.ts +41 -0
  322. package/src/data/query/pg-core/schema.ts +72 -0
  323. package/src/data/query/pg-core/sequence.ts +41 -0
  324. package/src/data/query/pg-core/session.ts +292 -0
  325. package/src/data/query/pg-core/subquery.ts +46 -0
  326. package/src/data/query/pg-core/table.ts +252 -0
  327. package/src/data/query/pg-core/unique-constraint.ts +73 -0
  328. package/src/data/query/pg-core/utils/array.ts +95 -0
  329. package/src/data/query/pg-core/utils/index.ts +1 -0
  330. package/src/data/query/pg-core/utils.ts +104 -0
  331. package/src/data/query/pg-core/view-base.ts +14 -0
  332. package/src/data/query/pg-core/view-common.ts +1 -0
  333. package/src/data/query/pg-core/view.ts +435 -0
  334. package/src/data/query/pg-core/with-builder.ts +41 -0
  335. package/src/data/query/postgres-js/README.md +46 -0
  336. package/src/data/query/postgres-js/array-parser.ts +45 -0
  337. package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
  338. package/src/data/query/postgres-js/driver.ts +163 -0
  339. package/src/data/query/postgres-js/index.ts +2 -0
  340. package/src/data/query/postgres-js/session.ts +234 -0
  341. package/src/data/query/primary-key.ts +11 -0
  342. package/src/data/query/query-builders/query-builder.ts +19 -0
  343. package/src/data/query/query-builders/select.types.ts +175 -0
  344. package/src/data/query/query-promise.ts +35 -0
  345. package/src/data/query/relations.ts +725 -0
  346. package/src/data/query/runnable-query.ts +12 -0
  347. package/src/data/query/selection-proxy.ts +121 -0
  348. package/src/data/query/session.ts +8 -0
  349. package/src/data/query/sql/expressions/conditions.ts +741 -0
  350. package/src/data/query/sql/expressions/index.ts +2 -0
  351. package/src/data/query/sql/expressions/select.ts +45 -0
  352. package/src/data/query/sql/functions/aggregate.ts +129 -0
  353. package/src/data/query/sql/functions/index.ts +2 -0
  354. package/src/data/query/sql/functions/vector.ts +178 -0
  355. package/src/data/query/sql/index.ts +3 -0
  356. package/src/data/query/sql/sql.ts +794 -0
  357. package/src/data/query/subquery.ts +53 -0
  358. package/src/data/query/table.ts +208 -0
  359. package/src/data/query/table.utils.ts +2 -0
  360. package/src/data/query/tracing-utils.ts +3 -0
  361. package/src/data/query/tracing.ts +11 -0
  362. package/src/data/query/utils.ts +357 -0
  363. package/src/data/query/version.ts +4 -0
  364. package/src/data/query/view-common.ts +1 -0
  365. package/src/data/schema/branded.ts +13 -0
  366. package/src/data/schema/generated/coerce.ts +5 -0
  367. package/src/data/schema/generated/combinator.ts +6 -0
  368. package/src/data/schema/generated/encoding.ts +5 -0
  369. package/src/data/schema/generated/error.ts +6 -0
  370. package/src/data/schema/generated/format.ts +5 -0
  371. package/src/data/schema/generated/type-constructor.ts +10 -0
  372. package/src/data/schema/generated/type.ts +6 -0
  373. package/src/data/schema/index.ts +6 -0
  374. package/src/data/schema/json-schema.ts +33 -0
  375. package/src/data/schema/namespace.ts +55 -0
  376. package/src/data/schema/parse.ts +39 -0
  377. package/src/data/schema/types.ts +39 -0
  378. package/src/data/temporal/append-only.ts +134 -0
  379. package/src/data/temporal/close.ts +27 -0
  380. package/src/data/temporal/columns.ts +10 -0
  381. package/src/data/temporal/definition-queries.ts +70 -0
  382. package/src/data/temporal/errors.ts +10 -0
  383. package/src/data/temporal/get-current.ts +22 -0
  384. package/src/data/temporal/index.ts +9 -0
  385. package/src/data/temporal/namespace.ts +36 -0
  386. package/src/data/temporal/query.ts +25 -0
  387. package/src/data/temporal/resolve.ts +17 -0
  388. package/src/data/temporal/revise.ts +67 -0
  389. package/src/data/temporal/types.ts +22 -0
  390. package/src/data/valve/artifact.ts +33 -0
  391. package/src/data/valve/contract-diff.ts +21 -0
  392. package/src/data/valve/cross.ts +57 -0
  393. package/src/data/valve/crossing-ledger.ts +50 -0
  394. package/src/data/valve/decision.ts +44 -0
  395. package/src/data/valve/durable-crossing.ts +52 -0
  396. package/src/data/valve/execute-crossing.ts +77 -0
  397. package/src/data/valve/faucet.ts +56 -0
  398. package/src/data/valve/gate.ts +114 -0
  399. package/src/data/valve/graph.ts +77 -0
  400. package/src/data/valve/index.ts +53 -0
  401. package/src/data/valve/namespace.ts +57 -0
  402. package/src/data/valve/registry.ts +50 -0
  403. package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
  404. package/src/data/valve/schema/valve-crossing.ts +9 -0
  405. package/src/data/valve/supply.ts +154 -0
  406. package/src/data/valve/types.ts +143 -0
  407. package/src/data/vector/columns.ts +27 -0
  408. package/src/data/vector/index.ts +4 -0
  409. package/src/data/vector/namespace.ts +33 -0
  410. package/src/data/vector/query.ts +85 -0
  411. package/src/data/vector/validate.ts +16 -0
  412. package/src/data/write/audit/actor.ts +15 -0
  413. package/src/data/write/audit/audit-columns.ts +18 -0
  414. package/src/data/write/audit/audit-select.ts +111 -0
  415. package/src/data/write/audit/bound-transaction.ts +14 -0
  416. package/src/data/write/audit/cte-compile.ts +32 -0
  417. package/src/data/write/audit/decode-returning.ts +47 -0
  418. package/src/data/write/audit/final-select.ts +43 -0
  419. package/src/data/write/audit/infra-audit.ts +36 -0
  420. package/src/data/write/audit/primary-key.ts +65 -0
  421. package/src/data/write/audit/projection.ts +41 -0
  422. package/src/data/write/audit/read-touches.ts +86 -0
  423. package/src/data/write/audit/touch-match.ts +78 -0
  424. package/src/data/write/audit/verb-delete.ts +62 -0
  425. package/src/data/write/audit/verb-insert.ts +36 -0
  426. package/src/data/write/audit/verb-select.ts +47 -0
  427. package/src/data/write/audit/verb-update.ts +60 -0
  428. package/src/data/write/audit/verb-upsert.ts +104 -0
  429. package/src/data/write/conflict.ts +43 -0
  430. package/src/data/write/delete.ts +38 -0
  431. package/src/data/write/execute.ts +243 -0
  432. package/src/data/write/index.ts +11 -0
  433. package/src/data/write/insert.ts +63 -0
  434. package/src/data/write/state.ts +43 -0
  435. package/src/data/write/update.ts +54 -0
  436. package/src/data/write/upsert.ts +58 -0
  437. package/src/data/write/values.ts +19 -0
  438. package/src/index.ts +230 -0
  439. package/src/infra/access-links/code.ts +70 -0
  440. package/src/infra/access-links/handle.ts +892 -0
  441. package/src/infra/access-links/index.ts +9 -0
  442. package/src/infra/access-links/namespace.ts +30 -0
  443. package/src/infra/access-links/person-check.ts +177 -0
  444. package/src/infra/access-links/schema.ts +71 -0
  445. package/src/infra/alerts/async-sources.ts +231 -0
  446. package/src/infra/alerts/audit.ts +36 -0
  447. package/src/infra/alerts/beat.ts +123 -0
  448. package/src/infra/alerts/client-faults.ts +111 -0
  449. package/src/infra/alerts/faults.ts +156 -0
  450. package/src/infra/alerts/handle.ts +778 -0
  451. package/src/infra/alerts/http.ts +192 -0
  452. package/src/infra/alerts/index.ts +12 -0
  453. package/src/infra/alerts/infra-sources.ts +180 -0
  454. package/src/infra/alerts/namespace.ts +81 -0
  455. package/src/infra/alerts/redact.ts +21 -0
  456. package/src/infra/alerts/request-faults.ts +41 -0
  457. package/src/infra/alerts/schema.ts +124 -0
  458. package/src/infra/alerts/sinks.ts +125 -0
  459. package/src/infra/alerts/source-options.ts +26 -0
  460. package/src/infra/alerts/sources.ts +503 -0
  461. package/src/infra/alerts/subsystem-sources.ts +137 -0
  462. package/src/infra/audit/emit.ts +87 -0
  463. package/src/infra/audit/index.ts +2 -0
  464. package/src/infra/audit/namespace.ts +22 -0
  465. package/src/infra/audit/schema.sql +35 -0
  466. package/src/infra/audit/types.ts +18 -0
  467. package/src/infra/aws/credentials.ts +147 -0
  468. package/src/infra/aws/sigv4.ts +140 -0
  469. package/src/infra/cache/create.ts +58 -0
  470. package/src/infra/cache/entry.ts +81 -0
  471. package/src/infra/cache/index.ts +4 -0
  472. package/src/infra/cache/namespace.ts +10 -0
  473. package/src/infra/cache/tenant.ts +93 -0
  474. package/src/infra/cache/types.ts +24 -0
  475. package/src/infra/crawl/audit.ts +35 -0
  476. package/src/infra/crawl/errors.ts +25 -0
  477. package/src/infra/crawl/handle.ts +693 -0
  478. package/src/infra/crawl/index.ts +9 -0
  479. package/src/infra/crawl/links.ts +160 -0
  480. package/src/infra/crawl/namespace.ts +36 -0
  481. package/src/infra/crawl/robots.ts +100 -0
  482. package/src/infra/crawl/schema.ts +89 -0
  483. package/src/infra/credit-line/handle.ts +883 -0
  484. package/src/infra/credit-line/index.ts +6 -0
  485. package/src/infra/credit-line/namespace.ts +7 -0
  486. package/src/infra/credit-line/schema.ts +96 -0
  487. package/src/infra/credits/handle.ts +706 -0
  488. package/src/infra/credits/index.ts +5 -0
  489. package/src/infra/credits/namespace.ts +7 -0
  490. package/src/infra/credits/schema.ts +83 -0
  491. package/src/infra/email/audit.ts +36 -0
  492. package/src/infra/email/inbound.ts +622 -0
  493. package/src/infra/email/index.ts +11 -0
  494. package/src/infra/email/mail.ts +517 -0
  495. package/src/infra/email/mime.ts +447 -0
  496. package/src/infra/email/namespace.ts +22 -0
  497. package/src/infra/email/providers.ts +111 -0
  498. package/src/infra/email/schema.ts +96 -0
  499. package/src/infra/email/sns.ts +200 -0
  500. package/src/infra/email/unsubscribe.ts +44 -0
  501. package/src/infra/fetch/address.ts +88 -0
  502. package/src/infra/fetch/connect-retry.ts +87 -0
  503. package/src/infra/fetch/handle.ts +329 -0
  504. package/src/infra/fetch/index.ts +7 -0
  505. package/src/infra/fetch/namespace.ts +70 -0
  506. package/src/infra/idempotency/index.ts +3 -0
  507. package/src/infra/idempotency/middleware.ts +87 -0
  508. package/src/infra/idempotency/store.ts +92 -0
  509. package/src/infra/idempotency/types.ts +30 -0
  510. package/src/infra/join-requests/handle.ts +312 -0
  511. package/src/infra/join-requests/index.ts +2 -0
  512. package/src/infra/join-requests/namespace.ts +7 -0
  513. package/src/infra/join-requests/schema.ts +33 -0
  514. package/src/infra/outbox/core.ts +165 -0
  515. package/src/infra/quota/errors.ts +32 -0
  516. package/src/infra/quota/handle.ts +215 -0
  517. package/src/infra/quota/index.ts +5 -0
  518. package/src/infra/quota/namespace.ts +7 -0
  519. package/src/infra/quota/schema.ts +15 -0
  520. package/src/infra/storage/backend.ts +34 -0
  521. package/src/infra/storage/handle.ts +513 -0
  522. package/src/infra/storage/index.ts +9 -0
  523. package/src/infra/storage/local.ts +104 -0
  524. package/src/infra/storage/namespace.ts +13 -0
  525. package/src/infra/storage/s3.ts +257 -0
  526. package/src/infra/storage/schema.ts +24 -0
  527. package/src/infra/support/handle.ts +854 -0
  528. package/src/infra/support/http.ts +229 -0
  529. package/src/infra/support/index.ts +7 -0
  530. package/src/infra/support/namespace.ts +12 -0
  531. package/src/infra/support/schema.ts +96 -0
  532. package/src/infra/webhook/inbound.ts +45 -0
  533. package/src/infra/webhook/index.ts +5 -0
  534. package/src/infra/webhook/namespace.ts +24 -0
  535. package/src/infra/webhook/outbound.ts +315 -0
  536. package/src/infra/webhook/sign.ts +32 -0
  537. package/src/infra/webhook/verify.ts +82 -0
  538. package/src/invariants/assert.ts +26 -0
  539. package/src/invariants/index.ts +1 -0
  540. package/src/lint/config.ts +56 -0
  541. package/src/lint/doctrine.ts +163 -0
  542. package/src/lint/include.ts +97 -0
  543. package/src/lint/index.ts +3 -0
  544. package/src/lint/preset.ts +10 -0
  545. package/src/lint/resolver.ts +218 -0
  546. package/src/lint/rules/no-reexports.ts +46 -0
  547. package/src/request/behavior/audited.ts +85 -0
  548. package/src/request/behavior/cached.ts +62 -0
  549. package/src/request/behavior/compose.ts +28 -0
  550. package/src/request/behavior/index.ts +5 -0
  551. package/src/request/behavior/namespace.ts +16 -0
  552. package/src/request/behavior/types.ts +26 -0
  553. package/src/request/behavior/versioned.ts +54 -0
  554. package/src/request/context/create.ts +103 -0
  555. package/src/request/context/guard.ts +49 -0
  556. package/src/request/context/index.ts +4 -0
  557. package/src/request/context/run-in-transaction.ts +200 -0
  558. package/src/request/context/store.ts +28 -0
  559. package/src/request/context/types.ts +50 -0
  560. package/src/request/di/builder.ts +535 -0
  561. package/src/request/di/index.ts +8 -0
  562. package/src/request/di/resolve.ts +271 -0
  563. package/src/request/di/types.ts +262 -0
  564. package/src/request/fitting/namespace.ts +7 -0
  565. package/src/request/fixture/batch.ts +71 -0
  566. package/src/request/fixture/builder.ts +26 -0
  567. package/src/request/fixture/errors.ts +10 -0
  568. package/src/request/fixture/index.ts +8 -0
  569. package/src/request/fixture/namespace.ts +23 -0
  570. package/src/request/fixture/paginate.ts +44 -0
  571. package/src/request/fixture/to-handlers.ts +260 -0
  572. package/src/request/fixture/types.ts +79 -0
  573. package/src/request/flow/act-as.ts +78 -0
  574. package/src/request/flow/namespace.ts +17 -0
  575. package/src/request/http/error-step.ts +42 -0
  576. package/src/request/http/file.ts +141 -0
  577. package/src/request/http/index.ts +4 -0
  578. package/src/request/http/middleware.ts +141 -0
  579. package/src/request/http/namespace.ts +5 -0
  580. package/src/request/http/rate-limit-classes.ts +170 -0
  581. package/src/request/http/response.ts +82 -0
  582. package/src/request/http/server.ts +916 -0
  583. package/src/request/http/sniff.ts +261 -0
  584. package/src/request/http/types.ts +250 -0
  585. package/src/request/http/upload.ts +284 -0
  586. package/src/request/internal/text.ts +6 -0
  587. package/src/request/openapi/generate.ts +205 -0
  588. package/src/request/openapi/index.ts +2 -0
  589. package/src/request/openapi/namespace.ts +7 -0
  590. package/src/test/auth.ts +13 -0
  591. package/src/test/auto-setup.ts +45 -0
  592. package/src/test/context.ts +91 -0
  593. package/src/test/crawl-fixture.ts +157 -0
  594. package/src/test/discover-fork.ts +17 -0
  595. package/src/test/fingerprint.ts +135 -0
  596. package/src/test/globals.d.ts +7 -0
  597. package/src/test/index.ts +19 -0
  598. package/src/test/namespace.ts +87 -0
  599. package/src/test/plugin.ts +189 -0
  600. package/src/test/progress.ts +185 -0
  601. package/src/test/reap-after-run.ts +28 -0
  602. package/src/test/reap.ts +286 -0
  603. package/src/test/reset.ts +253 -0
  604. package/src/test/savepoints.ts +172 -0
  605. package/src/test/setup.ts +1422 -0
  606. package/src/test/system-channel.ts +50 -0
  607. package/src/test/vitest-plugin.ts +142 -0
  608. package/src/test/vitest-workspace.ts +507 -0
  609. package/src/test/vitest.ts +333 -0
  610. package/src/test/watch.ts +105 -0
  611. package/src/trace/capture/bounded-serializer.ts +146 -0
  612. package/src/trace/cardinality/analyze.ts +173 -0
  613. package/src/trace/cardinality/branch-context.ts +214 -0
  614. package/src/trace/cardinality/check.ts +33 -0
  615. package/src/trace/cardinality/classify-edge.ts +64 -0
  616. package/src/trace/cardinality/structural-max.ts +107 -0
  617. package/src/trace/check/coverage-check.ts +188 -0
  618. package/src/trace/check/flow-check.ts +103 -0
  619. package/src/trace/check/flow-step-site.ts +234 -0
  620. package/src/trace/check/io-pattern.ts +116 -0
  621. package/src/trace/codemod/add-cardinality.ts +152 -0
  622. package/src/trace/codemod/run.ts +80 -0
  623. package/src/trace/entry/child-trace.ts +21 -0
  624. package/src/trace/entry/close-trace.ts +87 -0
  625. package/src/trace/entry/finalize-trace.ts +28 -0
  626. package/src/trace/entry/open-trace.ts +138 -0
  627. package/src/trace/entry/parent-trace.ts +20 -0
  628. package/src/trace/entry/parse-traceparent.ts +39 -0
  629. package/src/trace/entry/process-start.ts +38 -0
  630. package/src/trace/entry/trace-context.ts +26 -0
  631. package/src/trace/entry/tracing-enabled.ts +10 -0
  632. package/src/trace/external/record.ts +195 -0
  633. package/src/trace/external/report.ts +66 -0
  634. package/src/trace/namespace.ts +19 -0
  635. package/src/trace/partition/day.ts +47 -0
  636. package/src/trace/partition/index.ts +14 -0
  637. package/src/trace/partition/partition-name.ts +23 -0
  638. package/src/trace/partition/plan.ts +82 -0
  639. package/src/trace/partition/schedule.ts +26 -0
  640. package/src/trace/partition/startup-hook.ts +39 -0
  641. package/src/trace/partition/sync.ts +154 -0
  642. package/src/trace/partition/tables.ts +53 -0
  643. package/src/trace/read/tree.ts +83 -0
  644. package/src/trace/retain/copy-on-error.ts +76 -0
  645. package/src/trace/runtime/expire-stale-traces.ts +54 -0
  646. package/src/trace/runtime/flow-step.ts +147 -0
  647. package/src/trace/runtime/flush-steps.ts +31 -0
  648. package/src/trace/runtime/pending-writes.ts +54 -0
  649. package/src/trace/runtime/step-buffer.ts +298 -0
  650. package/src/trace/runtime/step-error.ts +21 -0
  651. package/src/trace/runtime/step-meta.ts +55 -0
  652. package/src/trace/runtime/thenable.ts +12 -0
  653. package/src/trace/runtime/truncate-trace.ts +62 -0
  654. package/src/trace/schema/trace-fields.ts +52 -0
  655. package/src/trace/schema/trace-retained.ts +22 -0
  656. package/src/trace/schema/trace-step-fields.ts +44 -0
  657. package/src/trace/schema/trace-step-retained.ts +25 -0
  658. package/src/trace/schema/trace-step.ts +18 -0
  659. package/src/trace/schema/trace.ts +12 -0
  660. package/src/trace/transformer/apply.ts +79 -0
  661. package/src/trace/transformer/build-meta-literal.ts +30 -0
  662. package/src/trace/transformer/find-flow-step-sites.ts +85 -0
  663. package/src/trace/transformer/inject-flow-step-import.ts +39 -0
  664. package/src/trace/transformer/transform-error.ts +14 -0
  665. package/src/trace/transformer/transform-flow-steps.ts +123 -0
  666. package/src/trace/transformer/wrap-function-declaration.ts +62 -0
  667. package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
  668. package/src/workspace/affected.ts +110 -0
  669. package/src/workspace/changed-files.ts +163 -0
  670. package/src/workspace/check-deps.ts +213 -0
  671. package/src/workspace/checksum.ts +20 -0
  672. package/src/workspace/dependency-graph.ts +67 -0
  673. package/src/workspace/detect-pipework-copies.ts +93 -0
  674. package/src/workspace/discover.ts +206 -0
  675. package/src/workspace/generate.ts +401 -0
  676. package/src/workspace/index.ts +7 -0
  677. package/src/workspace/module-imports-pipework.ts +39 -0
  678. package/src/workspace/module-package-name.ts +12 -0
  679. package/src/workspace/scrub-git-env.ts +23 -0
  680. package/src/workspace/source-paths.ts +36 -0
  681. package/src/workspace/sync.ts +182 -0
  682. package/dist/REFERENCE.md +0 -1477
  683. package/dist/infra/access-links/rate-limit.d.ts +0 -10
  684. package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
  685. package/dist/infra/access-links/rate-limit.js +0 -28
  686. package/dist/infra/access-links/rate-limit.js.map +0 -1
  687. package/dist/infra/email/sigv4.d.ts +0 -24
  688. package/dist/infra/email/sigv4.d.ts.map +0 -1
  689. package/dist/infra/email/sigv4.js +0 -55
  690. package/dist/infra/email/sigv4.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ import { execSync } from 'node:child_process'
2
+ import { readFileSync } from 'node:fs'
3
+ import { join } from 'node:path'
4
+
5
+ /**
6
+ * Runs `pnpm install` and then reads back what actually landed in node_modules.
7
+ * pnpm asks for confirmation before purging a modules directory; with no TTY it
8
+ * takes the abort branch and still exits 0, so exit status alone cannot tell a
9
+ * real install from a no-op. The version read after the step is the verdict.
10
+ */
11
+
12
+ const PURGE_PROMPT_ENV = { npm_config_confirm_modules_purge: 'false' } as const
13
+
14
+ export function readInstalledPipeworkVersion(cwd: string): string | undefined {
15
+ try {
16
+ const raw = readFileSync(join(cwd, 'node_modules', 'pipework', 'package.json'), 'utf-8')
17
+ const pkg = JSON.parse(raw) as { version?: unknown }
18
+ return typeof pkg.version === 'string' ? pkg.version : undefined
19
+ } catch {
20
+ return undefined
21
+ }
22
+ }
23
+
24
+ /**
25
+ * True when `installed` is at least `required`. A version either side that is
26
+ * not a plain `x.y.z` (a workspace link, a tag) is not something this can
27
+ * judge, so it passes — the point is catching an install that did not run.
28
+ */
29
+ export function isAtLeastVersion(installed: string, required: string): boolean {
30
+ const a = parseVersion(installed)
31
+ const b = parseVersion(required)
32
+ if (a === undefined || b === undefined) return true
33
+ if (a.major !== b.major) return a.major > b.major
34
+ if (a.minor !== b.minor) return a.minor > b.minor
35
+ return a.patch >= b.patch
36
+ }
37
+
38
+ interface Version {
39
+ readonly major: number
40
+ readonly minor: number
41
+ readonly patch: number
42
+ }
43
+
44
+ function parseVersion(value: string): Version | undefined {
45
+ const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(value.trim())
46
+ if (match === null) return undefined
47
+ return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) }
48
+ }
49
+
50
+ export function installMismatchMessage(
51
+ required: string,
52
+ installed: string | undefined,
53
+ cwd: string,
54
+ ): string {
55
+ const found = installed === undefined
56
+ ? 'node_modules/pipework is not there at all'
57
+ : `node_modules/pipework is at ${installed}`
58
+ return (
59
+ `pnpm install exited 0 but did not install pipework@^${required}.\n\n` +
60
+ ` ${found}.\n\n` +
61
+ ` With no TTY, pnpm aborts on its modules-purge confirmation prompt and\n` +
62
+ ` still exits 0. Pipework sets npm_config_confirm_modules_purge=false to\n` +
63
+ ` answer it; something else stopped the install. Run pnpm install directly\n` +
64
+ ` in ${cwd} to see what it asks.\n`
65
+ )
66
+ }
67
+
68
+ export interface PnpmInstallOptions {
69
+ readonly cwd: string
70
+ /** The pipework version the generated package.json asks for, as plain `x.y.z`. */
71
+ readonly requiredPipeworkVersion: string
72
+ }
73
+
74
+ export type PnpmInstallOutcome =
75
+ | { readonly ok: true; readonly installedPipeworkVersion: string }
76
+ | { readonly ok: false; readonly message: string }
77
+
78
+ export function runPnpmInstall(options: PnpmInstallOptions): PnpmInstallOutcome {
79
+ try {
80
+ execSync('pnpm install', {
81
+ cwd: options.cwd,
82
+ stdio: 'inherit',
83
+ env: { ...process.env, PIPEWORK_SKIP_GUARD: '1', ...PURGE_PROMPT_ENV },
84
+ })
85
+ } catch {
86
+ return { ok: false, message: 'pnpm install failed. Check the output above for details.' }
87
+ }
88
+
89
+ const installed = readInstalledPipeworkVersion(options.cwd)
90
+ if (installed === undefined || !isAtLeastVersion(installed, options.requiredPipeworkVersion)) {
91
+ return { ok: false, message: installMismatchMessage(options.requiredPipeworkVersion, installed, options.cwd) }
92
+ }
93
+
94
+ return { ok: true, installedPipeworkVersion: installed }
95
+ }
@@ -0,0 +1,8 @@
1
+ import type { SyncResult } from '../../../workspace/sync.js'
2
+ import { warn } from '../../output.js'
3
+
4
+ export function reportRemoved(result: Pick<SyncResult, 'removed'>): void {
5
+ for (const gone of result.removed) {
6
+ warn(`Removed ${gone.field} entry "${gone.name}" from ${gone.file}.`)
7
+ }
8
+ }
@@ -0,0 +1,32 @@
1
+ import { resolve } from 'node:path'
2
+ import { sync as syncWorkspace } from '../../workspace/sync.js'
3
+ import { loadConfig } from './shared/load-config.js'
4
+ import { reportRemoved } from './shared/report-removed.js'
5
+ import { info, success, warn } from '../output.js'
6
+
7
+ export async function syncCommand(cwd: string): Promise<void> {
8
+ const { config, appName } = await loadConfig(resolve(cwd))
9
+
10
+ const result = syncWorkspace({
11
+ config,
12
+ cwd: resolve(cwd),
13
+ appName,
14
+ })
15
+
16
+ if (result.written === 0) {
17
+ info('Workspace already up to date.')
18
+ } else {
19
+ for (const file of result.files) {
20
+ if (result.written > 0) {
21
+ info(` ${file.relativePath}`)
22
+ }
23
+ }
24
+ success(`Synced ${String(result.written)} file(s), ${String(result.skipped)} unchanged.`)
25
+ }
26
+
27
+ reportRemoved(result)
28
+
29
+ if (result.files.length === 0) {
30
+ warn('No files generated. Check your config for dependencies and modules.')
31
+ }
32
+ }
@@ -0,0 +1,307 @@
1
+ import { spawnSync } from 'node:child_process'
2
+ import { dirname } from 'node:path'
3
+ import { bold, error, info, success, warn } from '../output.js'
4
+ import type { ScopeMode } from '../../workspace/affected.js'
5
+ import { resolveAffected } from '../../workspace/affected.js'
6
+ import { findConfig } from '../../core/config/discover.js'
7
+ import { resolveModules, type ResolvedModule } from '../../workspace/discover.js'
8
+ import { shardArg, type Shard } from './shard.js'
9
+
10
+ export interface TestOptions {
11
+ cwd: string
12
+ db?: string | undefined
13
+ vitestArgs: string[]
14
+ scope?: ScopeMode | undefined
15
+ suite?: string | undefined
16
+ /** `--fast` — run only the fast test tiers (issue #325). */
17
+ fast?: boolean | undefined
18
+ reap?: boolean | undefined
19
+ /** `--shard i/n`: run part i of n disjoint parts of the selected files. */
20
+ shard?: Shard | undefined
21
+ }
22
+
23
+ export async function test(options: TestOptions): Promise<void> {
24
+ const { discoverInstance } = await import('../../core/config/discover.js')
25
+ const { setupTestDatabases, teardownTestDatabases } = await import('../../test/setup.js')
26
+
27
+ process.env['PIPEWORK_ENV'] = 'test'
28
+ const instance = await discoverInstance(options.cwd)
29
+
30
+ if (options.reap === true) {
31
+ const { reapConfiguredTestDatabases } = await import('../../test/reap.js')
32
+ info('Reaping orphan test databases...')
33
+ try {
34
+ const result = await reapConfiguredTestDatabases(instance)
35
+ success(`Reaped ${String(result.droppedDatabases.length)} orphan test database(s).`)
36
+ // #391: a name in the prefix that pipework did not write is left alone. Saying
37
+ // which ones is the difference between a deliberate skip and a silent one.
38
+ if (result.skippedDatabases.length > 0) {
39
+ warn(`Left alone — not created by pipework (${String(result.skippedDatabases.length)}):`)
40
+ for (const datname of result.skippedDatabases) {
41
+ warn(` ${datname}`)
42
+ }
43
+ }
44
+ } finally {
45
+ await instance.pool.closeAll()
46
+ }
47
+ return
48
+ }
49
+
50
+ let emptyBasis = ''
51
+ const projectArgs = buildProjectArgs(options, instance, (basis) => { emptyBasis = basis })
52
+ if (projectArgs === null) {
53
+ const filters = targetedFilters(options.vitestArgs)
54
+ if (filters.length > 0) {
55
+ // A named path that did not run must not look like a pass (#337).
56
+ error(`Nothing ran: no affected module in scope (${emptyBasis}), so ${filters.join(' ')} did not run. Run with --all to test it regardless.`)
57
+ process.exitCode = 1
58
+ } else {
59
+ success('No affected modules — nothing to test')
60
+ }
61
+ await instance.pool.closeAll()
62
+ return
63
+ }
64
+
65
+ // A selection whose every project opts out of the database (`database:
66
+ // false` on the profile/module/workspace chain) runs without provisioning
67
+ // one — and without demanding DB env, which config resolution defers to
68
+ // first URL access for exactly this path.
69
+ let needsDatabase = projectArgs.needsDatabase
70
+ if (needsDatabase && options.shard !== undefined && projectArgs.databaseByProject !== undefined) {
71
+ const specs = await shardSpecifications(options.cwd, options.shard, projectArgs.args, targetedFilters(options.vitestArgs))
72
+ if (specs !== null) {
73
+ needsDatabase = shardNeedsDatabase(specs, projectArgs.databaseByProject)
74
+ const owned = [...new Set(specs.map(spec => spec.project))].sort()
75
+ info(`Shard ${shardArg(options.shard)} runs ${String(specs.length)} file(s) in ${String(owned.length)} project(s): ${owned.join(', ') || '(none)'}`)
76
+ }
77
+ }
78
+ if (needsDatabase) {
79
+ info('Setting up test databases...')
80
+ await setupTestDatabases(instance)
81
+ } else {
82
+ info('Selected projects declare no database use — skipping database setup')
83
+ }
84
+
85
+ // Tear down on signals too, not just clean exit: a default SIGINT/SIGTERM
86
+ // would kill this process before `finally` runs, leaking the per-run
87
+ // databases. `teardownTestDatabases` is idempotent and the shared promise
88
+ // makes the signal handler wait for an in-flight teardown before exiting.
89
+ let cleanup: Promise<void> | null = null
90
+ const teardownOnce = (): Promise<void> => {
91
+ cleanup ??= needsDatabase ? teardownTestDatabases().catch(() => {}) : Promise.resolve()
92
+ return cleanup
93
+ }
94
+ process.once('SIGINT', () => { void teardownOnce().finally(() => process.exit(130)) })
95
+ process.once('SIGTERM', () => { void teardownOnce().finally(() => process.exit(143)) })
96
+
97
+ try {
98
+ const shardArgs = options.shard === undefined ? [] : [`--shard=${shardArg(options.shard)}`]
99
+ const args = ['vitest', 'run', ...projectArgs.args, ...shardArgs, ...options.vitestArgs]
100
+ info(`Running: ${bold(args.join(' '))}`)
101
+
102
+ const result = spawnSync('npx', args, {
103
+ cwd: options.cwd,
104
+ stdio: 'inherit',
105
+ env: { ...process.env, PIPEWORK_ENV: 'test' },
106
+ })
107
+
108
+ if (result.error !== undefined) {
109
+ throw new Error(
110
+ `Failed to spawn vitest: ${result.error.message}\n\n` +
111
+ ` Ensure vitest is installed as a devDependency.\n` +
112
+ ` Example: ${bold('pnpm add -D vitest')}\n`,
113
+ )
114
+ }
115
+
116
+ if (result.status !== 0) {
117
+ process.exitCode = result.status ?? 1
118
+ } else {
119
+ success('Tests completed.')
120
+ }
121
+ } finally {
122
+ if (needsDatabase) {
123
+ info('Tearing down test databases...')
124
+ }
125
+ await teardownOnce()
126
+ await instance.pool.closeAll()
127
+ }
128
+ }
129
+
130
+ /** Path/name filters in vitestArgs: args not starting with `-` and not the value of a preceding `--flag value`. */
131
+ export function targetedFilters(vitestArgs: readonly string[]): string[] {
132
+ return vitestArgs.filter((arg, i) => {
133
+ if (arg.startsWith('-')) return false
134
+ const prev = vitestArgs[i - 1]
135
+ return !(prev !== undefined && prev.startsWith('-') && !prev.includes('='))
136
+ })
137
+ }
138
+
139
+ export interface ProjectSelection {
140
+ /** `--project` filter args for vitest (empty = run unfiltered). */
141
+ readonly args: string[]
142
+ /**
143
+ * Whether any selected project uses a database, per the `database` flag
144
+ * chain (profile ?? module ?? workspace ?? true). False lets `test` skip
145
+ * database setup — and, with URL resolution deferred to first access, skip
146
+ * demanding DB env entirely.
147
+ */
148
+ readonly needsDatabase: boolean
149
+ /** Per selected project: does it use a database. Absent for unfiltered runs. */
150
+ readonly databaseByProject?: ReadonlyMap<string, boolean>
151
+ }
152
+
153
+ export interface ShardSpec {
154
+ readonly file: string
155
+ readonly project: string
156
+ }
157
+
158
+ /**
159
+ * The (file, project) pairs this shard runs, found with vitest's own file glob
160
+ * and shard sequencer so the answer is the split the run will make. Null when it
161
+ * cannot be computed; the caller then assumes every selected project runs.
162
+ */
163
+ export async function shardSpecifications(
164
+ cwd: string,
165
+ shard: Shard,
166
+ projectArgs: readonly string[],
167
+ filters: readonly string[],
168
+ ): Promise<ShardSpec[] | null> {
169
+ try {
170
+ const { createVitest } = await import('vitest/node')
171
+ const project = projectArgs.filter(arg => arg !== '--project')
172
+ const ctx = await createVitest('test', { root: cwd, watch: false, project, shard: shardArg(shard) })
173
+ try {
174
+ const specs = await ctx.globTestSpecifications([...filters])
175
+ const Sequencer = ctx.config.sequence.sequencer
176
+ const mine = await new Sequencer(ctx).shard(specs)
177
+ return mine.map(spec => ({ file: spec.moduleId, project: spec.project.name }))
178
+ } finally {
179
+ await ctx.close()
180
+ }
181
+ } catch {
182
+ return null
183
+ }
184
+ }
185
+
186
+ /** Whether any project that has files in the shard uses a database. */
187
+ export function shardNeedsDatabase(
188
+ specs: readonly ShardSpec[],
189
+ databaseByProject: ReadonlyMap<string, boolean>,
190
+ ): boolean {
191
+ return specs.some(spec => databaseByProject.get(spec.project) ?? true)
192
+ }
193
+
194
+ export function buildProjectArgs(
195
+ options: TestOptions,
196
+ instance: import('../../core/pipework.js').Manifold,
197
+ onEmpty?: (basis: string) => void,
198
+ ): ProjectSelection | null {
199
+ const blueprint = instance.config.raw
200
+ // Unfiltered runs: nothing is known about what executes, so assume it connects.
201
+ if (blueprint.vitest === undefined) return { args: [], needsDatabase: true }
202
+
203
+ const configPath = findConfig(options.cwd)
204
+ if (configPath === null) return { args: [], needsDatabase: true }
205
+
206
+ const configDir = dirname(configPath)
207
+ const resolved = resolveModules(blueprint.modules, configDir)
208
+ // No declared modules: single-package repo whose one implicit module is the
209
+ // repo root, addressed as '.'. Synthesize it so --suite/--scope/profile
210
+ // selection works — `resolveVitestModules` projects the same '.' module, so
211
+ // the `--project` names line up.
212
+ const effectiveModules: ResolvedModule[] = resolved.length === 0
213
+ ? [{ key: '.', relativePath: '.', config: {} }]
214
+ : resolved
215
+
216
+ const scope = options.scope ?? { kind: 'all' } as ScopeMode
217
+ const scopeResult = resolveAffected(configDir, effectiveModules, blueprint.name ?? '', scope, blueprint.fastPath?.baseBranches)
218
+
219
+ // Population line: what this run's module scope was computed from. Printed
220
+ // unconditionally so scope-of-invocation is visible next to every verdict.
221
+ info(`Scope: ${scopeResult.basis}`)
222
+
223
+ // No affected modules — nothing to test. Signal the caller to exit 0
224
+ // gracefully rather than emitting a bogus --project filter that vitest
225
+ // rejects as a startup error. Mirrors `pipework check`, which degrades the
226
+ // same way on an empty diff (e.g. a pre-push hook with an empty git index).
227
+ if (scopeResult.modules.size === 0) {
228
+ onEmpty?.(scopeResult.basis)
229
+ return null
230
+ }
231
+
232
+ if (scopeResult.failedOpen === true) {
233
+ warn('Affected set could not be computed — running all modules (fast path failed open). Issue #325.')
234
+ }
235
+
236
+ const manualProfiles = collectManualProfiles(blueprint.vitest)
237
+ // --fast: include only the fast test tiers; property/stress are deferred to
238
+ // the full run. The base (profile-less) project is always kept. Issue #325.
239
+ const fastTiers = options.fast === true
240
+ ? new Set(blueprint.fastPath?.test?.tiers ?? ['unit', 'contract', 'isolation'])
241
+ : null
242
+ const projectNames: string[] = []
243
+ const databaseByProject = new Map<string, boolean>()
244
+ let needsDatabase = false
245
+
246
+ // The same flag chain `resolveVitestModules` projects into each vitest
247
+ // project: profile ?? module ?? workspace ?? true.
248
+ const workspaceDatabase = blueprint.vitest.database ?? true
249
+ const usesDatabase = (modulePath: string, profileName?: string): boolean => {
250
+ const moduleConfig = blueprint.vitest?.modules?.[modulePath]
251
+ const moduleDatabase = moduleConfig?.database ?? workspaceDatabase
252
+ if (profileName === undefined) return moduleDatabase
253
+ return moduleConfig?.profiles?.[profileName]?.database ?? moduleDatabase
254
+ }
255
+
256
+ for (const modulePath of [...scopeResult.modules].sort()) {
257
+ if (options.suite !== undefined) {
258
+ projectNames.push(`${modulePath}:${options.suite}`)
259
+ databaseByProject.set(`${modulePath}:${options.suite}`, usesDatabase(modulePath, options.suite))
260
+ needsDatabase ||= usesDatabase(modulePath, options.suite)
261
+ } else {
262
+ projectNames.push(modulePath)
263
+ databaseByProject.set(modulePath, usesDatabase(modulePath))
264
+ needsDatabase ||= usesDatabase(modulePath)
265
+ const moduleVitestConfig = blueprint.vitest.modules?.[modulePath]
266
+ if (moduleVitestConfig?.profiles !== undefined) {
267
+ for (const profileName of Object.keys(moduleVitestConfig.profiles).sort()) {
268
+ if (fastTiers !== null && !fastTiers.has(profileName)) continue
269
+ const fullName = `${modulePath}:${profileName}`
270
+ if (!manualProfiles.has(fullName)) {
271
+ projectNames.push(fullName)
272
+ databaseByProject.set(fullName, usesDatabase(modulePath, profileName))
273
+ needsDatabase ||= usesDatabase(modulePath, profileName)
274
+ }
275
+ }
276
+ }
277
+ }
278
+ }
279
+
280
+ if (!scopeResult.all) {
281
+ info(`Scoped to ${String(scopeResult.modules.size)} of ${String(effectiveModules.length)} module(s): ${[...scopeResult.modules].sort().join(', ')}`)
282
+ }
283
+
284
+ const args: string[] = []
285
+ for (const name of projectNames) {
286
+ args.push('--project', name)
287
+ }
288
+ return { args, needsDatabase, databaseByProject }
289
+ }
290
+
291
+ function collectManualProfiles(
292
+ vitestConfig: NonNullable<import('../../core/config/schema.js').Blueprint['vitest']>,
293
+ ): Set<string> {
294
+ const manual = new Set<string>()
295
+ if (vitestConfig.modules === undefined) return manual
296
+
297
+ for (const [modulePath, moduleConfig] of Object.entries(vitestConfig.modules)) {
298
+ if (moduleConfig.profiles === undefined) continue
299
+ for (const [profileName, profileConfig] of Object.entries(moduleConfig.profiles)) {
300
+ if (profileConfig.manual === true) {
301
+ manual.add(`${modulePath}:${profileName}`)
302
+ }
303
+ }
304
+ }
305
+
306
+ return manual
307
+ }
@@ -0,0 +1,48 @@
1
+ import { execSync } from 'node:child_process'
2
+ import { resolve } from 'node:path'
3
+ import { info, success, warn, error, bold } from '../output.js'
4
+ import { install } from './install.js'
5
+ import { findConfigFile } from './shared/find-config.js'
6
+ import { rewriteConfigFileVersion } from './shared/config-pipework-version.js'
7
+ import { detectPipeworkInstall } from '../../workspace/detect-pipework-copies.js'
8
+
9
+ export async function upgrade(cwd: string, targetVersion: string | undefined): Promise<void> {
10
+ const version = targetVersion ?? resolveLatestVersion()
11
+ const root = resolve(cwd)
12
+
13
+ info(`Upgrading to pipework@${bold(version)}`)
14
+
15
+ // The config's own pipework pin outranks the installed CLI's version: left at the old
16
+ // version, the next `pipework install` would regenerate package.json there.
17
+ const configFile = findConfigFile(root)
18
+ const rewrite = rewriteConfigFileVersion(configFile, version)
19
+ if (rewrite.kind === 'rewritten') {
20
+ info(`Set the pipework version in ${configFile} to ${version}`)
21
+ } else if (rewrite.kind === 'ambiguous') {
22
+ warn(
23
+ `${configFile} has ${String(rewrite.count)} pipework version literals; change the one in ` +
24
+ `dependencies/devDependencies to ${version} yourself, or the next \`pipework install\` regenerates package.json at the old version.`,
25
+ )
26
+ }
27
+
28
+ await install(root, version)
29
+
30
+ const { orphans } = detectPipeworkInstall(root)
31
+ for (const o of orphans) {
32
+ warn(`Orphaned pipework ${o.version} at ${o.path}: a stale copy pnpm left in its virtual store; \`pnpm prune\` removes it.`)
33
+ }
34
+
35
+ success(`Upgraded to pipework@${version}`)
36
+ }
37
+
38
+ function resolveLatestVersion(): string {
39
+ try {
40
+ return execSync('npm view pipework version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()
41
+ } catch {
42
+ error(
43
+ `Could not resolve latest pipework version from npm.\n\n` +
44
+ ` Specify a version explicitly: ${bold('pipework upgrade 0.7.5')}\n`,
45
+ )
46
+ process.exit(1)
47
+ }
48
+ }
@@ -0,0 +1,24 @@
1
+ import { loadEnvFiles } from '../core/config/env.js'
2
+ import { discoverInstance } from '../core/config/discover.js'
3
+ import { parsePort } from './port.js'
4
+ import { parseSurfaceKinds, SURFACE_KINDS_ENV } from './surface-kinds.js'
5
+
6
+ const cwd = process.env['PIPEWORK_CWD'] ?? process.cwd()
7
+
8
+ loadEnvFiles(cwd)
9
+
10
+ const port = parsePort(process.env['PORT'])
11
+
12
+ const kinds = parseSurfaceKinds(process.env[SURFACE_KINDS_ENV])
13
+
14
+ const manifold = await discoverInstance(cwd)
15
+ const names = manifold.surfaceNames()
16
+
17
+ if (names.length > 0) {
18
+ process.stderr.write(`\n Starting ${names.length} surface${names.length > 1 ? 's' : ''}...\n\n`)
19
+ }
20
+
21
+ await manifold.start({
22
+ ...(port === undefined ? {} : { port }),
23
+ ...(kinds === undefined ? {} : { kinds }),
24
+ })
@@ -0,0 +1,10 @@
1
+ import { error } from './output.js'
2
+
3
+ export function handleError(err: unknown): never {
4
+ if (err instanceof Error) {
5
+ error(err.message)
6
+ } else {
7
+ error(String(err))
8
+ }
9
+ process.exit(1)
10
+ }