pipework 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/bin/pipework.js +5 -0
  4. package/dist/audit/emit.d.ts +3 -0
  5. package/dist/audit/emit.d.ts.map +1 -0
  6. package/dist/audit/emit.js +66 -0
  7. package/dist/audit/emit.js.map +1 -0
  8. package/dist/audit/index.d.ts +3 -0
  9. package/dist/audit/index.d.ts.map +1 -0
  10. package/dist/audit/index.js +2 -0
  11. package/dist/audit/index.js.map +1 -0
  12. package/dist/audit/namespace.d.ts +5 -0
  13. package/dist/audit/namespace.d.ts.map +1 -0
  14. package/dist/audit/namespace.js +5 -0
  15. package/dist/audit/namespace.js.map +1 -0
  16. package/dist/audit/types.d.ts +17 -0
  17. package/dist/audit/types.d.ts.map +1 -0
  18. package/dist/audit/types.js +2 -0
  19. package/dist/audit/types.js.map +1 -0
  20. package/dist/auth/chain.d.ts +21 -0
  21. package/dist/auth/chain.d.ts.map +1 -0
  22. package/dist/auth/chain.js +45 -0
  23. package/dist/auth/chain.js.map +1 -0
  24. package/dist/auth/cookie.d.ts +18 -0
  25. package/dist/auth/cookie.d.ts.map +1 -0
  26. package/dist/auth/cookie.js +55 -0
  27. package/dist/auth/cookie.js.map +1 -0
  28. package/dist/auth/index.d.ts +10 -0
  29. package/dist/auth/index.d.ts.map +1 -0
  30. package/dist/auth/index.js +5 -0
  31. package/dist/auth/index.js.map +1 -0
  32. package/dist/auth/multi-org.d.ts +68 -0
  33. package/dist/auth/multi-org.d.ts.map +1 -0
  34. package/dist/auth/multi-org.js +163 -0
  35. package/dist/auth/multi-org.js.map +1 -0
  36. package/dist/auth/namespace.d.ts +14 -0
  37. package/dist/auth/namespace.d.ts.map +1 -0
  38. package/dist/auth/namespace.js +14 -0
  39. package/dist/auth/namespace.js.map +1 -0
  40. package/dist/auth/sessions.d.ts +64 -0
  41. package/dist/auth/sessions.d.ts.map +1 -0
  42. package/dist/auth/sessions.js +230 -0
  43. package/dist/auth/sessions.js.map +1 -0
  44. package/dist/auth/types.d.ts +14 -0
  45. package/dist/auth/types.d.ts.map +1 -0
  46. package/dist/auth/types.js +2 -0
  47. package/dist/auth/types.js.map +1 -0
  48. package/dist/behavior/audited.d.ts +5 -0
  49. package/dist/behavior/audited.d.ts.map +1 -0
  50. package/dist/behavior/audited.js +78 -0
  51. package/dist/behavior/audited.js.map +1 -0
  52. package/dist/behavior/cached.d.ts +7 -0
  53. package/dist/behavior/cached.d.ts.map +1 -0
  54. package/dist/behavior/cached.js +48 -0
  55. package/dist/behavior/cached.js.map +1 -0
  56. package/dist/behavior/compose.d.ts +4 -0
  57. package/dist/behavior/compose.d.ts.map +1 -0
  58. package/dist/behavior/compose.js +18 -0
  59. package/dist/behavior/compose.js.map +1 -0
  60. package/dist/behavior/index.d.ts +6 -0
  61. package/dist/behavior/index.d.ts.map +1 -0
  62. package/dist/behavior/index.js +5 -0
  63. package/dist/behavior/index.js.map +1 -0
  64. package/dist/behavior/namespace.d.ts +11 -0
  65. package/dist/behavior/namespace.d.ts.map +1 -0
  66. package/dist/behavior/namespace.js +11 -0
  67. package/dist/behavior/namespace.js.map +1 -0
  68. package/dist/behavior/types.d.ts +23 -0
  69. package/dist/behavior/types.d.ts.map +1 -0
  70. package/dist/behavior/types.js +2 -0
  71. package/dist/behavior/types.js.map +1 -0
  72. package/dist/behavior/versioned.d.ts +4 -0
  73. package/dist/behavior/versioned.d.ts.map +1 -0
  74. package/dist/behavior/versioned.js +39 -0
  75. package/dist/behavior/versioned.js.map +1 -0
  76. package/dist/cache/create.d.ts +3 -0
  77. package/dist/cache/create.d.ts.map +1 -0
  78. package/dist/cache/create.js +90 -0
  79. package/dist/cache/create.js.map +1 -0
  80. package/dist/cache/index.d.ts +5 -0
  81. package/dist/cache/index.d.ts.map +1 -0
  82. package/dist/cache/index.js +3 -0
  83. package/dist/cache/index.js.map +1 -0
  84. package/dist/cache/namespace.d.ts +7 -0
  85. package/dist/cache/namespace.d.ts.map +1 -0
  86. package/dist/cache/namespace.js +7 -0
  87. package/dist/cache/namespace.js.map +1 -0
  88. package/dist/cache/tenant.d.ts +21 -0
  89. package/dist/cache/tenant.d.ts.map +1 -0
  90. package/dist/cache/tenant.js +101 -0
  91. package/dist/cache/tenant.js.map +1 -0
  92. package/dist/cache/types.d.ts +22 -0
  93. package/dist/cache/types.d.ts.map +1 -0
  94. package/dist/cache/types.js +2 -0
  95. package/dist/cache/types.js.map +1 -0
  96. package/dist/cli/commands/check.d.ts +2 -0
  97. package/dist/cli/commands/check.d.ts.map +1 -0
  98. package/dist/cli/commands/check.js +28 -0
  99. package/dist/cli/commands/check.js.map +1 -0
  100. package/dist/cli/commands/dev.d.ts +7 -0
  101. package/dist/cli/commands/dev.d.ts.map +1 -0
  102. package/dist/cli/commands/dev.js +19 -0
  103. package/dist/cli/commands/dev.js.map +1 -0
  104. package/dist/cli/commands/init.d.ts +2 -0
  105. package/dist/cli/commands/init.d.ts.map +1 -0
  106. package/dist/cli/commands/init.js +33 -0
  107. package/dist/cli/commands/init.js.map +1 -0
  108. package/dist/cli/commands/migrate.d.ts +7 -0
  109. package/dist/cli/commands/migrate.d.ts.map +1 -0
  110. package/dist/cli/commands/migrate.js +45 -0
  111. package/dist/cli/commands/migrate.js.map +1 -0
  112. package/dist/cli/errors.d.ts +2 -0
  113. package/dist/cli/errors.d.ts.map +1 -0
  114. package/dist/cli/errors.js +11 -0
  115. package/dist/cli/errors.js.map +1 -0
  116. package/dist/cli/index.d.ts +2 -0
  117. package/dist/cli/index.d.ts.map +1 -0
  118. package/dist/cli/index.js +84 -0
  119. package/dist/cli/index.js.map +1 -0
  120. package/dist/cli/output.d.ts +10 -0
  121. package/dist/cli/output.d.ts.map +1 -0
  122. package/dist/cli/output.js +16 -0
  123. package/dist/cli/output.js.map +1 -0
  124. package/dist/config/index.d.ts +4 -0
  125. package/dist/config/index.d.ts.map +1 -0
  126. package/dist/config/index.js +4 -0
  127. package/dist/config/index.js.map +1 -0
  128. package/dist/config/load.d.ts +23 -0
  129. package/dist/config/load.d.ts.map +1 -0
  130. package/dist/config/load.js +103 -0
  131. package/dist/config/load.js.map +1 -0
  132. package/dist/config/namespace.d.ts +38 -0
  133. package/dist/config/namespace.d.ts.map +1 -0
  134. package/dist/config/namespace.js +7 -0
  135. package/dist/config/namespace.js.map +1 -0
  136. package/dist/config/resolve.d.ts +8 -0
  137. package/dist/config/resolve.d.ts.map +1 -0
  138. package/dist/config/resolve.js +35 -0
  139. package/dist/config/resolve.js.map +1 -0
  140. package/dist/config/schema.d.ts +75 -0
  141. package/dist/config/schema.d.ts.map +1 -0
  142. package/dist/config/schema.js +26 -0
  143. package/dist/config/schema.js.map +1 -0
  144. package/dist/context/create.d.ts +20 -0
  145. package/dist/context/create.d.ts.map +1 -0
  146. package/dist/context/create.js +38 -0
  147. package/dist/context/create.js.map +1 -0
  148. package/dist/context/guard.d.ts +5 -0
  149. package/dist/context/guard.d.ts.map +1 -0
  150. package/dist/context/guard.js +30 -0
  151. package/dist/context/guard.js.map +1 -0
  152. package/dist/context/index.d.ts +5 -0
  153. package/dist/context/index.d.ts.map +1 -0
  154. package/dist/context/index.js +4 -0
  155. package/dist/context/index.js.map +1 -0
  156. package/dist/context/store.d.ts +7 -0
  157. package/dist/context/store.d.ts.map +1 -0
  158. package/dist/context/store.js +18 -0
  159. package/dist/context/store.js.map +1 -0
  160. package/dist/context/types.d.ts +25 -0
  161. package/dist/context/types.d.ts.map +1 -0
  162. package/dist/context/types.js +2 -0
  163. package/dist/context/types.js.map +1 -0
  164. package/dist/db/col/index.d.ts +2 -0
  165. package/dist/db/col/index.d.ts.map +1 -0
  166. package/dist/db/col/index.js +5 -0
  167. package/dist/db/col/index.js.map +1 -0
  168. package/dist/db/context.d.ts +4 -0
  169. package/dist/db/context.d.ts.map +1 -0
  170. package/dist/db/context.js +3 -0
  171. package/dist/db/context.js.map +1 -0
  172. package/dist/db/db.d.ts +6 -0
  173. package/dist/db/db.d.ts.map +1 -0
  174. package/dist/db/db.js +50 -0
  175. package/dist/db/db.js.map +1 -0
  176. package/dist/db/filter.d.ts +46 -0
  177. package/dist/db/filter.d.ts.map +1 -0
  178. package/dist/db/filter.js +9 -0
  179. package/dist/db/filter.js.map +1 -0
  180. package/dist/db/generated/drizzle-orm/aggregate.d.ts +2 -0
  181. package/dist/db/generated/drizzle-orm/aggregate.d.ts.map +1 -0
  182. package/dist/db/generated/drizzle-orm/aggregate.js +5 -0
  183. package/dist/db/generated/drizzle-orm/aggregate.js.map +1 -0
  184. package/dist/db/generated/drizzle-orm/introspection.d.ts +2 -0
  185. package/dist/db/generated/drizzle-orm/introspection.d.ts.map +1 -0
  186. package/dist/db/generated/drizzle-orm/introspection.js +5 -0
  187. package/dist/db/generated/drizzle-orm/introspection.js.map +1 -0
  188. package/dist/db/generated/drizzle-orm/operator.d.ts +2 -0
  189. package/dist/db/generated/drizzle-orm/operator.d.ts.map +1 -0
  190. package/dist/db/generated/drizzle-orm/operator.js +5 -0
  191. package/dist/db/generated/drizzle-orm/operator.js.map +1 -0
  192. package/dist/db/generated/drizzle-orm/relation.d.ts +2 -0
  193. package/dist/db/generated/drizzle-orm/relation.d.ts.map +1 -0
  194. package/dist/db/generated/drizzle-orm/relation.js +5 -0
  195. package/dist/db/generated/drizzle-orm/relation.js.map +1 -0
  196. package/dist/db/generated/drizzle-orm/type.d.ts +3 -0
  197. package/dist/db/generated/drizzle-orm/type.d.ts.map +1 -0
  198. package/dist/db/generated/drizzle-orm/type.js +5 -0
  199. package/dist/db/generated/drizzle-orm/type.js.map +1 -0
  200. package/dist/db/generated/pg-core/introspection.d.ts +2 -0
  201. package/dist/db/generated/pg-core/introspection.d.ts.map +1 -0
  202. package/dist/db/generated/pg-core/introspection.js +5 -0
  203. package/dist/db/generated/pg-core/introspection.js.map +1 -0
  204. package/dist/db/generated/pg-core/set-operation.d.ts +2 -0
  205. package/dist/db/generated/pg-core/set-operation.d.ts.map +1 -0
  206. package/dist/db/generated/pg-core/set-operation.js +5 -0
  207. package/dist/db/generated/pg-core/set-operation.js.map +1 -0
  208. package/dist/db/generated/pg-core/type.d.ts +3 -0
  209. package/dist/db/generated/pg-core/type.d.ts.map +1 -0
  210. package/dist/db/generated/pg-core/type.js +5 -0
  211. package/dist/db/generated/pg-core/type.js.map +1 -0
  212. package/dist/db/identifiers.d.ts +3 -0
  213. package/dist/db/identifiers.d.ts.map +1 -0
  214. package/dist/db/identifiers.js +13 -0
  215. package/dist/db/identifiers.js.map +1 -0
  216. package/dist/db/idx/index.d.ts +2 -0
  217. package/dist/db/idx/index.d.ts.map +1 -0
  218. package/dist/db/idx/index.js +5 -0
  219. package/dist/db/idx/index.js.map +1 -0
  220. package/dist/db/index.d.ts +8 -0
  221. package/dist/db/index.d.ts.map +1 -0
  222. package/dist/db/index.js +6 -0
  223. package/dist/db/index.js.map +1 -0
  224. package/dist/db/namespace.d.ts +66 -0
  225. package/dist/db/namespace.d.ts.map +1 -0
  226. package/dist/db/namespace.js +22 -0
  227. package/dist/db/namespace.js.map +1 -0
  228. package/dist/db/pool.d.ts +16 -0
  229. package/dist/db/pool.d.ts.map +1 -0
  230. package/dist/db/pool.js +36 -0
  231. package/dist/db/pool.js.map +1 -0
  232. package/dist/db/schema-features.d.ts +2 -0
  233. package/dist/db/schema-features.d.ts.map +1 -0
  234. package/dist/db/schema-features.js +4 -0
  235. package/dist/db/schema-features.js.map +1 -0
  236. package/dist/db/sql.d.ts +2 -0
  237. package/dist/db/sql.d.ts.map +1 -0
  238. package/dist/db/sql.js +2 -0
  239. package/dist/db/sql.js.map +1 -0
  240. package/dist/db/types.d.ts +7 -0
  241. package/dist/db/types.d.ts.map +1 -0
  242. package/dist/db/types.js +2 -0
  243. package/dist/db/types.js.map +1 -0
  244. package/dist/di/builder.d.ts +60 -0
  245. package/dist/di/builder.d.ts.map +1 -0
  246. package/dist/di/builder.js +152 -0
  247. package/dist/di/builder.js.map +1 -0
  248. package/dist/di/index.d.ts +5 -0
  249. package/dist/di/index.d.ts.map +1 -0
  250. package/dist/di/index.js +5 -0
  251. package/dist/di/index.js.map +1 -0
  252. package/dist/di/resolve.d.ts +8 -0
  253. package/dist/di/resolve.d.ts.map +1 -0
  254. package/dist/di/resolve.js +76 -0
  255. package/dist/di/resolve.js.map +1 -0
  256. package/dist/di/types.d.ts +35 -0
  257. package/dist/di/types.d.ts.map +1 -0
  258. package/dist/di/types.js +2 -0
  259. package/dist/di/types.js.map +1 -0
  260. package/dist/drizzle/index.d.ts +3 -0
  261. package/dist/drizzle/index.d.ts.map +1 -0
  262. package/dist/drizzle/index.js +3 -0
  263. package/dist/drizzle/index.js.map +1 -0
  264. package/dist/errors/base.d.ts +7 -0
  265. package/dist/errors/base.d.ts.map +1 -0
  266. package/dist/errors/base.js +9 -0
  267. package/dist/errors/base.js.map +1 -0
  268. package/dist/errors/index.d.ts +3 -0
  269. package/dist/errors/index.d.ts.map +1 -0
  270. package/dist/errors/index.js +3 -0
  271. package/dist/errors/index.js.map +1 -0
  272. package/dist/errors/namespace.d.ts +10 -0
  273. package/dist/errors/namespace.d.ts.map +1 -0
  274. package/dist/errors/namespace.js +10 -0
  275. package/dist/errors/namespace.js.map +1 -0
  276. package/dist/errors/types.d.ts +29 -0
  277. package/dist/errors/types.d.ts.map +1 -0
  278. package/dist/errors/types.js +46 -0
  279. package/dist/errors/types.js.map +1 -0
  280. package/dist/fitting/namespace.d.ts +5 -0
  281. package/dist/fitting/namespace.d.ts.map +1 -0
  282. package/dist/fitting/namespace.js +6 -0
  283. package/dist/fitting/namespace.js.map +1 -0
  284. package/dist/fixture/batch.d.ts +17 -0
  285. package/dist/fixture/batch.d.ts.map +1 -0
  286. package/dist/fixture/batch.js +47 -0
  287. package/dist/fixture/batch.js.map +1 -0
  288. package/dist/fixture/builder.d.ts +11 -0
  289. package/dist/fixture/builder.d.ts.map +1 -0
  290. package/dist/fixture/builder.js +12 -0
  291. package/dist/fixture/builder.js.map +1 -0
  292. package/dist/fixture/errors.d.ts +7 -0
  293. package/dist/fixture/errors.d.ts.map +1 -0
  294. package/dist/fixture/errors.js +9 -0
  295. package/dist/fixture/errors.js.map +1 -0
  296. package/dist/fixture/index.d.ts +9 -0
  297. package/dist/fixture/index.d.ts.map +1 -0
  298. package/dist/fixture/index.js +6 -0
  299. package/dist/fixture/index.js.map +1 -0
  300. package/dist/fixture/namespace.d.ts +15 -0
  301. package/dist/fixture/namespace.d.ts.map +1 -0
  302. package/dist/fixture/namespace.js +15 -0
  303. package/dist/fixture/namespace.js.map +1 -0
  304. package/dist/fixture/paginate.d.ts +13 -0
  305. package/dist/fixture/paginate.d.ts.map +1 -0
  306. package/dist/fixture/paginate.js +29 -0
  307. package/dist/fixture/paginate.js.map +1 -0
  308. package/dist/fixture/register.d.ts +16 -0
  309. package/dist/fixture/register.d.ts.map +1 -0
  310. package/dist/fixture/register.js +181 -0
  311. package/dist/fixture/register.js.map +1 -0
  312. package/dist/fixture/types.d.ts +69 -0
  313. package/dist/fixture/types.d.ts.map +1 -0
  314. package/dist/fixture/types.js +2 -0
  315. package/dist/fixture/types.js.map +1 -0
  316. package/dist/flow/namespace.d.ts +14 -0
  317. package/dist/flow/namespace.d.ts.map +1 -0
  318. package/dist/flow/namespace.js +14 -0
  319. package/dist/flow/namespace.js.map +1 -0
  320. package/dist/http/index.d.ts +4 -0
  321. package/dist/http/index.d.ts.map +1 -0
  322. package/dist/http/index.js +3 -0
  323. package/dist/http/index.js.map +1 -0
  324. package/dist/http/middleware.d.ts +20 -0
  325. package/dist/http/middleware.d.ts.map +1 -0
  326. package/dist/http/middleware.js +62 -0
  327. package/dist/http/middleware.js.map +1 -0
  328. package/dist/http/namespace.d.ts +5 -0
  329. package/dist/http/namespace.d.ts.map +1 -0
  330. package/dist/http/namespace.js +5 -0
  331. package/dist/http/namespace.js.map +1 -0
  332. package/dist/http/response.d.ts +5 -0
  333. package/dist/http/response.d.ts.map +1 -0
  334. package/dist/http/response.js +22 -0
  335. package/dist/http/response.js.map +1 -0
  336. package/dist/http/server.d.ts +15 -0
  337. package/dist/http/server.d.ts.map +1 -0
  338. package/dist/http/server.js +362 -0
  339. package/dist/http/server.js.map +1 -0
  340. package/dist/http/types.d.ts +116 -0
  341. package/dist/http/types.d.ts.map +1 -0
  342. package/dist/http/types.js +2 -0
  343. package/dist/http/types.js.map +1 -0
  344. package/dist/index.d.ts +55 -0
  345. package/dist/index.d.ts.map +1 -0
  346. package/dist/index.js +26 -0
  347. package/dist/index.js.map +1 -0
  348. package/dist/invariants/assert.d.ts +7 -0
  349. package/dist/invariants/assert.d.ts.map +1 -0
  350. package/dist/invariants/assert.js +21 -0
  351. package/dist/invariants/assert.js.map +1 -0
  352. package/dist/invariants/index.d.ts +2 -0
  353. package/dist/invariants/index.d.ts.map +1 -0
  354. package/dist/invariants/index.js +2 -0
  355. package/dist/invariants/index.js.map +1 -0
  356. package/dist/jobs/cron.d.ts +10 -0
  357. package/dist/jobs/cron.d.ts.map +1 -0
  358. package/dist/jobs/cron.js +176 -0
  359. package/dist/jobs/cron.js.map +1 -0
  360. package/dist/jobs/execute.d.ts +12 -0
  361. package/dist/jobs/execute.d.ts.map +1 -0
  362. package/dist/jobs/execute.js +19 -0
  363. package/dist/jobs/execute.js.map +1 -0
  364. package/dist/jobs/index.d.ts +8 -0
  365. package/dist/jobs/index.d.ts.map +1 -0
  366. package/dist/jobs/index.js +4 -0
  367. package/dist/jobs/index.js.map +1 -0
  368. package/dist/jobs/listener.d.ts +32 -0
  369. package/dist/jobs/listener.d.ts.map +1 -0
  370. package/dist/jobs/listener.js +95 -0
  371. package/dist/jobs/listener.js.map +1 -0
  372. package/dist/jobs/namespace.d.ts +10 -0
  373. package/dist/jobs/namespace.d.ts.map +1 -0
  374. package/dist/jobs/namespace.js +10 -0
  375. package/dist/jobs/namespace.js.map +1 -0
  376. package/dist/jobs/queue.d.ts +53 -0
  377. package/dist/jobs/queue.d.ts.map +1 -0
  378. package/dist/jobs/queue.js +162 -0
  379. package/dist/jobs/queue.js.map +1 -0
  380. package/dist/jobs/scheduler.d.ts +31 -0
  381. package/dist/jobs/scheduler.d.ts.map +1 -0
  382. package/dist/jobs/scheduler.js +94 -0
  383. package/dist/jobs/scheduler.js.map +1 -0
  384. package/dist/lifecycle/drain.d.ts +7 -0
  385. package/dist/lifecycle/drain.d.ts.map +1 -0
  386. package/dist/lifecycle/drain.js +24 -0
  387. package/dist/lifecycle/drain.js.map +1 -0
  388. package/dist/lifecycle/health.d.ts +8 -0
  389. package/dist/lifecycle/health.d.ts.map +1 -0
  390. package/dist/lifecycle/health.js +62 -0
  391. package/dist/lifecycle/health.js.map +1 -0
  392. package/dist/lifecycle/index.d.ts +5 -0
  393. package/dist/lifecycle/index.d.ts.map +1 -0
  394. package/dist/lifecycle/index.js +4 -0
  395. package/dist/lifecycle/index.js.map +1 -0
  396. package/dist/lifecycle/namespace.d.ts +5 -0
  397. package/dist/lifecycle/namespace.d.ts.map +1 -0
  398. package/dist/lifecycle/namespace.js +5 -0
  399. package/dist/lifecycle/namespace.js.map +1 -0
  400. package/dist/lifecycle/startup.d.ts +8 -0
  401. package/dist/lifecycle/startup.d.ts.map +1 -0
  402. package/dist/lifecycle/startup.js +43 -0
  403. package/dist/lifecycle/startup.js.map +1 -0
  404. package/dist/lifecycle/types.d.ts +30 -0
  405. package/dist/lifecycle/types.d.ts.map +1 -0
  406. package/dist/lifecycle/types.js +2 -0
  407. package/dist/lifecycle/types.js.map +1 -0
  408. package/dist/log/namespace.d.ts +9 -0
  409. package/dist/log/namespace.d.ts.map +1 -0
  410. package/dist/log/namespace.js +10 -0
  411. package/dist/log/namespace.js.map +1 -0
  412. package/dist/logging/context.d.ts +11 -0
  413. package/dist/logging/context.d.ts.map +1 -0
  414. package/dist/logging/context.js +46 -0
  415. package/dist/logging/context.js.map +1 -0
  416. package/dist/logging/index.d.ts +4 -0
  417. package/dist/logging/index.d.ts.map +1 -0
  418. package/dist/logging/index.js +3 -0
  419. package/dist/logging/index.js.map +1 -0
  420. package/dist/logging/logger.d.ts +8 -0
  421. package/dist/logging/logger.d.ts.map +1 -0
  422. package/dist/logging/logger.js +39 -0
  423. package/dist/logging/logger.js.map +1 -0
  424. package/dist/logging/proxy.d.ts +3 -0
  425. package/dist/logging/proxy.d.ts.map +1 -0
  426. package/dist/logging/proxy.js +12 -0
  427. package/dist/logging/proxy.js.map +1 -0
  428. package/dist/logging/types.d.ts +36 -0
  429. package/dist/logging/types.d.ts.map +1 -0
  430. package/dist/logging/types.js +2 -0
  431. package/dist/logging/types.js.map +1 -0
  432. package/dist/migrate/index.d.ts +2 -0
  433. package/dist/migrate/index.d.ts.map +1 -0
  434. package/dist/migrate/index.js +2 -0
  435. package/dist/migrate/index.js.map +1 -0
  436. package/dist/migrate/run.d.ts +10 -0
  437. package/dist/migrate/run.d.ts.map +1 -0
  438. package/dist/migrate/run.js +45 -0
  439. package/dist/migrate/run.js.map +1 -0
  440. package/dist/openapi/generate.d.ts +13 -0
  441. package/dist/openapi/generate.d.ts.map +1 -0
  442. package/dist/openapi/generate.js +82 -0
  443. package/dist/openapi/generate.js.map +1 -0
  444. package/dist/openapi/index.d.ts +3 -0
  445. package/dist/openapi/index.d.ts.map +1 -0
  446. package/dist/openapi/index.js +2 -0
  447. package/dist/openapi/index.js.map +1 -0
  448. package/dist/openapi/namespace.d.ts +5 -0
  449. package/dist/openapi/namespace.d.ts.map +1 -0
  450. package/dist/openapi/namespace.js +5 -0
  451. package/dist/openapi/namespace.js.map +1 -0
  452. package/dist/pipeline/define.d.ts +3 -0
  453. package/dist/pipeline/define.d.ts.map +1 -0
  454. package/dist/pipeline/define.js +44 -0
  455. package/dist/pipeline/define.js.map +1 -0
  456. package/dist/pipeline/errors.d.ts +17 -0
  457. package/dist/pipeline/errors.d.ts.map +1 -0
  458. package/dist/pipeline/errors.js +28 -0
  459. package/dist/pipeline/errors.js.map +1 -0
  460. package/dist/pipeline/execute.d.ts +4 -0
  461. package/dist/pipeline/execute.d.ts.map +1 -0
  462. package/dist/pipeline/execute.js +90 -0
  463. package/dist/pipeline/execute.js.map +1 -0
  464. package/dist/pipeline/index.d.ts +4 -0
  465. package/dist/pipeline/index.d.ts.map +1 -0
  466. package/dist/pipeline/index.js +3 -0
  467. package/dist/pipeline/index.js.map +1 -0
  468. package/dist/pipeline/namespace.d.ts +8 -0
  469. package/dist/pipeline/namespace.d.ts.map +1 -0
  470. package/dist/pipeline/namespace.js +8 -0
  471. package/dist/pipeline/namespace.js.map +1 -0
  472. package/dist/pipeline/resume.d.ts +4 -0
  473. package/dist/pipeline/resume.d.ts.map +1 -0
  474. package/dist/pipeline/resume.js +100 -0
  475. package/dist/pipeline/resume.js.map +1 -0
  476. package/dist/pipeline/types.d.ts +50 -0
  477. package/dist/pipeline/types.d.ts.map +1 -0
  478. package/dist/pipeline/types.js +2 -0
  479. package/dist/pipeline/types.js.map +1 -0
  480. package/dist/pipework.d.ts +35 -0
  481. package/dist/pipework.d.ts.map +1 -0
  482. package/dist/pipework.js +102 -0
  483. package/dist/pipework.js.map +1 -0
  484. package/dist/rbac/cache.d.ts +13 -0
  485. package/dist/rbac/cache.d.ts.map +1 -0
  486. package/dist/rbac/cache.js +43 -0
  487. package/dist/rbac/cache.js.map +1 -0
  488. package/dist/rbac/check.d.ts +4 -0
  489. package/dist/rbac/check.d.ts.map +1 -0
  490. package/dist/rbac/check.js +20 -0
  491. package/dist/rbac/check.js.map +1 -0
  492. package/dist/rbac/index.d.ts +7 -0
  493. package/dist/rbac/index.d.ts.map +1 -0
  494. package/dist/rbac/index.js +31 -0
  495. package/dist/rbac/index.js.map +1 -0
  496. package/dist/rbac/middleware.d.ts +4 -0
  497. package/dist/rbac/middleware.d.ts.map +1 -0
  498. package/dist/rbac/middleware.js +9 -0
  499. package/dist/rbac/middleware.js.map +1 -0
  500. package/dist/rbac/namespace.d.ts +9 -0
  501. package/dist/rbac/namespace.d.ts.map +1 -0
  502. package/dist/rbac/namespace.js +9 -0
  503. package/dist/rbac/namespace.js.map +1 -0
  504. package/dist/rbac/resolve.d.ts +4 -0
  505. package/dist/rbac/resolve.d.ts.map +1 -0
  506. package/dist/rbac/resolve.js +24 -0
  507. package/dist/rbac/resolve.js.map +1 -0
  508. package/dist/rbac/seed.d.ts +4 -0
  509. package/dist/rbac/seed.d.ts.map +1 -0
  510. package/dist/rbac/seed.js +63 -0
  511. package/dist/rbac/seed.js.map +1 -0
  512. package/dist/rbac/types.d.ts +56 -0
  513. package/dist/rbac/types.d.ts.map +1 -0
  514. package/dist/rbac/types.js +2 -0
  515. package/dist/rbac/types.js.map +1 -0
  516. package/dist/resource/batch.d.ts +17 -0
  517. package/dist/resource/batch.d.ts.map +1 -0
  518. package/dist/resource/batch.js +47 -0
  519. package/dist/resource/batch.js.map +1 -0
  520. package/dist/resource/builder.d.ts +11 -0
  521. package/dist/resource/builder.d.ts.map +1 -0
  522. package/dist/resource/builder.js +12 -0
  523. package/dist/resource/builder.js.map +1 -0
  524. package/dist/resource/errors.d.ts +7 -0
  525. package/dist/resource/errors.d.ts.map +1 -0
  526. package/dist/resource/errors.js +9 -0
  527. package/dist/resource/errors.js.map +1 -0
  528. package/dist/resource/index.d.ts +9 -0
  529. package/dist/resource/index.d.ts.map +1 -0
  530. package/dist/resource/index.js +6 -0
  531. package/dist/resource/index.js.map +1 -0
  532. package/dist/resource/paginate.d.ts +13 -0
  533. package/dist/resource/paginate.d.ts.map +1 -0
  534. package/dist/resource/paginate.js +29 -0
  535. package/dist/resource/paginate.js.map +1 -0
  536. package/dist/resource/register.d.ts +16 -0
  537. package/dist/resource/register.d.ts.map +1 -0
  538. package/dist/resource/register.js +181 -0
  539. package/dist/resource/register.js.map +1 -0
  540. package/dist/resource/types.d.ts +69 -0
  541. package/dist/resource/types.d.ts.map +1 -0
  542. package/dist/resource/types.js +2 -0
  543. package/dist/resource/types.js.map +1 -0
  544. package/dist/schema/branded.d.ts +3 -0
  545. package/dist/schema/branded.d.ts.map +1 -0
  546. package/dist/schema/branded.js +8 -0
  547. package/dist/schema/branded.js.map +1 -0
  548. package/dist/schema/generated/coerce.d.ts +2 -0
  549. package/dist/schema/generated/coerce.d.ts.map +1 -0
  550. package/dist/schema/generated/coerce.js +5 -0
  551. package/dist/schema/generated/coerce.js.map +1 -0
  552. package/dist/schema/generated/combinator.d.ts +3 -0
  553. package/dist/schema/generated/combinator.d.ts.map +1 -0
  554. package/dist/schema/generated/combinator.js +5 -0
  555. package/dist/schema/generated/combinator.js.map +1 -0
  556. package/dist/schema/generated/encoding.d.ts +2 -0
  557. package/dist/schema/generated/encoding.d.ts.map +1 -0
  558. package/dist/schema/generated/encoding.js +5 -0
  559. package/dist/schema/generated/encoding.js.map +1 -0
  560. package/dist/schema/generated/error.d.ts +3 -0
  561. package/dist/schema/generated/error.d.ts.map +1 -0
  562. package/dist/schema/generated/error.js +5 -0
  563. package/dist/schema/generated/error.js.map +1 -0
  564. package/dist/schema/generated/format.d.ts +2 -0
  565. package/dist/schema/generated/format.d.ts.map +1 -0
  566. package/dist/schema/generated/format.js +5 -0
  567. package/dist/schema/generated/format.js.map +1 -0
  568. package/dist/schema/generated/type-constructor.d.ts +3 -0
  569. package/dist/schema/generated/type-constructor.d.ts.map +1 -0
  570. package/dist/schema/generated/type-constructor.js +5 -0
  571. package/dist/schema/generated/type-constructor.js.map +1 -0
  572. package/dist/schema/generated/type.d.ts +3 -0
  573. package/dist/schema/generated/type.d.ts.map +1 -0
  574. package/dist/schema/generated/type.js +5 -0
  575. package/dist/schema/generated/type.js.map +1 -0
  576. package/dist/schema/index.d.ts +6 -0
  577. package/dist/schema/index.d.ts.map +1 -0
  578. package/dist/schema/index.js +5 -0
  579. package/dist/schema/index.js.map +1 -0
  580. package/dist/schema/json-schema.d.ts +5 -0
  581. package/dist/schema/json-schema.d.ts.map +1 -0
  582. package/dist/schema/json-schema.js +5 -0
  583. package/dist/schema/json-schema.js.map +1 -0
  584. package/dist/schema/namespace.d.ts +128 -0
  585. package/dist/schema/namespace.d.ts.map +1 -0
  586. package/dist/schema/namespace.js +37 -0
  587. package/dist/schema/namespace.js.map +1 -0
  588. package/dist/schema/parse.d.ts +11 -0
  589. package/dist/schema/parse.d.ts.map +1 -0
  590. package/dist/schema/parse.js +30 -0
  591. package/dist/schema/parse.js.map +1 -0
  592. package/dist/schema/types.d.ts +4 -0
  593. package/dist/schema/types.d.ts.map +1 -0
  594. package/dist/schema/types.js +2 -0
  595. package/dist/schema/types.js.map +1 -0
  596. package/dist/state-machine/define.d.ts +3 -0
  597. package/dist/state-machine/define.d.ts.map +1 -0
  598. package/dist/state-machine/define.js +46 -0
  599. package/dist/state-machine/define.js.map +1 -0
  600. package/dist/state-machine/errors.d.ts +12 -0
  601. package/dist/state-machine/errors.d.ts.map +1 -0
  602. package/dist/state-machine/errors.js +19 -0
  603. package/dist/state-machine/errors.js.map +1 -0
  604. package/dist/state-machine/index.d.ts +4 -0
  605. package/dist/state-machine/index.d.ts.map +1 -0
  606. package/dist/state-machine/index.js +3 -0
  607. package/dist/state-machine/index.js.map +1 -0
  608. package/dist/state-machine/namespace.d.ts +8 -0
  609. package/dist/state-machine/namespace.d.ts.map +1 -0
  610. package/dist/state-machine/namespace.js +8 -0
  611. package/dist/state-machine/namespace.js.map +1 -0
  612. package/dist/state-machine/transition.d.ts +7 -0
  613. package/dist/state-machine/transition.d.ts.map +1 -0
  614. package/dist/state-machine/transition.js +57 -0
  615. package/dist/state-machine/transition.js.map +1 -0
  616. package/dist/state-machine/types.d.ts +33 -0
  617. package/dist/state-machine/types.d.ts.map +1 -0
  618. package/dist/state-machine/types.js +2 -0
  619. package/dist/state-machine/types.js.map +1 -0
  620. package/dist/temporal/close.d.ts +3 -0
  621. package/dist/temporal/close.d.ts.map +1 -0
  622. package/dist/temporal/close.js +19 -0
  623. package/dist/temporal/close.js.map +1 -0
  624. package/dist/temporal/columns.d.ts +7 -0
  625. package/dist/temporal/columns.d.ts.map +1 -0
  626. package/dist/temporal/columns.js +10 -0
  627. package/dist/temporal/columns.js.map +1 -0
  628. package/dist/temporal/errors.d.ts +7 -0
  629. package/dist/temporal/errors.d.ts.map +1 -0
  630. package/dist/temporal/errors.js +9 -0
  631. package/dist/temporal/errors.js.map +1 -0
  632. package/dist/temporal/get-current.d.ts +3 -0
  633. package/dist/temporal/get-current.d.ts.map +1 -0
  634. package/dist/temporal/get-current.js +18 -0
  635. package/dist/temporal/get-current.js.map +1 -0
  636. package/dist/temporal/index.d.ts +8 -0
  637. package/dist/temporal/index.d.ts.map +1 -0
  638. package/dist/temporal/index.js +7 -0
  639. package/dist/temporal/index.js.map +1 -0
  640. package/dist/temporal/namespace.d.ts +16 -0
  641. package/dist/temporal/namespace.d.ts.map +1 -0
  642. package/dist/temporal/namespace.js +16 -0
  643. package/dist/temporal/namespace.js.map +1 -0
  644. package/dist/temporal/query.d.ts +10 -0
  645. package/dist/temporal/query.d.ts.map +1 -0
  646. package/dist/temporal/query.js +11 -0
  647. package/dist/temporal/query.js.map +1 -0
  648. package/dist/temporal/revise.d.ts +3 -0
  649. package/dist/temporal/revise.d.ts.map +1 -0
  650. package/dist/temporal/revise.js +52 -0
  651. package/dist/temporal/revise.js.map +1 -0
  652. package/dist/temporal/types.d.ts +19 -0
  653. package/dist/temporal/types.d.ts.map +1 -0
  654. package/dist/temporal/types.js +2 -0
  655. package/dist/temporal/types.js.map +1 -0
  656. package/dist/tenant/extract.d.ts +6 -0
  657. package/dist/tenant/extract.d.ts.map +1 -0
  658. package/dist/tenant/extract.js +18 -0
  659. package/dist/tenant/extract.js.map +1 -0
  660. package/dist/tenant/index.d.ts +6 -0
  661. package/dist/tenant/index.d.ts.map +1 -0
  662. package/dist/tenant/index.js +5 -0
  663. package/dist/tenant/index.js.map +1 -0
  664. package/dist/tenant/namespace.d.ts +13 -0
  665. package/dist/tenant/namespace.d.ts.map +1 -0
  666. package/dist/tenant/namespace.js +13 -0
  667. package/dist/tenant/namespace.js.map +1 -0
  668. package/dist/tenant/propagate.d.ts +4 -0
  669. package/dist/tenant/propagate.d.ts.map +1 -0
  670. package/dist/tenant/propagate.js +15 -0
  671. package/dist/tenant/propagate.js.map +1 -0
  672. package/dist/tenant/rls.d.ts +5 -0
  673. package/dist/tenant/rls.d.ts.map +1 -0
  674. package/dist/tenant/rls.js +33 -0
  675. package/dist/tenant/rls.js.map +1 -0
  676. package/dist/tenant/types.d.ts +12 -0
  677. package/dist/tenant/types.d.ts.map +1 -0
  678. package/dist/tenant/types.js +2 -0
  679. package/dist/tenant/types.js.map +1 -0
  680. package/dist/tenant/validate.d.ts +4 -0
  681. package/dist/tenant/validate.d.ts.map +1 -0
  682. package/dist/tenant/validate.js +20 -0
  683. package/dist/tenant/validate.js.map +1 -0
  684. package/dist/test/auth.d.ts +7 -0
  685. package/dist/test/auth.d.ts.map +1 -0
  686. package/dist/test/auth.js +11 -0
  687. package/dist/test/auth.js.map +1 -0
  688. package/dist/test/context.d.ts +10 -0
  689. package/dist/test/context.d.ts.map +1 -0
  690. package/dist/test/context.js +26 -0
  691. package/dist/test/context.js.map +1 -0
  692. package/dist/test/index.d.ts +6 -0
  693. package/dist/test/index.d.ts.map +1 -0
  694. package/dist/test/index.js +6 -0
  695. package/dist/test/index.js.map +1 -0
  696. package/dist/test/plugin.d.ts +16 -0
  697. package/dist/test/plugin.d.ts.map +1 -0
  698. package/dist/test/plugin.js +63 -0
  699. package/dist/test/plugin.js.map +1 -0
  700. package/dist/test/setup.d.ts +11 -0
  701. package/dist/test/setup.d.ts.map +1 -0
  702. package/dist/test/setup.js +76 -0
  703. package/dist/test/setup.js.map +1 -0
  704. package/dist/test/vitest.d.ts +9 -0
  705. package/dist/test/vitest.d.ts.map +1 -0
  706. package/dist/test/vitest.js +58 -0
  707. package/dist/test/vitest.js.map +1 -0
  708. package/dist/trunk.d.ts +35 -0
  709. package/dist/trunk.d.ts.map +1 -0
  710. package/dist/trunk.js +102 -0
  711. package/dist/trunk.js.map +1 -0
  712. package/dist/vector/index.d.ts +4 -0
  713. package/dist/vector/index.d.ts.map +1 -0
  714. package/dist/vector/index.js +4 -0
  715. package/dist/vector/index.js.map +1 -0
  716. package/dist/vector/namespace.d.ts +16 -0
  717. package/dist/vector/namespace.d.ts.map +1 -0
  718. package/dist/vector/namespace.js +16 -0
  719. package/dist/vector/namespace.js.map +1 -0
  720. package/dist/vector/query.d.ts +9 -0
  721. package/dist/vector/query.d.ts.map +1 -0
  722. package/dist/vector/query.js +33 -0
  723. package/dist/vector/query.js.map +1 -0
  724. package/dist/vector/types.d.ts +19 -0
  725. package/dist/vector/types.d.ts.map +1 -0
  726. package/dist/vector/types.js +26 -0
  727. package/dist/vector/types.js.map +1 -0
  728. package/dist/vector/validate.d.ts +3 -0
  729. package/dist/vector/validate.d.ts.map +1 -0
  730. package/dist/vector/validate.js +10 -0
  731. package/dist/vector/validate.js.map +1 -0
  732. package/package.json +138 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 The Constructory
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # Pipework
2
+
3
+ A TypeScript framework for multi-tenant SaaS applications. PostgreSQL-only. Owns the wiring between Drizzle, Fastify, Vitest, and Zod so your application code never has to.
4
+
5
+ ## What it does
6
+
7
+ Pipework eliminates the infrastructure decisions that every SaaS backend makes independently and gets wrong:
8
+
9
+ - **Database wiring** — named connections, pooling, context-aware `pipe()` accessor, test isolation
10
+ - **Request context** — AsyncLocalStorage propagation of auth, tenant, transactions from HTTP entry to database query
11
+ - **DI builder** — type-safe handler composition with `.use()`, `.auth()`, `.input()`, `.output()`, `.route()`, `.fit()`
12
+ - **Multi-tenant scoping** — `SET LOCAL` propagation, tenant extraction from auth, UUID validation
13
+ - **Auth chain** — pluggable strategies, enrichers, session management with JWT refresh rotation, cookie-based token delivery
14
+ - **Multi-org auth** — org selection on login, org switching, membership management via `auth.createMultiOrg()`
15
+ - **RBAC** — hierarchical scope resolution, permission caching, DI integration via `.permission()`
16
+ - **Background jobs** — Postgres-backed queue with `SKIP LOCKED`, heartbeat, reaper, `LISTEN/NOTIFY`, synchronous wait (`jobs.enqueueAndWait`)
17
+ - **Cron scheduling** — recurring jobs with cron expressions, dedup, catch-up on missed ticks
18
+ - **Temporal records** — SCD Type 2 versioning with atomic `temporal.revise()`, point-in-time queries
19
+ - **Resource CRUD** — `fixture` builder with cursor-based pagination, batch operations (preview + execute), auth, tenant scoping, 404/405
20
+ - **Composable behaviors** — `behavior.compose()` to stack versioned + audited + cached on any resource
21
+ - **State machines** — validated transitions with guards and audit integration
22
+ - **Pipelines** — ordered sync/async step execution with persistent state and resume
23
+ - **HTTP security** — CORS, Helmet, rate limiting via `http.createServer()`, production startup validation (refuses insecure defaults)
24
+ - **Structured logging** — context-aware `log` proxy with automatic correlation fields (requestId, tenantId, userId, sessionId, traceId, jobType), configurable redaction, `X-Request-Id` response header
25
+ - **OpenAPI** — automatic schema generation from handler metadata, served at `/openapi.json`
26
+
27
+ ## Quick example
28
+
29
+ ```typescript
30
+ import { createPipework, http, pipe, fitting, schema } from 'pipework'
31
+
32
+ const instance = createPipework({
33
+ databases: { app: { url: 'DATABASE_URL', testUrl: 'DATABASE_URL_TEST' } },
34
+ })
35
+
36
+ const createNote = fitting
37
+ .use('app')
38
+ .auth<{ userId: string; tenantId: string }>()
39
+ .input(schema.object({ title: schema.string(), body: schema.string() }))
40
+ .route('POST', '/notes')
41
+ .fit(async ({ app, auth, input }) => {
42
+ const [note] = await app
43
+ .insert(notes)
44
+ .values({ ...input, tenantId: auth.tenantId })
45
+ .returning()
46
+ return note
47
+ })
48
+
49
+ const server = http.createServer(instance, {
50
+ auth: { strategy: myAuthStrategy },
51
+ tenant: { extract: (auth) => auth.tenantId },
52
+ })
53
+
54
+ server.registerHandlers([createNote])
55
+ await server.listen()
56
+ ```
57
+
58
+ ## Install
59
+
60
+ ```bash
61
+ pnpm add pipework
62
+ ```
63
+
64
+ Includes `drizzle-orm`, `postgres`, `zod`, and `fastify` — no additional dependencies needed.
65
+
66
+ Database operations, schema builders, and validation are all accessed through pipework's namespaces:
67
+
68
+ ```typescript
69
+ import { pipe, schema } from 'pipework'
70
+
71
+ // Database: table definitions, SQL, operators
72
+ const users = pipe.table('users', {
73
+ id: pipe.col.uuid('id').primaryKey().defaultRandom(),
74
+ name: pipe.col.text('name').notNull(),
75
+ })
76
+
77
+ // Validation
78
+ const input = schema.object({ name: schema.string().min(1) })
79
+ ```
80
+
81
+ ## Documentation
82
+
83
+ - **[Getting Started](docs/getting-started.md)** — zero to running server
84
+ - **Guides**
85
+ - [Configuration](docs/guides/configuration.md)
86
+ - [DI Builder & Handlers](docs/guides/handlers.md)
87
+ - [Authentication & Tenants](docs/guides/auth-and-tenants.md)
88
+ - [Background Jobs](docs/guides/jobs.md)
89
+ - [Cron Scheduling](docs/guides/cron.md)
90
+ - [Temporal Records](docs/guides/temporal.md)
91
+ - [Resource CRUD](docs/guides/resources.md)
92
+ - [Caching](docs/guides/caching.md)
93
+ - [State Machines](docs/guides/state-machines.md)
94
+ - [Pipelines](docs/guides/pipelines.md)
95
+ - [pgvector & Search](docs/guides/vector.md)
96
+ - [RBAC](docs/guides/rbac.md)
97
+ - [Audit Trail](docs/guides/audit.md)
98
+ - [HTTP Security](docs/guides/security.md)
99
+ - [Logging](docs/guides/logging.md)
100
+ - [OpenAPI](docs/guides/openapi.md)
101
+ - [Testing](docs/guides/testing.md)
102
+ - [Error Handling](docs/guides/errors.md)
103
+ - **Recipes** — composing primitives for real use cases
104
+ - [Content Pipeline](docs/recipes/content-pipeline.md) — document lifecycle, versioning, chunking, embedding
105
+ - [Flexible Entities](docs/recipes/flexible-entities.md) — runtime-validated JSONB over fixed tables
106
+ - [Assertion Provenance](docs/recipes/assertion-provenance.md) — sourced claims, conflict detection, audit
107
+
108
+ ## Design principles
109
+
110
+ 1. **Resolution, not reimplementation.** Wraps Drizzle, Fastify, Vitest, and Zod. Doesn't replace them.
111
+ 2. **Constraints over conventions.** If a rule can be enforced in code, it is.
112
+ 3. **Fail at startup, not at first use.** Missing config throws immediately with what's wrong and how to fix it.
113
+ 4. **PostgreSQL-only.** No database abstraction. Build deep on Postgres features.
114
+ 5. **TypeScript strict mode.** `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess` — all enabled.
115
+
116
+ ## Tech stack
117
+
118
+ - **PostgreSQL** — the only supported database
119
+ - **postgres.js** — connection driver
120
+ - **Drizzle ORM** — schema-as-code, no binary runtime
121
+ - **Zod** — runtime validation with TypeScript inference
122
+ - **Fastify** — HTTP framework (wrapped, not replaced)
123
+ - **Vitest** — test runner
124
+ - **Pino** — structured logging
125
+
126
+ ## License
127
+
128
+ MIT
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { run } from '../dist/cli/index.js'
4
+
5
+ run(process.argv.slice(2))
@@ -0,0 +1,3 @@
1
+ import type { AuditConfig, Audit } from './types.js';
2
+ export declare function createAudit(config: AuditConfig): Audit;
3
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/audit/emit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAoB,KAAK,EAAE,MAAM,YAAY,CAAA;AAItE,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAyEtD"}
@@ -0,0 +1,66 @@
1
+ import { sql } from '../db/sql.js';
2
+ import { getContext } from '../context/store.js';
3
+ import { assertValidIdentifier, quoteIdentifier } from '../db/identifiers.js';
4
+ export function createAudit(config) {
5
+ const table = config.table ?? 'pipework_audit_events';
6
+ assertValidIdentifier(table, 'audit table');
7
+ return {
8
+ async emit(options) {
9
+ const ctx = getContext();
10
+ if (!ctx) {
11
+ throw new Error('[pipework] audit.emit() called outside a managed context. ' +
12
+ 'It must run inside a request handler or job.');
13
+ }
14
+ if (ctx.tenant === null) {
15
+ throw new Error('[pipework] audit.emit() requires tenant context. ' +
16
+ 'Configure tenant extraction in createServer().');
17
+ }
18
+ if (ctx.auth === null) {
19
+ throw new Error('[pipework] audit.emit() requires authenticated context. ' +
20
+ 'Ensure the handler uses .auth() or the route is not .public().');
21
+ }
22
+ const userId = extractUserId(ctx.auth);
23
+ if (userId === null) {
24
+ throw new Error('[pipework] audit.emit() requires auth.userId. ' +
25
+ 'Ensure the auth object has a userId field.');
26
+ }
27
+ const bound = ctx.transactions.get(config.database);
28
+ if (!bound) {
29
+ throw new Error(`[pipework] audit.emit() requires an active transaction on database "${config.database}". ` +
30
+ `Configure transactionPerRequest: ['${config.database}'] in createServer().`);
31
+ }
32
+ const tx = bound.drizzle;
33
+ const sessionId = config.sessionIdField !== undefined && typeof ctx.auth === 'object'
34
+ ? ctx.auth[config.sessionIdField] ?? null
35
+ : null;
36
+ const beforeJson = options.before !== undefined ? JSON.stringify(options.before) : null;
37
+ const afterJson = options.after !== undefined ? JSON.stringify(options.after) : null;
38
+ const metadataJson = options.metadata !== undefined ? JSON.stringify(options.metadata) : null;
39
+ const result = await tx.execute(sql `
40
+ INSERT INTO ${sql.raw(quoteIdentifier(table, 'audit table'))} (tenant_id, request_id, user_id, session_id, action_type, entity_type, entity_id, before_state, after_state, metadata)
41
+ VALUES (
42
+ ${ctx.tenant},
43
+ ${ctx.requestId},
44
+ ${userId},
45
+ ${sessionId ?? null},
46
+ ${options.actionType},
47
+ ${options.entityType ?? null},
48
+ ${options.entityId ?? null},
49
+ ${beforeJson !== null ? sql `${beforeJson}::jsonb` : sql `NULL`},
50
+ ${afterJson !== null ? sql `${afterJson}::jsonb` : sql `NULL`},
51
+ ${metadataJson !== null ? sql `${metadataJson}::jsonb` : sql `NULL`}
52
+ )
53
+ RETURNING id::text
54
+ `);
55
+ return result[0].id;
56
+ },
57
+ };
58
+ }
59
+ function extractUserId(auth) {
60
+ if (auth !== null && auth !== undefined && typeof auth === 'object' && 'userId' in auth) {
61
+ const val = auth.userId;
62
+ return typeof val === 'string' ? val : null;
63
+ }
64
+ return null;
65
+ }
66
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/audit/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { AuditConfig, AuditEmitOptions, Audit } from './types.js';
2
+ export { createAudit } from './emit.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { createAudit } from './emit.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { createAudit } from './index.js';
2
+ export declare const audit: {
3
+ create: typeof createAudit;
4
+ };
5
+ //# sourceMappingURL=namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/audit/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,eAAO,MAAM,KAAK;;CAEjB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { createAudit } from './index.js';
2
+ export const audit = {
3
+ create: createAudit,
4
+ };
5
+ //# sourceMappingURL=namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/audit/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,WAAW;CACpB,CAAA"}
@@ -0,0 +1,17 @@
1
+ export interface AuditConfig {
2
+ readonly database: string;
3
+ readonly table?: string;
4
+ readonly sessionIdField?: string;
5
+ }
6
+ export interface AuditEmitOptions {
7
+ readonly actionType: string;
8
+ readonly entityType?: string;
9
+ readonly entityId?: string;
10
+ readonly before?: unknown;
11
+ readonly after?: unknown;
12
+ readonly metadata?: Record<string, unknown>;
13
+ }
14
+ export interface Audit {
15
+ emit(options: AuditEmitOptions): Promise<string>;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/audit/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/audit/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { AuthStrategy, AuthRequest } from './types.js';
2
+ export interface AuthEnricher<TAuth> {
3
+ readonly name: string;
4
+ enrich(auth: TAuth): Promise<TAuth>;
5
+ }
6
+ export interface TenantResolver<TAuth> {
7
+ resolve(auth: TAuth): string;
8
+ }
9
+ export interface AuthChainConfig<TAuth> {
10
+ readonly strategies: readonly AuthStrategy<TAuth>[];
11
+ readonly enrichers?: readonly AuthEnricher<TAuth>[];
12
+ readonly tenantResolver?: TenantResolver<TAuth>;
13
+ }
14
+ export interface AuthChainResult<TAuth> {
15
+ readonly auth: TAuth | null;
16
+ readonly tenant: string | null;
17
+ }
18
+ export declare function runAuthChain<TAuth>(config: AuthChainConfig<TAuth>, request: AuthRequest, options: {
19
+ optional: boolean;
20
+ }): Promise<AuthChainResult<TAuth>>;
21
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/auth/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG3D,MAAM,WAAW,YAAY,CAAC,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,wBAAsB,YAAY,CAAC,KAAK,EACtC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAqCjC"}
@@ -0,0 +1,45 @@
1
+ import { UnauthorizedError } from '../errors/index.js';
2
+ export async function runAuthChain(config, request, options) {
3
+ let extracted = null;
4
+ let matchedStrategy = null;
5
+ for (const strategy of config.strategies) {
6
+ extracted = await strategy.extract(request);
7
+ if (extracted !== null) {
8
+ matchedStrategy = strategy;
9
+ break;
10
+ }
11
+ }
12
+ if (extracted === null) {
13
+ if (options.optional)
14
+ return { auth: null, tenant: null };
15
+ throw new UnauthorizedError();
16
+ }
17
+ let auth;
18
+ try {
19
+ auth = await matchedStrategy.verify(extracted);
20
+ }
21
+ catch (error) {
22
+ if (error instanceof UnauthorizedError)
23
+ throw error;
24
+ throw new UnauthorizedError('Authentication failed', {
25
+ strategy: matchedStrategy.name,
26
+ cause: error instanceof Error ? error.message : String(error),
27
+ });
28
+ }
29
+ if (config.enrichers) {
30
+ for (const enricher of config.enrichers) {
31
+ auth = await enricher.enrich(auth);
32
+ }
33
+ }
34
+ const tenant = config.tenantResolver ? config.tenantResolver.resolve(auth) : extractTenant(auth);
35
+ return { auth, tenant };
36
+ }
37
+ function extractTenant(auth) {
38
+ if (auth !== null && typeof auth === 'object' && 'tenantId' in auth) {
39
+ const tenantId = auth.tenantId;
40
+ if (typeof tenantId === 'string')
41
+ return tenantId;
42
+ }
43
+ return null;
44
+ }
45
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/auth/chain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAsBtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA8B,EAC9B,OAAoB,EACpB,OAA8B;IAE9B,IAAI,SAAS,GAAiB,IAAI,CAAA;IAClC,IAAI,eAAe,GAA+B,IAAI,CAAA;IAEtD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACzC,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,eAAe,GAAG,QAAQ,CAAA;YAC1B,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACzD,MAAM,IAAI,iBAAiB,EAAE,CAAA;IAC/B,CAAC;IAED,IAAI,IAAW,CAAA;IACf,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,eAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB;YAAE,MAAM,KAAK,CAAA;QACnD,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,EAAE;YACnD,QAAQ,EAAE,eAAgB,CAAC,IAAI;YAC/B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAEhG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAI,IAA8B,CAAC,QAAQ,CAAA;QACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAA;IACnD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface CookieConfig {
2
+ readonly name?: string;
3
+ readonly secure?: 'auto' | boolean;
4
+ readonly sameSite?: 'strict' | 'lax' | 'none';
5
+ readonly path?: string;
6
+ }
7
+ export interface ResolvedCookieConfig {
8
+ readonly name: string;
9
+ readonly secure: boolean;
10
+ readonly sameSite: string;
11
+ readonly path: string;
12
+ readonly httpOnly: true;
13
+ }
14
+ export declare function resolveCookieConfig(cookie: CookieConfig, env: string): ResolvedCookieConfig;
15
+ export declare function buildSetCookieHeader(resolved: ResolvedCookieConfig, value: string, maxAge: number): string;
16
+ export declare function buildClearCookieHeader(resolved: ResolvedCookieConfig): string;
17
+ export declare function parseCookieHeader(header: string | undefined, name: string): string | undefined;
18
+ //# sourceMappingURL=cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/auth/cookie.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;CACxB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAY3F;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU1G;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAU7E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY9F"}
@@ -0,0 +1,55 @@
1
+ export function resolveCookieConfig(cookie, env) {
2
+ const secure = cookie.secure === 'auto' || cookie.secure === undefined
3
+ ? env === 'production'
4
+ : cookie.secure;
5
+ return {
6
+ name: cookie.name ?? '__pipework_refresh',
7
+ secure,
8
+ sameSite: cookie.sameSite ?? 'strict',
9
+ path: cookie.path ?? '/',
10
+ httpOnly: true,
11
+ };
12
+ }
13
+ export function buildSetCookieHeader(resolved, value, maxAge) {
14
+ const parts = [
15
+ `${resolved.name}=${encodeURIComponent(value)}`,
16
+ `HttpOnly`,
17
+ `Path=${resolved.path}`,
18
+ `Max-Age=${maxAge}`,
19
+ `SameSite=${capitalize(resolved.sameSite)}`,
20
+ ];
21
+ if (resolved.secure)
22
+ parts.push('Secure');
23
+ return parts.join('; ');
24
+ }
25
+ export function buildClearCookieHeader(resolved) {
26
+ const parts = [
27
+ `${resolved.name}=`,
28
+ `HttpOnly`,
29
+ `Path=${resolved.path}`,
30
+ `Max-Age=0`,
31
+ `SameSite=${capitalize(resolved.sameSite)}`,
32
+ ];
33
+ if (resolved.secure)
34
+ parts.push('Secure');
35
+ return parts.join('; ');
36
+ }
37
+ export function parseCookieHeader(header, name) {
38
+ if (header === undefined)
39
+ return undefined;
40
+ for (const pair of header.split(';')) {
41
+ const trimmed = pair.trim();
42
+ const eqIdx = trimmed.indexOf('=');
43
+ if (eqIdx === -1)
44
+ continue;
45
+ const key = trimmed.slice(0, eqIdx).trim();
46
+ if (key === name) {
47
+ return decodeURIComponent(trimmed.slice(eqIdx + 1).trim());
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ function capitalize(s) {
53
+ return s.charAt(0).toUpperCase() + s.slice(1);
54
+ }
55
+ //# sourceMappingURL=cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../src/auth/cookie.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,mBAAmB,CAAC,MAAoB,EAAE,GAAW;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QACpE,CAAC,CAAC,GAAG,KAAK,YAAY;QACtB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAEjB,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,oBAAoB;QACzC,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ;QACrC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG;QACxB,QAAQ,EAAE,IAAI;KACf,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA8B,EAAE,KAAa,EAAE,MAAc;IAChG,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,CAAC,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC/C,UAAU;QACV,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACvB,WAAW,MAAM,EAAE;QACnB,YAAY,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;KAC5C,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA8B;IACnE,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,CAAC,IAAI,GAAG;QACnB,UAAU;QACV,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACvB,WAAW;QACX,YAAY,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;KAC5C,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA0B,EAAE,IAAY;IACxE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAQ;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type { AuthStrategy, AuthRequest, BaseAuth } from './types.js';
2
+ export { runAuthChain } from './chain.js';
3
+ export type { AuthEnricher, TenantResolver, AuthChainConfig, AuthChainResult } from './chain.js';
4
+ export { createSessions } from './sessions.js';
5
+ export type { Sessions, SessionConfig, TokenPair, TokenPayload, HttpTokenResult, HttpRequest, HttpResponse } from './sessions.js';
6
+ export type { CookieConfig, ResolvedCookieConfig } from './cookie.js';
7
+ export { resolveCookieConfig, buildSetCookieHeader, buildClearCookieHeader, parseCookieHeader } from './cookie.js';
8
+ export { createMultiOrgSessions } from './multi-org.js';
9
+ export type { MultiOrgConfig, MultiOrgSessions, ResolveLoginResult, AuthenticatedResult, OrgSelectResult, OrgMembership, OrgInfo, OrgMembershipDetail } from './multi-org.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjI,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { runAuthChain } from './chain.js';
2
+ export { createSessions } from './sessions.js';
3
+ export { resolveCookieConfig, buildSetCookieHeader, buildClearCookieHeader, parseCookieHeader } from './cookie.js';
4
+ export { createMultiOrgSessions } from './multi-org.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,68 @@
1
+ import type { DB } from '../db/index.js';
2
+ import type { Sessions, HttpResponse, HttpRequest, HttpTokenResult } from './sessions.js';
3
+ export interface MultiOrgConfig {
4
+ readonly sessions: Sessions;
5
+ readonly signing: {
6
+ algorithm: 'ES256';
7
+ privateKey: string;
8
+ publicKey: string;
9
+ };
10
+ readonly issuer: string;
11
+ readonly audience: string;
12
+ readonly orgSelectToken?: {
13
+ readonly expiresIn?: string;
14
+ };
15
+ readonly table?: string;
16
+ readonly resolveOrgNames?: (db: DB, orgIds: string[]) => Promise<Map<string, string>>;
17
+ }
18
+ export interface OrgMembership {
19
+ readonly id: string;
20
+ readonly orgId: string;
21
+ readonly role: string | null;
22
+ readonly joinedAt: Date;
23
+ }
24
+ export interface OrgInfo {
25
+ readonly id: string;
26
+ readonly name: string;
27
+ }
28
+ export interface OrgMembershipDetail {
29
+ readonly id: string;
30
+ readonly name: string;
31
+ readonly role: string | null;
32
+ }
33
+ export interface AuthenticatedResult {
34
+ readonly type: 'authenticated';
35
+ readonly accessToken: string;
36
+ readonly expiresIn: number;
37
+ }
38
+ export interface OrgSelectResult {
39
+ readonly type: 'org_select';
40
+ readonly sessionToken: string;
41
+ readonly orgs: readonly OrgInfo[];
42
+ }
43
+ export type ResolveLoginResult = AuthenticatedResult | OrgSelectResult;
44
+ export interface MultiOrgSessions {
45
+ resolveLogin(response: HttpResponse, db: DB, user: {
46
+ id: string;
47
+ }): Promise<ResolveLoginResult>;
48
+ selectOrg(response: HttpResponse, db: DB, sessionToken: string, orgId: string): Promise<HttpTokenResult>;
49
+ switchOrg(response: HttpResponse, db: DB, request: HttpRequest, orgId: string, userId: string): Promise<HttpTokenResult>;
50
+ listOrgs(db: DB, userId: string): Promise<{
51
+ orgs: readonly OrgMembershipDetail[];
52
+ }>;
53
+ addMember(db: DB, params: {
54
+ userId: string;
55
+ orgId: string;
56
+ role?: string;
57
+ addedBy?: string;
58
+ }): Promise<{
59
+ id: string;
60
+ }>;
61
+ removeMember(db: DB, params: {
62
+ userId: string;
63
+ orgId: string;
64
+ }): Promise<void>;
65
+ checkMembership(db: DB, userId: string, orgId: string): Promise<OrgMembership | null>;
66
+ }
67
+ export declare function createMultiOrgSessions(config: MultiOrgConfig): MultiOrgSessions;
68
+ //# sourceMappingURL=multi-org.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-org.d.ts","sourceRoot":"","sources":["../../src/auth/multi-org.ts"],"names":[],"mappings":"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"}