pipework 0.252.0 → 0.253.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/infra/support/handle.d.ts +8 -1
  3. package/dist/infra/support/handle.d.ts.map +1 -1
  4. package/dist/infra/support/handle.js +9 -2
  5. package/dist/infra/support/handle.js.map +1 -1
  6. package/dist/infra/support/namespace.d.ts.map +1 -1
  7. package/package.json +4 -3
  8. package/src/async/jobs/abortable-delay.ts +18 -0
  9. package/src/async/jobs/claims.ts +52 -0
  10. package/src/async/jobs/cron.ts +179 -0
  11. package/src/async/jobs/errors.ts +56 -0
  12. package/src/async/jobs/exclusion.ts +117 -0
  13. package/src/async/jobs/execute.ts +219 -0
  14. package/src/async/jobs/index.ts +10 -0
  15. package/src/async/jobs/listener.ts +135 -0
  16. package/src/async/jobs/namespace.ts +20 -0
  17. package/src/async/jobs/queue-door.ts +44 -0
  18. package/src/async/jobs/queue.ts +1012 -0
  19. package/src/async/jobs/run-script.ts +67 -0
  20. package/src/async/jobs/scheduler.ts +218 -0
  21. package/src/async/jobs/schedules-table.ts +37 -0
  22. package/src/async/jobs/serialize-error.ts +48 -0
  23. package/src/async/jobs/table.ts +191 -0
  24. package/src/async/pipeline/define.ts +53 -0
  25. package/src/async/pipeline/errors.ts +35 -0
  26. package/src/async/pipeline/execute.ts +53 -0
  27. package/src/async/pipeline/index.ts +13 -0
  28. package/src/async/pipeline/namespace.ts +12 -0
  29. package/src/async/pipeline/resume.ts +67 -0
  30. package/src/async/pipeline/run-steps.ts +98 -0
  31. package/src/async/pipeline/types.ts +57 -0
  32. package/src/async/state-machine/define.ts +64 -0
  33. package/src/async/state-machine/errors.ts +29 -0
  34. package/src/async/state-machine/index.ts +3 -0
  35. package/src/async/state-machine/namespace.ts +12 -0
  36. package/src/async/state-machine/transition.ts +90 -0
  37. package/src/async/state-machine/types.ts +37 -0
  38. package/src/async/steps/errors.ts +31 -0
  39. package/src/async/steps/graph.ts +1214 -0
  40. package/src/async/steps/hash.ts +40 -0
  41. package/src/async/steps/index.ts +7 -0
  42. package/src/async/steps/namespace.ts +7 -0
  43. package/src/async/steps/table.ts +97 -0
  44. package/src/async/steps/types.ts +318 -0
  45. package/src/audit/chain/index.ts +9 -0
  46. package/src/audit/chain/install.ts +113 -0
  47. package/src/audit/chain/retire.ts +52 -0
  48. package/src/audit/chain/verify.ts +257 -0
  49. package/src/audit/query/cursor.ts +37 -0
  50. package/src/audit/query/index.ts +9 -0
  51. package/src/audit/query/query.ts +223 -0
  52. package/src/audit/schema/audit-record-fields.ts +68 -0
  53. package/src/audit/schema/audit-record.ts +23 -0
  54. package/src/auth/auth/audit.ts +31 -0
  55. package/src/auth/auth/chain.ts +84 -0
  56. package/src/auth/auth/cookie.ts +136 -0
  57. package/src/auth/auth/email-links.ts +311 -0
  58. package/src/auth/auth/guard.ts +128 -0
  59. package/src/auth/auth/index.ts +18 -0
  60. package/src/auth/auth/multi-org.ts +337 -0
  61. package/src/auth/auth/namespace.ts +34 -0
  62. package/src/auth/auth/parse-expiry.ts +13 -0
  63. package/src/auth/auth/passwords.ts +110 -0
  64. package/src/auth/auth/schema.ts +110 -0
  65. package/src/auth/auth/sessions.ts +565 -0
  66. package/src/auth/auth/sign-in.ts +156 -0
  67. package/src/auth/auth/signing-keys.ts +69 -0
  68. package/src/auth/auth/types.ts +26 -0
  69. package/src/auth/auth/uuid.ts +10 -0
  70. package/src/auth/rbac/cache.ts +55 -0
  71. package/src/auth/rbac/check.ts +30 -0
  72. package/src/auth/rbac/create.ts +35 -0
  73. package/src/auth/rbac/index.ts +5 -0
  74. package/src/auth/rbac/middleware.ts +20 -0
  75. package/src/auth/rbac/namespace.ts +15 -0
  76. package/src/auth/rbac/resolve.ts +31 -0
  77. package/src/auth/rbac/schema.sql +31 -0
  78. package/src/auth/rbac/seed.ts +67 -0
  79. package/src/auth/rbac/tables.ts +32 -0
  80. package/src/auth/rbac/types.ts +65 -0
  81. package/src/auth/tenant/extract.ts +33 -0
  82. package/src/auth/tenant/in-tenant.ts +49 -0
  83. package/src/auth/tenant/index.ts +7 -0
  84. package/src/auth/tenant/namespace.ts +23 -0
  85. package/src/auth/tenant/propagate.ts +20 -0
  86. package/src/auth/tenant/rls.ts +120 -0
  87. package/src/auth/tenant/scope.ts +33 -0
  88. package/src/auth/tenant/scoped-db.ts +581 -0
  89. package/src/auth/tenant/types.ts +14 -0
  90. package/src/auth/tenant/validate.ts +27 -0
  91. package/src/cli/commands/add.ts +158 -0
  92. package/src/cli/commands/alerts.ts +98 -0
  93. package/src/cli/commands/check.ts +1418 -0
  94. package/src/cli/commands/codemod.ts +78 -0
  95. package/src/cli/commands/db.ts +356 -0
  96. package/src/cli/commands/dev.ts +101 -0
  97. package/src/cli/commands/generate.ts +75 -0
  98. package/src/cli/commands/init.ts +36 -0
  99. package/src/cli/commands/install.ts +28 -0
  100. package/src/cli/commands/lint.ts +62 -0
  101. package/src/cli/commands/migrate.ts +132 -0
  102. package/src/cli/commands/openapi.ts +63 -0
  103. package/src/cli/commands/remove.ts +72 -0
  104. package/src/cli/commands/run.ts +50 -0
  105. package/src/cli/commands/scope.ts +54 -0
  106. package/src/cli/commands/serve.ts +68 -0
  107. package/src/cli/commands/shard.ts +31 -0
  108. package/src/cli/commands/shared/config-pipework-version.ts +28 -0
  109. package/src/cli/commands/shared/find-config.ts +22 -0
  110. package/src/cli/commands/shared/load-config.ts +35 -0
  111. package/src/cli/commands/shared/pnpm-install.ts +95 -0
  112. package/src/cli/commands/shared/report-removed.ts +8 -0
  113. package/src/cli/commands/sync.ts +32 -0
  114. package/src/cli/commands/test.ts +307 -0
  115. package/src/cli/commands/upgrade.ts +48 -0
  116. package/src/cli/dev-bootstrap.ts +24 -0
  117. package/src/cli/errors.ts +10 -0
  118. package/src/cli/index.ts +303 -0
  119. package/src/cli/output.ts +17 -0
  120. package/src/cli/port.ts +15 -0
  121. package/src/cli/surface-kinds.ts +20 -0
  122. package/src/client/index.ts +4 -0
  123. package/src/client/poll.ts +130 -0
  124. package/src/client/report-fault.ts +119 -0
  125. package/src/core/config/app-pool.ts +19 -0
  126. package/src/core/config/aws-env.ts +29 -0
  127. package/src/core/config/base-dir.ts +24 -0
  128. package/src/core/config/discover.ts +64 -0
  129. package/src/core/config/env-resolve.ts +87 -0
  130. package/src/core/config/env-types.ts +116 -0
  131. package/src/core/config/env.ts +55 -0
  132. package/src/core/config/errors.ts +9 -0
  133. package/src/core/config/import-config.ts +40 -0
  134. package/src/core/config/index.ts +8 -0
  135. package/src/core/config/load.ts +417 -0
  136. package/src/core/config/namespace.ts +14 -0
  137. package/src/core/config/resolve.ts +195 -0
  138. package/src/core/config/schema.ts +488 -0
  139. package/src/core/config/statement-observer.ts +48 -0
  140. package/src/core/config/ts-inline-hooks.ts +75 -0
  141. package/src/core/config/ts-register.ts +4 -0
  142. package/src/core/config/ts-resolve-hooks.ts +101 -0
  143. package/src/core/errors/base.ts +49 -0
  144. package/src/core/errors/http.ts +146 -0
  145. package/src/core/errors/index.ts +2 -0
  146. package/src/core/errors/namespace.ts +31 -0
  147. package/src/core/lifecycle/drain.ts +33 -0
  148. package/src/core/lifecycle/health.ts +72 -0
  149. package/src/core/lifecycle/index.ts +4 -0
  150. package/src/core/lifecycle/namespace.ts +7 -0
  151. package/src/core/lifecycle/startup.ts +102 -0
  152. package/src/core/lifecycle/types.ts +36 -0
  153. package/src/core/logging/context.ts +60 -0
  154. package/src/core/logging/error-chain.ts +68 -0
  155. package/src/core/logging/index.ts +5 -0
  156. package/src/core/logging/logger.ts +65 -0
  157. package/src/core/logging/namespace.ts +16 -0
  158. package/src/core/logging/proxy.ts +22 -0
  159. package/src/core/logging/redact-match.ts +24 -0
  160. package/src/core/logging/types.ts +47 -0
  161. package/src/core/pipework.ts +566 -0
  162. package/src/core/runtime/broker.ts +69 -0
  163. package/src/core/surface/http.ts +133 -0
  164. package/src/core/surface/index.ts +11 -0
  165. package/src/core/surface/job-timeout.ts +40 -0
  166. package/src/core/surface/namespace.ts +13 -0
  167. package/src/core/surface/script.ts +33 -0
  168. package/src/core/surface/start.ts +142 -0
  169. package/src/core/surface/types.ts +225 -0
  170. package/src/core/surface/validate.ts +88 -0
  171. package/src/core/surface/worker.ts +528 -0
  172. package/src/core/validation/connectivity.ts +49 -0
  173. package/src/core/validation/domain.ts +99 -0
  174. package/src/core/validation/index.ts +5 -0
  175. package/src/core/validation/queue-tables.ts +312 -0
  176. package/src/core/validation/rls-role.ts +138 -0
  177. package/src/core/validation/startup.ts +51 -0
  178. package/src/core/validation/surfaces.ts +65 -0
  179. package/src/core/validation/types.ts +25 -0
  180. package/src/data/db/advisory-lock.ts +55 -0
  181. package/src/data/db/aggregates.ts +172 -0
  182. package/src/data/db/array-elements.ts +111 -0
  183. package/src/data/db/bulk-set.ts +53 -0
  184. package/src/data/db/col/index.ts +14 -0
  185. package/src/data/db/composed.ts +53 -0
  186. package/src/data/db/db.ts +276 -0
  187. package/src/data/db/excluded.ts +16 -0
  188. package/src/data/db/expressions.ts +473 -0
  189. package/src/data/db/filter.ts +90 -0
  190. package/src/data/db/function-source.ts +114 -0
  191. package/src/data/db/identifiers.ts +16 -0
  192. package/src/data/db/idx/index.ts +9 -0
  193. package/src/data/db/in-list.ts +49 -0
  194. package/src/data/db/index.ts +9 -0
  195. package/src/data/db/insert-split.ts +137 -0
  196. package/src/data/db/instrumentation.ts +82 -0
  197. package/src/data/db/maintenance.ts +28 -0
  198. package/src/data/db/namespace.ts +107 -0
  199. package/src/data/db/owner-labels.ts +9 -0
  200. package/src/data/db/pool.ts +187 -0
  201. package/src/data/db/query-label.ts +13 -0
  202. package/src/data/db/query-watch.ts +116 -0
  203. package/src/data/db/raw-client-warning.ts +37 -0
  204. package/src/data/db/readonly.ts +23 -0
  205. package/src/data/db/reservation.ts +151 -0
  206. package/src/data/db/schema-features.ts +14 -0
  207. package/src/data/db/serializable.ts +83 -0
  208. package/src/data/db/sql.ts +1 -0
  209. package/src/data/db/timeouts.ts +76 -0
  210. package/src/data/db/types.ts +18 -0
  211. package/src/data/db/unbound.ts +33 -0
  212. package/src/data/db/values.ts +29 -0
  213. package/src/data/domain/brand.ts +15 -0
  214. package/src/data/domain/build-factory.ts +193 -0
  215. package/src/data/domain/build-schema.ts +161 -0
  216. package/src/data/domain/build-table.ts +355 -0
  217. package/src/data/domain/define.ts +239 -0
  218. package/src/data/domain/external-registry.ts +34 -0
  219. package/src/data/domain/external.ts +77 -0
  220. package/src/data/domain/field.ts +279 -0
  221. package/src/data/domain/index.ts +13 -0
  222. package/src/data/domain/naming.ts +6 -0
  223. package/src/data/domain/projections.ts +57 -0
  224. package/src/data/domain/trace-safe-projection.ts +31 -0
  225. package/src/data/domain/traits.ts +108 -0
  226. package/src/data/domain/types.ts +289 -0
  227. package/src/data/jsonb/composed.ts +18 -0
  228. package/src/data/jsonb/index.ts +1 -0
  229. package/src/data/jsonb/namespace.ts +30 -0
  230. package/src/data/jsonb/query.ts +86 -0
  231. package/src/data/migrate/append-only-generate.ts +47 -0
  232. package/src/data/migrate/applied.ts +47 -0
  233. package/src/data/migrate/apply.ts +309 -0
  234. package/src/data/migrate/check.ts +119 -0
  235. package/src/data/migrate/diff.ts +357 -0
  236. package/src/data/migrate/door-generate.ts +130 -0
  237. package/src/data/migrate/framework-rls.ts +58 -0
  238. package/src/data/migrate/generate.ts +201 -0
  239. package/src/data/migrate/history.ts +215 -0
  240. package/src/data/migrate/index.ts +9 -0
  241. package/src/data/migrate/internal-definitions.ts +175 -0
  242. package/src/data/migrate/post-process.ts +73 -0
  243. package/src/data/migrate/pragma.ts +73 -0
  244. package/src/data/migrate/provision-framework.ts +147 -0
  245. package/src/data/migrate/rls-generate.ts +61 -0
  246. package/src/data/migrate/run.ts +124 -0
  247. package/src/data/migrate/safety.ts +167 -0
  248. package/src/data/migrate/snapshot.ts +368 -0
  249. package/src/data/migrate/sql-emit.ts +392 -0
  250. package/src/data/migrate/statements.ts +312 -0
  251. package/src/data/query/alias.ts +126 -0
  252. package/src/data/query/batch.ts +8 -0
  253. package/src/data/query/cache/core/cache.ts +78 -0
  254. package/src/data/query/cache/core/index.ts +1 -0
  255. package/src/data/query/cache/core/types.ts +29 -0
  256. package/src/data/query/cache/readme.md +230 -0
  257. package/src/data/query/casing.ts +76 -0
  258. package/src/data/query/collation.ts +11 -0
  259. package/src/data/query/column-builder.ts +370 -0
  260. package/src/data/query/column.ts +150 -0
  261. package/src/data/query/entity.ts +42 -0
  262. package/src/data/query/errors.ts +33 -0
  263. package/src/data/query/index.ts +14 -0
  264. package/src/data/query/logger.ts +47 -0
  265. package/src/data/query/operations.ts +45 -0
  266. package/src/data/query/pg-core/alias.ts +12 -0
  267. package/src/data/query/pg-core/checks.ts +32 -0
  268. package/src/data/query/pg-core/columns/all.ts +71 -0
  269. package/src/data/query/pg-core/columns/bigint.ts +110 -0
  270. package/src/data/query/pg-core/columns/bigserial.ts +128 -0
  271. package/src/data/query/pg-core/columns/boolean.ts +43 -0
  272. package/src/data/query/pg-core/columns/char.ts +85 -0
  273. package/src/data/query/pg-core/columns/cidr.ts +43 -0
  274. package/src/data/query/pg-core/columns/common.ts +366 -0
  275. package/src/data/query/pg-core/columns/custom.ts +232 -0
  276. package/src/data/query/pg-core/columns/date.common.ts +15 -0
  277. package/src/data/query/pg-core/columns/date.ts +112 -0
  278. package/src/data/query/pg-core/columns/double-precision.ts +55 -0
  279. package/src/data/query/pg-core/columns/enum.ts +201 -0
  280. package/src/data/query/pg-core/columns/index.ts +35 -0
  281. package/src/data/query/pg-core/columns/inet.ts +43 -0
  282. package/src/data/query/pg-core/columns/int.common.ts +57 -0
  283. package/src/data/query/pg-core/columns/integer.ts +53 -0
  284. package/src/data/query/pg-core/columns/interval.ts +83 -0
  285. package/src/data/query/pg-core/columns/json.ts +58 -0
  286. package/src/data/query/pg-core/columns/jsonb.ts +56 -0
  287. package/src/data/query/pg-core/columns/line.ts +117 -0
  288. package/src/data/query/pg-core/columns/macaddr.ts +43 -0
  289. package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
  290. package/src/data/query/pg-core/columns/numeric.ts +227 -0
  291. package/src/data/query/pg-core/columns/point.ts +127 -0
  292. package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
  293. package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
  294. package/src/data/query/pg-core/columns/real.ts +58 -0
  295. package/src/data/query/pg-core/columns/serial.ts +55 -0
  296. package/src/data/query/pg-core/columns/smallint.ts +53 -0
  297. package/src/data/query/pg-core/columns/smallserial.ts +60 -0
  298. package/src/data/query/pg-core/columns/text.ts +67 -0
  299. package/src/data/query/pg-core/columns/time.ts +72 -0
  300. package/src/data/query/pg-core/columns/timestamp.ts +163 -0
  301. package/src/data/query/pg-core/columns/uuid.ts +51 -0
  302. package/src/data/query/pg-core/columns/varchar.ts +89 -0
  303. package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
  304. package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
  305. package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
  306. package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
  307. package/src/data/query/pg-core/db.ts +674 -0
  308. package/src/data/query/pg-core/dialect.ts +1404 -0
  309. package/src/data/query/pg-core/expressions.ts +25 -0
  310. package/src/data/query/pg-core/foreign-keys.ts +130 -0
  311. package/src/data/query/pg-core/index.ts +21 -0
  312. package/src/data/query/pg-core/indexes.ts +276 -0
  313. package/src/data/query/pg-core/policies.ts +56 -0
  314. package/src/data/query/pg-core/primary-keys.ts +62 -0
  315. package/src/data/query/pg-core/query-builders/count.ts +86 -0
  316. package/src/data/query/pg-core/query-builders/delete.ts +293 -0
  317. package/src/data/query/pg-core/query-builders/index.ts +7 -0
  318. package/src/data/query/pg-core/query-builders/insert.ts +452 -0
  319. package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
  320. package/src/data/query/pg-core/query-builders/query.ts +157 -0
  321. package/src/data/query/pg-core/query-builders/raw.ts +49 -0
  322. package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
  323. package/src/data/query/pg-core/query-builders/select.ts +1346 -0
  324. package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
  325. package/src/data/query/pg-core/query-builders/update.ts +626 -0
  326. package/src/data/query/pg-core/roles.ts +41 -0
  327. package/src/data/query/pg-core/schema.ts +72 -0
  328. package/src/data/query/pg-core/sequence.ts +41 -0
  329. package/src/data/query/pg-core/session.ts +292 -0
  330. package/src/data/query/pg-core/subquery.ts +46 -0
  331. package/src/data/query/pg-core/table.ts +252 -0
  332. package/src/data/query/pg-core/unique-constraint.ts +73 -0
  333. package/src/data/query/pg-core/utils/array.ts +95 -0
  334. package/src/data/query/pg-core/utils/index.ts +1 -0
  335. package/src/data/query/pg-core/utils.ts +104 -0
  336. package/src/data/query/pg-core/view-base.ts +14 -0
  337. package/src/data/query/pg-core/view-common.ts +1 -0
  338. package/src/data/query/pg-core/view.ts +435 -0
  339. package/src/data/query/pg-core/with-builder.ts +41 -0
  340. package/src/data/query/postgres-js/README.md +46 -0
  341. package/src/data/query/postgres-js/array-parser.ts +45 -0
  342. package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
  343. package/src/data/query/postgres-js/driver.ts +163 -0
  344. package/src/data/query/postgres-js/index.ts +2 -0
  345. package/src/data/query/postgres-js/session.ts +234 -0
  346. package/src/data/query/primary-key.ts +11 -0
  347. package/src/data/query/query-builders/query-builder.ts +19 -0
  348. package/src/data/query/query-builders/select.types.ts +175 -0
  349. package/src/data/query/query-promise.ts +35 -0
  350. package/src/data/query/relations.ts +725 -0
  351. package/src/data/query/runnable-query.ts +12 -0
  352. package/src/data/query/selection-proxy.ts +121 -0
  353. package/src/data/query/session.ts +8 -0
  354. package/src/data/query/sql/expressions/conditions.ts +741 -0
  355. package/src/data/query/sql/expressions/index.ts +2 -0
  356. package/src/data/query/sql/expressions/select.ts +45 -0
  357. package/src/data/query/sql/functions/aggregate.ts +129 -0
  358. package/src/data/query/sql/functions/index.ts +2 -0
  359. package/src/data/query/sql/functions/vector.ts +178 -0
  360. package/src/data/query/sql/index.ts +3 -0
  361. package/src/data/query/sql/sql.ts +794 -0
  362. package/src/data/query/subquery.ts +53 -0
  363. package/src/data/query/table.ts +208 -0
  364. package/src/data/query/table.utils.ts +2 -0
  365. package/src/data/query/tracing-utils.ts +3 -0
  366. package/src/data/query/tracing.ts +11 -0
  367. package/src/data/query/utils.ts +357 -0
  368. package/src/data/query/version.ts +4 -0
  369. package/src/data/query/view-common.ts +1 -0
  370. package/src/data/schema/branded.ts +13 -0
  371. package/src/data/schema/generated/coerce.ts +5 -0
  372. package/src/data/schema/generated/combinator.ts +6 -0
  373. package/src/data/schema/generated/encoding.ts +5 -0
  374. package/src/data/schema/generated/error.ts +6 -0
  375. package/src/data/schema/generated/format.ts +5 -0
  376. package/src/data/schema/generated/type-constructor.ts +10 -0
  377. package/src/data/schema/generated/type.ts +6 -0
  378. package/src/data/schema/index.ts +6 -0
  379. package/src/data/schema/json-schema.ts +33 -0
  380. package/src/data/schema/namespace.ts +55 -0
  381. package/src/data/schema/parse.ts +39 -0
  382. package/src/data/schema/types.ts +39 -0
  383. package/src/data/temporal/append-only.ts +134 -0
  384. package/src/data/temporal/close.ts +27 -0
  385. package/src/data/temporal/columns.ts +10 -0
  386. package/src/data/temporal/definition-queries.ts +70 -0
  387. package/src/data/temporal/errors.ts +10 -0
  388. package/src/data/temporal/get-current.ts +22 -0
  389. package/src/data/temporal/index.ts +9 -0
  390. package/src/data/temporal/namespace.ts +36 -0
  391. package/src/data/temporal/query.ts +25 -0
  392. package/src/data/temporal/resolve.ts +17 -0
  393. package/src/data/temporal/revise.ts +67 -0
  394. package/src/data/temporal/types.ts +22 -0
  395. package/src/data/valve/artifact.ts +33 -0
  396. package/src/data/valve/contract-diff.ts +21 -0
  397. package/src/data/valve/cross.ts +57 -0
  398. package/src/data/valve/crossing-ledger.ts +50 -0
  399. package/src/data/valve/decision.ts +44 -0
  400. package/src/data/valve/durable-crossing.ts +52 -0
  401. package/src/data/valve/execute-crossing.ts +77 -0
  402. package/src/data/valve/faucet.ts +56 -0
  403. package/src/data/valve/gate.ts +114 -0
  404. package/src/data/valve/graph.ts +77 -0
  405. package/src/data/valve/index.ts +53 -0
  406. package/src/data/valve/namespace.ts +57 -0
  407. package/src/data/valve/registry.ts +50 -0
  408. package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
  409. package/src/data/valve/schema/valve-crossing.ts +9 -0
  410. package/src/data/valve/supply.ts +154 -0
  411. package/src/data/valve/types.ts +143 -0
  412. package/src/data/vector/columns.ts +27 -0
  413. package/src/data/vector/index.ts +4 -0
  414. package/src/data/vector/namespace.ts +33 -0
  415. package/src/data/vector/query.ts +85 -0
  416. package/src/data/vector/validate.ts +16 -0
  417. package/src/data/write/audit/actor.ts +15 -0
  418. package/src/data/write/audit/audit-columns.ts +18 -0
  419. package/src/data/write/audit/audit-select.ts +111 -0
  420. package/src/data/write/audit/bound-transaction.ts +14 -0
  421. package/src/data/write/audit/cte-compile.ts +32 -0
  422. package/src/data/write/audit/decode-returning.ts +47 -0
  423. package/src/data/write/audit/final-select.ts +43 -0
  424. package/src/data/write/audit/infra-audit.ts +36 -0
  425. package/src/data/write/audit/primary-key.ts +65 -0
  426. package/src/data/write/audit/projection.ts +41 -0
  427. package/src/data/write/audit/read-touches.ts +86 -0
  428. package/src/data/write/audit/touch-match.ts +78 -0
  429. package/src/data/write/audit/verb-delete.ts +62 -0
  430. package/src/data/write/audit/verb-insert.ts +36 -0
  431. package/src/data/write/audit/verb-select.ts +47 -0
  432. package/src/data/write/audit/verb-update.ts +60 -0
  433. package/src/data/write/audit/verb-upsert.ts +104 -0
  434. package/src/data/write/conflict.ts +43 -0
  435. package/src/data/write/delete.ts +38 -0
  436. package/src/data/write/execute.ts +243 -0
  437. package/src/data/write/index.ts +11 -0
  438. package/src/data/write/insert.ts +63 -0
  439. package/src/data/write/state.ts +43 -0
  440. package/src/data/write/update.ts +54 -0
  441. package/src/data/write/upsert.ts +58 -0
  442. package/src/data/write/values.ts +19 -0
  443. package/src/index.ts +230 -0
  444. package/src/infra/access-links/code.ts +70 -0
  445. package/src/infra/access-links/handle.ts +892 -0
  446. package/src/infra/access-links/index.ts +9 -0
  447. package/src/infra/access-links/namespace.ts +30 -0
  448. package/src/infra/access-links/person-check.ts +177 -0
  449. package/src/infra/access-links/schema.ts +71 -0
  450. package/src/infra/alerts/async-sources.ts +231 -0
  451. package/src/infra/alerts/audit.ts +36 -0
  452. package/src/infra/alerts/beat.ts +123 -0
  453. package/src/infra/alerts/client-faults.ts +111 -0
  454. package/src/infra/alerts/faults.ts +156 -0
  455. package/src/infra/alerts/handle.ts +778 -0
  456. package/src/infra/alerts/http.ts +192 -0
  457. package/src/infra/alerts/index.ts +12 -0
  458. package/src/infra/alerts/infra-sources.ts +180 -0
  459. package/src/infra/alerts/namespace.ts +81 -0
  460. package/src/infra/alerts/redact.ts +21 -0
  461. package/src/infra/alerts/request-faults.ts +41 -0
  462. package/src/infra/alerts/schema.ts +124 -0
  463. package/src/infra/alerts/sinks.ts +125 -0
  464. package/src/infra/alerts/source-options.ts +26 -0
  465. package/src/infra/alerts/sources.ts +503 -0
  466. package/src/infra/alerts/subsystem-sources.ts +137 -0
  467. package/src/infra/audit/emit.ts +87 -0
  468. package/src/infra/audit/index.ts +2 -0
  469. package/src/infra/audit/namespace.ts +22 -0
  470. package/src/infra/audit/schema.sql +35 -0
  471. package/src/infra/audit/types.ts +18 -0
  472. package/src/infra/aws/credentials.ts +147 -0
  473. package/src/infra/aws/sigv4.ts +140 -0
  474. package/src/infra/cache/create.ts +58 -0
  475. package/src/infra/cache/entry.ts +81 -0
  476. package/src/infra/cache/index.ts +4 -0
  477. package/src/infra/cache/namespace.ts +10 -0
  478. package/src/infra/cache/tenant.ts +93 -0
  479. package/src/infra/cache/types.ts +24 -0
  480. package/src/infra/crawl/audit.ts +35 -0
  481. package/src/infra/crawl/errors.ts +25 -0
  482. package/src/infra/crawl/handle.ts +693 -0
  483. package/src/infra/crawl/index.ts +9 -0
  484. package/src/infra/crawl/links.ts +160 -0
  485. package/src/infra/crawl/namespace.ts +36 -0
  486. package/src/infra/crawl/robots.ts +100 -0
  487. package/src/infra/crawl/schema.ts +89 -0
  488. package/src/infra/credit-line/handle.ts +883 -0
  489. package/src/infra/credit-line/index.ts +6 -0
  490. package/src/infra/credit-line/namespace.ts +7 -0
  491. package/src/infra/credit-line/schema.ts +96 -0
  492. package/src/infra/credits/handle.ts +706 -0
  493. package/src/infra/credits/index.ts +5 -0
  494. package/src/infra/credits/namespace.ts +7 -0
  495. package/src/infra/credits/schema.ts +83 -0
  496. package/src/infra/email/audit.ts +36 -0
  497. package/src/infra/email/inbound.ts +622 -0
  498. package/src/infra/email/index.ts +11 -0
  499. package/src/infra/email/mail.ts +517 -0
  500. package/src/infra/email/mime.ts +447 -0
  501. package/src/infra/email/namespace.ts +22 -0
  502. package/src/infra/email/providers.ts +111 -0
  503. package/src/infra/email/schema.ts +96 -0
  504. package/src/infra/email/sns.ts +200 -0
  505. package/src/infra/email/unsubscribe.ts +44 -0
  506. package/src/infra/fetch/address.ts +88 -0
  507. package/src/infra/fetch/connect-retry.ts +87 -0
  508. package/src/infra/fetch/handle.ts +329 -0
  509. package/src/infra/fetch/index.ts +7 -0
  510. package/src/infra/fetch/namespace.ts +70 -0
  511. package/src/infra/idempotency/index.ts +3 -0
  512. package/src/infra/idempotency/middleware.ts +87 -0
  513. package/src/infra/idempotency/store.ts +92 -0
  514. package/src/infra/idempotency/types.ts +30 -0
  515. package/src/infra/join-requests/handle.ts +312 -0
  516. package/src/infra/join-requests/index.ts +2 -0
  517. package/src/infra/join-requests/namespace.ts +7 -0
  518. package/src/infra/join-requests/schema.ts +33 -0
  519. package/src/infra/outbox/core.ts +165 -0
  520. package/src/infra/quota/errors.ts +32 -0
  521. package/src/infra/quota/handle.ts +215 -0
  522. package/src/infra/quota/index.ts +5 -0
  523. package/src/infra/quota/namespace.ts +7 -0
  524. package/src/infra/quota/schema.ts +15 -0
  525. package/src/infra/storage/backend.ts +34 -0
  526. package/src/infra/storage/handle.ts +513 -0
  527. package/src/infra/storage/index.ts +9 -0
  528. package/src/infra/storage/local.ts +104 -0
  529. package/src/infra/storage/namespace.ts +13 -0
  530. package/src/infra/storage/s3.ts +257 -0
  531. package/src/infra/storage/schema.ts +24 -0
  532. package/src/infra/support/handle.ts +869 -0
  533. package/src/infra/support/http.ts +229 -0
  534. package/src/infra/support/index.ts +7 -0
  535. package/src/infra/support/namespace.ts +12 -0
  536. package/src/infra/support/schema.ts +96 -0
  537. package/src/infra/webhook/inbound.ts +45 -0
  538. package/src/infra/webhook/index.ts +5 -0
  539. package/src/infra/webhook/namespace.ts +24 -0
  540. package/src/infra/webhook/outbound.ts +315 -0
  541. package/src/infra/webhook/sign.ts +32 -0
  542. package/src/infra/webhook/verify.ts +82 -0
  543. package/src/invariants/assert.ts +26 -0
  544. package/src/invariants/index.ts +1 -0
  545. package/src/lint/config.ts +56 -0
  546. package/src/lint/doctrine.ts +163 -0
  547. package/src/lint/include.ts +97 -0
  548. package/src/lint/index.ts +3 -0
  549. package/src/lint/preset.ts +10 -0
  550. package/src/lint/resolver.ts +218 -0
  551. package/src/lint/rules/no-reexports.ts +46 -0
  552. package/src/request/behavior/audited.ts +85 -0
  553. package/src/request/behavior/cached.ts +62 -0
  554. package/src/request/behavior/compose.ts +28 -0
  555. package/src/request/behavior/index.ts +5 -0
  556. package/src/request/behavior/namespace.ts +16 -0
  557. package/src/request/behavior/types.ts +26 -0
  558. package/src/request/behavior/versioned.ts +54 -0
  559. package/src/request/context/create.ts +103 -0
  560. package/src/request/context/guard.ts +49 -0
  561. package/src/request/context/index.ts +4 -0
  562. package/src/request/context/run-in-transaction.ts +200 -0
  563. package/src/request/context/store.ts +28 -0
  564. package/src/request/context/types.ts +50 -0
  565. package/src/request/di/builder.ts +535 -0
  566. package/src/request/di/index.ts +8 -0
  567. package/src/request/di/resolve.ts +271 -0
  568. package/src/request/di/types.ts +262 -0
  569. package/src/request/fitting/namespace.ts +7 -0
  570. package/src/request/fixture/batch.ts +71 -0
  571. package/src/request/fixture/builder.ts +26 -0
  572. package/src/request/fixture/errors.ts +10 -0
  573. package/src/request/fixture/index.ts +8 -0
  574. package/src/request/fixture/namespace.ts +23 -0
  575. package/src/request/fixture/paginate.ts +44 -0
  576. package/src/request/fixture/to-handlers.ts +260 -0
  577. package/src/request/fixture/types.ts +79 -0
  578. package/src/request/flow/act-as.ts +78 -0
  579. package/src/request/flow/namespace.ts +17 -0
  580. package/src/request/http/error-step.ts +42 -0
  581. package/src/request/http/file.ts +141 -0
  582. package/src/request/http/index.ts +4 -0
  583. package/src/request/http/middleware.ts +141 -0
  584. package/src/request/http/namespace.ts +5 -0
  585. package/src/request/http/rate-limit-classes.ts +170 -0
  586. package/src/request/http/response.ts +82 -0
  587. package/src/request/http/server.ts +916 -0
  588. package/src/request/http/sniff.ts +261 -0
  589. package/src/request/http/types.ts +250 -0
  590. package/src/request/http/upload.ts +284 -0
  591. package/src/request/internal/text.ts +6 -0
  592. package/src/request/openapi/generate.ts +205 -0
  593. package/src/request/openapi/index.ts +2 -0
  594. package/src/request/openapi/namespace.ts +7 -0
  595. package/src/test/auth.ts +13 -0
  596. package/src/test/auto-setup.ts +45 -0
  597. package/src/test/context.ts +91 -0
  598. package/src/test/crawl-fixture.ts +157 -0
  599. package/src/test/discover-fork.ts +17 -0
  600. package/src/test/fingerprint.ts +135 -0
  601. package/src/test/globals.d.ts +7 -0
  602. package/src/test/index.ts +19 -0
  603. package/src/test/namespace.ts +87 -0
  604. package/src/test/plugin.ts +189 -0
  605. package/src/test/progress.ts +185 -0
  606. package/src/test/reap-after-run.ts +28 -0
  607. package/src/test/reap.ts +286 -0
  608. package/src/test/reset.ts +253 -0
  609. package/src/test/savepoints.ts +172 -0
  610. package/src/test/setup.ts +1422 -0
  611. package/src/test/system-channel.ts +50 -0
  612. package/src/test/vitest-plugin.ts +142 -0
  613. package/src/test/vitest-workspace.ts +507 -0
  614. package/src/test/vitest.ts +333 -0
  615. package/src/test/watch.ts +105 -0
  616. package/src/trace/capture/bounded-serializer.ts +146 -0
  617. package/src/trace/cardinality/analyze.ts +173 -0
  618. package/src/trace/cardinality/branch-context.ts +214 -0
  619. package/src/trace/cardinality/check.ts +33 -0
  620. package/src/trace/cardinality/classify-edge.ts +64 -0
  621. package/src/trace/cardinality/structural-max.ts +107 -0
  622. package/src/trace/check/coverage-check.ts +188 -0
  623. package/src/trace/check/flow-check.ts +103 -0
  624. package/src/trace/check/flow-step-site.ts +234 -0
  625. package/src/trace/check/io-pattern.ts +116 -0
  626. package/src/trace/codemod/add-cardinality.ts +152 -0
  627. package/src/trace/codemod/run.ts +80 -0
  628. package/src/trace/entry/child-trace.ts +21 -0
  629. package/src/trace/entry/close-trace.ts +87 -0
  630. package/src/trace/entry/finalize-trace.ts +28 -0
  631. package/src/trace/entry/open-trace.ts +138 -0
  632. package/src/trace/entry/parent-trace.ts +20 -0
  633. package/src/trace/entry/parse-traceparent.ts +39 -0
  634. package/src/trace/entry/process-start.ts +38 -0
  635. package/src/trace/entry/trace-context.ts +26 -0
  636. package/src/trace/entry/tracing-enabled.ts +10 -0
  637. package/src/trace/external/record.ts +195 -0
  638. package/src/trace/external/report.ts +66 -0
  639. package/src/trace/namespace.ts +19 -0
  640. package/src/trace/partition/day.ts +47 -0
  641. package/src/trace/partition/index.ts +14 -0
  642. package/src/trace/partition/partition-name.ts +23 -0
  643. package/src/trace/partition/plan.ts +82 -0
  644. package/src/trace/partition/schedule.ts +26 -0
  645. package/src/trace/partition/startup-hook.ts +39 -0
  646. package/src/trace/partition/sync.ts +154 -0
  647. package/src/trace/partition/tables.ts +53 -0
  648. package/src/trace/read/tree.ts +83 -0
  649. package/src/trace/retain/copy-on-error.ts +76 -0
  650. package/src/trace/runtime/expire-stale-traces.ts +54 -0
  651. package/src/trace/runtime/flow-step.ts +147 -0
  652. package/src/trace/runtime/flush-steps.ts +31 -0
  653. package/src/trace/runtime/pending-writes.ts +54 -0
  654. package/src/trace/runtime/step-buffer.ts +298 -0
  655. package/src/trace/runtime/step-error.ts +21 -0
  656. package/src/trace/runtime/step-meta.ts +55 -0
  657. package/src/trace/runtime/thenable.ts +12 -0
  658. package/src/trace/runtime/truncate-trace.ts +62 -0
  659. package/src/trace/schema/trace-fields.ts +52 -0
  660. package/src/trace/schema/trace-retained.ts +22 -0
  661. package/src/trace/schema/trace-step-fields.ts +44 -0
  662. package/src/trace/schema/trace-step-retained.ts +25 -0
  663. package/src/trace/schema/trace-step.ts +18 -0
  664. package/src/trace/schema/trace.ts +12 -0
  665. package/src/trace/transformer/apply.ts +79 -0
  666. package/src/trace/transformer/build-meta-literal.ts +30 -0
  667. package/src/trace/transformer/find-flow-step-sites.ts +85 -0
  668. package/src/trace/transformer/inject-flow-step-import.ts +39 -0
  669. package/src/trace/transformer/transform-error.ts +14 -0
  670. package/src/trace/transformer/transform-flow-steps.ts +123 -0
  671. package/src/trace/transformer/wrap-function-declaration.ts +62 -0
  672. package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
  673. package/src/workspace/affected.ts +110 -0
  674. package/src/workspace/changed-files.ts +163 -0
  675. package/src/workspace/check-deps.ts +213 -0
  676. package/src/workspace/checksum.ts +20 -0
  677. package/src/workspace/dependency-graph.ts +67 -0
  678. package/src/workspace/detect-pipework-copies.ts +93 -0
  679. package/src/workspace/discover.ts +206 -0
  680. package/src/workspace/generate.ts +401 -0
  681. package/src/workspace/index.ts +7 -0
  682. package/src/workspace/module-imports-pipework.ts +39 -0
  683. package/src/workspace/module-package-name.ts +12 -0
  684. package/src/workspace/scrub-git-env.ts +23 -0
  685. package/src/workspace/source-paths.ts +36 -0
  686. package/src/workspace/sync.ts +182 -0
  687. package/dist/REFERENCE.md +0 -1477
  688. package/dist/infra/access-links/rate-limit.d.ts +0 -10
  689. package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
  690. package/dist/infra/access-links/rate-limit.js +0 -28
  691. package/dist/infra/access-links/rate-limit.js.map +0 -1
  692. package/dist/infra/email/sigv4.d.ts +0 -24
  693. package/dist/infra/email/sigv4.d.ts.map +0 -1
  694. package/dist/infra/email/sigv4.js +0 -55
  695. package/dist/infra/email/sigv4.js.map +0 -1
@@ -0,0 +1,230 @@
1
+ ## Caching with Drizzle
2
+
3
+ By default, Drizzle does not perform any implicit actions with your queries and mapping. There is no cache under the hood—each query is sent directly to your database, and you can actually see it.
4
+
5
+ However, there are cases when you might want to implement a simple caching logic for specific queries or even for all queries. With Drizzle's cache option, you can define how and when the cache is used, how you store and retrieve data, and what actions to take when write statements are executed on the database. It's basically similar to `beforeQuery` hooks, that will be invoked before actual query will be executed. Additionally, Drizzle provides predefined logic for caching. Let's take a look at it.
6
+
7
+ To make cache work you would need to define cache callbacks in drizzle instance or use a predefined ones we have in Drizzle, like a `upstashCache()` that was built together with Upstash team
8
+
9
+ ### Cache overview
10
+
11
+ **Using upstash cache with drizzle**
12
+
13
+ ```ts
14
+ const db = drizzle(process.env.DB_URL!, { cache: upstashCache() })
15
+ ```
16
+
17
+ You can also define custom logic for your cache behavior. This is an example of our NodeKV implementation for the Drizzle cache test suites
18
+
19
+ ```ts
20
+ const db = drizzle(process.env.DB_URL!, { cache: new TestGlobalCache() })
21
+ ```
22
+
23
+ ```ts
24
+ import Keyv from 'keyv';
25
+
26
+ export class TestGlobalCache extends Cache {
27
+ private globalTtl: number = 1000;
28
+ // This object will be used to store which query keys were used
29
+ // for a specific table, so we can later use it for invalidation.
30
+ private usedTablesPerKey: Record<string, string[]> = {};
31
+
32
+ constructor(private kv: Keyv = new Keyv()) {
33
+ super();
34
+ }
35
+
36
+ // For the strategy, we have two options:
37
+ // - 'explicit': The cache is used only when .$withCache() is added to a query.
38
+ // - 'all': All queries are cached globally.
39
+ // The default behavior is 'explicit'.
40
+ override strategy(): 'explicit' | 'all' {
41
+ return 'all';
42
+ }
43
+
44
+ // This function accepts query and parameters that cached into key param,
45
+ // allowing you to retrieve response values for this query from the cache.
46
+ override async get(key: string): Promise<any[] | undefined> {
47
+ const res = await this.kv.get(key) ?? undefined;
48
+ return res;
49
+ }
50
+
51
+ // This function accepts several options to define how cached data will be stored:
52
+ // - 'key': A hashed query and parameters.
53
+ // - 'response': An array of values returned by Drizzle from the database.
54
+ // - 'tables': An array of tables involved in the select queries. This information is needed for cache invalidation.
55
+ //
56
+ // For example, if a query uses the "users" and "posts" tables, you can store this information. Later, when the app executes
57
+ // any mutation statements on these tables, you can remove the corresponding key from the cache.
58
+ // If you're okay with eventual consistency for your queries, you can skip this option.
59
+ override async put(key: string, response: any, tables: string[], config?: CacheConfig): Promise<void> {
60
+ await this.kv.set(key, response, config ? config.ex : this.globalTtl);
61
+ for (const table of tables) {
62
+ const keys = this.usedTablesPerKey[table];
63
+ if (keys === undefined) {
64
+ this.usedTablesPerKey[table] = [key];
65
+ } else {
66
+ keys.push(key);
67
+ }
68
+ }
69
+ }
70
+
71
+ // This function is called when insert, update, or delete statements are executed.
72
+ // You can either skip this step or invalidate queries that used the affected tables.
73
+ //
74
+ // The function receives an object with two keys:
75
+ // - 'tags': Used for queries labeled with a specific tag, allowing you to invalidate by that tag.
76
+ // - 'tables': The actual tables affected by the insert, update, or delete statements,
77
+ // helping you track which tables have changed since the last cache update.
78
+ override async onMutate(params: { tags: string | string[], tables: string | string[] | Table<any> | Table<any>[]}): Promise<void> {
79
+ const tagsArray = params.tags ? Array.isArray(params.tags) ? params.tags : [params.tags] : [];
80
+ const tablesArray = params.tables ? Array.isArray(params.tables) ? params.tables : [params.tables] : [];
81
+
82
+ const keysToDelete = new Set<string>();
83
+
84
+ for (const table of tablesArray) {
85
+ const tableName = is(table, Table) ? getTableName(table) : table as string;
86
+ const keys = this.usedTablesPerKey[tableName] ?? [];
87
+ for (const key of keys) keysToDelete.add(key);
88
+ }
89
+
90
+ if (keysToDelete.size > 0 || tagsArray.length > 0) {
91
+ for (const tag of tagsArray) {
92
+ await this.kv.delete(tag);
93
+ }
94
+
95
+ for (const key of keysToDelete) {
96
+ await this.kv.delete(key);
97
+ for (const table of tablesArray) {
98
+ const tableName = is(table, Table) ? getTableName(table) : table as string;
99
+ this.usedTablesPerKey[tableName] = [];
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### Cache definition
108
+
109
+ **Define cache credentials, but no cache will be used globally for all queries**
110
+
111
+ ```ts
112
+ const db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '' }) })
113
+ ```
114
+
115
+ **Define cache credentials, and the cache will be used globally for all queries**
116
+
117
+ ```ts
118
+ const db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '', global: true }) })
119
+ ```
120
+
121
+ **Define cache credentials with custom config values to be used for all queries, unless overridden**
122
+
123
+ ```ts
124
+ const db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '', global: true, config: {} }) })
125
+ ```
126
+
127
+ These are all the possible config values that Drizzle supports with the cache layer
128
+
129
+ ```ts
130
+ export type CacheConfig = {
131
+ /**
132
+ * expire time, in seconds (a positive integer)
133
+ */
134
+ ex?: number;
135
+ /**
136
+ * expire time, in milliseconds (a positive integer).
137
+ */
138
+ px?: number;
139
+ /**
140
+ * Unix time at which the key will expire, in seconds (a positive integer).
141
+ */
142
+ exat?: number;
143
+ /**
144
+ * Unix time at which the key will expire, in milliseconds (a positive integer)
145
+ */
146
+ pxat?: number;
147
+ /**
148
+ * Retain the time to live associated with the key.
149
+ */
150
+ keepTtl?: boolean;
151
+ };
152
+
153
+ ```
154
+
155
+ ### Cache usage
156
+
157
+ Once you've provided all the necessary instructions to the Drizzle database instance, you can now use the cache with Drizzle
158
+
159
+ **Case 1: Drizzle with global: false option**
160
+
161
+ ```ts
162
+ const db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '' }) })
163
+ ```
164
+
165
+ In this case, the current query won't use the cache
166
+
167
+ ```ts
168
+ const res = await db.select().from(users)
169
+
170
+ // However, any mutate operation will trigger the onMutate function in the cache
171
+ // and attempt to invalidate queries that used the tables involved in this mutation query.
172
+ await db.insert(users).value({ email: 'cacheman@upstash.com' })
173
+ ```
174
+
175
+ If you want the query to actually use the cache, you need to call `.$withCache()`
176
+
177
+ ```ts
178
+ const res = await db.select().from(users).$withCache()
179
+ ```
180
+
181
+ `.$withCache` has a set of options you can use to manage and config this specific query strategy
182
+
183
+ ```ts
184
+ // rewrite the global config options for this specific query
185
+ .$withCache({ config: {} })
186
+
187
+ // give a query custom cache key instead of hashing query+params under the hood
188
+ .$withCache({ tag: 'custom_key' })
189
+
190
+ // disable autoinvalidation for this query, if you are fine with eventual consstnecy for this specific query
191
+ .$withCache({ autoInvalidate: false })
192
+ ```
193
+
194
+ **Case 2: Drizzle with global: true option**
195
+
196
+ ```ts
197
+ const db = drizzle(process.env.DB_URL!, { cache: upstashCache({ url: '', token: '', global: true }) })
198
+ ```
199
+
200
+ In this case, the current query will use the cache
201
+
202
+ ```ts
203
+ const res = await db.select().from(users)
204
+ ```
205
+
206
+ If you want the query to disable cache for some specific query, you need to call `.$withCache(false)`
207
+
208
+ ```ts
209
+ // cache is disabled for this query
210
+ const res = await db.select().from(users).$withCache(false)
211
+ ```
212
+
213
+ You can also use cache instance from a `db` to force invalidate specific tables or tags you've defined previously
214
+
215
+ ```ts
216
+ // Invalidate all queries that use the `users` table. You can do this with the Drizzle instance.
217
+ await db.$cache?.invalidate({ tables: users });
218
+ // or
219
+ await db.$cache?.invalidate({ tables: [users, posts] });
220
+
221
+ // Invalidate all queries that use the `usersTable`. You can do this by using just the table name.
222
+ await db.$cache?.invalidate({ tables: 'usersTable' });
223
+ // or
224
+ await db.$cache?.invalidate({ tables: ['usersTable' , 'postsTable' ] });
225
+
226
+ // You can also invalidate custom tags defined in any previously executed select queries.
227
+ await db.$cache?.invalidate({ tags: 'custom_key' });
228
+ // or
229
+ await db.$cache?.invalidate({ tags: ['custom_key', 'custom_key1'] });
230
+ ```
@@ -0,0 +1,76 @@
1
+ import type { Column } from './column.js';
2
+ import { entityKind } from './entity.js';
3
+ import { Table } from './table.js';
4
+ import type { Casing } from './utils.js';
5
+
6
+ export function toSnakeCase(input: string) {
7
+ const words = input
8
+ .replace(/['\u2019]/g, '')
9
+ .match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
10
+
11
+ return words.map((word) => word.toLowerCase()).join('_');
12
+ }
13
+
14
+ export function toCamelCase(input: string) {
15
+ const words = input
16
+ .replace(/['\u2019]/g, '')
17
+ .match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
18
+
19
+ return words.reduce((acc, word, i) => {
20
+ const formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;
21
+ return acc + formattedWord;
22
+ }, '');
23
+ }
24
+
25
+ function noopCase(input: string) {
26
+ return input;
27
+ }
28
+
29
+ export class CasingCache {
30
+ static readonly [entityKind]: string = 'CasingCache';
31
+
32
+ /** @internal */
33
+ cache: Record<string, string> = {};
34
+ private cachedTables: Record<string, true> = {};
35
+ private convert: (input: string) => string;
36
+
37
+ constructor(casing?: Casing) {
38
+ this.convert = casing === 'snake_case'
39
+ ? toSnakeCase
40
+ : casing === 'camelCase'
41
+ ? toCamelCase
42
+ : noopCase;
43
+ }
44
+
45
+ getColumnCasing(column: Column): string {
46
+ if (!column.keyAsName) return column.name;
47
+
48
+ const schema = column.table[Table.Symbol.Schema] ?? 'public';
49
+ const tableName = column.table[Table.Symbol.OriginalName];
50
+ const key = `${schema}.${tableName}.${column.name}`;
51
+
52
+ if (!this.cache[key]) {
53
+ this.cacheTable(column.table);
54
+ }
55
+ return this.cache[key]!;
56
+ }
57
+
58
+ private cacheTable(table: Table) {
59
+ const schema = table[Table.Symbol.Schema] ?? 'public';
60
+ const tableName = table[Table.Symbol.OriginalName];
61
+ const tableKey = `${schema}.${tableName}`;
62
+
63
+ if (!this.cachedTables[tableKey]) {
64
+ for (const column of Object.values(table[Table.Symbol.Columns])) {
65
+ const columnKey = `${tableKey}.${column.name}`;
66
+ this.cache[columnKey] = this.convert(column.name);
67
+ }
68
+ this.cachedTables[tableKey] = true;
69
+ }
70
+ }
71
+
72
+ clearCache() {
73
+ this.cache = {};
74
+ this.cachedTables = {};
75
+ }
76
+ }
@@ -0,0 +1,11 @@
1
+ /** A collation: one identifier (`'en_US.utf8'`, dots included) or a schema-qualified `[schema, name]`. */
2
+ export type CollationName = string | readonly [schema: string, name: string]
3
+
4
+ function quoteIdent(name: string): string {
5
+ return `"${name.replace(/"/g, '""')}"`
6
+ }
7
+
8
+ /** The collation as SQL text: `"en_US.utf8"` or `"pg_catalog"."C"`. */
9
+ export function quoteCollation(name: CollationName): string {
10
+ return typeof name === 'string' ? quoteIdent(name) : `${quoteIdent(name[0])}.${quoteIdent(name[1])}`
11
+ }
@@ -0,0 +1,370 @@
1
+ import { entityKind } from './entity.js';
2
+ import type { Column } from './column.js';
3
+ import type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.js';
4
+ import type { SQL } from './sql/sql.js';
5
+ import type { Assume, Simplify } from './utils.js';
6
+
7
+ export type ColumnDataType =
8
+ | 'string'
9
+ | 'number'
10
+ | 'boolean'
11
+ | 'array'
12
+ | 'json'
13
+ | 'date'
14
+ | 'bigint'
15
+ | 'custom'
16
+ | 'buffer'
17
+ | 'dateDuration'
18
+ | 'duration'
19
+ | 'relDuration'
20
+ | 'localTime'
21
+ | 'localDate'
22
+ | 'localDateTime';
23
+
24
+ export type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'common' | 'gel';
25
+
26
+ export type GeneratedStorageMode = 'virtual' | 'stored';
27
+
28
+ export type GeneratedType = 'always' | 'byDefault';
29
+
30
+ export type GeneratedColumnConfig<TDataType> = {
31
+ as: TDataType | SQL | (() => SQL);
32
+ type?: GeneratedType;
33
+ mode?: GeneratedStorageMode;
34
+ };
35
+
36
+ export type GeneratedIdentityConfig = {
37
+ sequenceName?: string | undefined;
38
+ sequenceOptions?: PgSequenceOptions;
39
+ type: 'always' | 'byDefault';
40
+ };
41
+
42
+ export interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {
43
+ name: string;
44
+ dataType: TDataType;
45
+ columnType: TColumnType;
46
+ data: unknown;
47
+ driverParam: unknown;
48
+ enumValues: string[] | undefined;
49
+ }
50
+
51
+ export type MakeColumnConfig<
52
+ T extends ColumnBuilderBaseConfig<ColumnDataType, string>,
53
+ TTableName extends string,
54
+ TData = T extends { $type: infer U } ? U : T['data'],
55
+ > = {
56
+ name: T['name'];
57
+ tableName: TTableName;
58
+ dataType: T['dataType'];
59
+ columnType: T['columnType'];
60
+ data: TData;
61
+ driverParam: T['driverParam'];
62
+ notNull: T extends { notNull: true } ? true : false;
63
+ hasDefault: T extends { hasDefault: true } ? true : false;
64
+ isPrimaryKey: T extends { isPrimaryKey: true } ? true : false;
65
+ isAutoincrement: T extends { isAutoincrement: true } ? true : false;
66
+ hasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;
67
+ enumValues: T['enumValues'];
68
+ baseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>
69
+ : never;
70
+ identity: T extends { identity: 'always' } ? 'always' : T extends { identity: 'byDefault' } ? 'byDefault' : undefined;
71
+ generated: T extends { generated: infer G } ? unknown extends G ? undefined
72
+ : G extends undefined ? undefined
73
+ : G
74
+ : undefined;
75
+ } & {};
76
+
77
+ export type ColumnBuilderTypeConfig<
78
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
79
+ T extends ColumnBuilderBaseConfig<ColumnDataType, string>,
80
+ TTypeConfig extends object = object,
81
+ > = Simplify<
82
+ & {
83
+ brand: 'ColumnBuilder';
84
+ name: T['name'];
85
+ dataType: T['dataType'];
86
+ columnType: T['columnType'];
87
+ data: T['data'];
88
+ driverParam: T['driverParam'];
89
+ notNull: T extends { notNull: infer U } ? U : boolean;
90
+ hasDefault: T extends { hasDefault: infer U } ? U : boolean;
91
+ enumValues: T['enumValues'];
92
+ identity: T extends { identity: infer U } ? U : unknown;
93
+ generated: T extends { generated: infer G } ? G extends undefined ? unknown : G : unknown;
94
+ }
95
+ & TTypeConfig
96
+ >;
97
+
98
+ export type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {
99
+ name: string;
100
+ keyAsName: boolean;
101
+ notNull: boolean;
102
+ default: TData | SQL | undefined;
103
+ defaultFn: (() => TData | SQL) | undefined;
104
+ onUpdateFn: (() => TData | SQL) | undefined;
105
+ hasDefault: boolean;
106
+ primaryKey: boolean;
107
+ isUnique: boolean;
108
+ uniqueName: string | undefined;
109
+ uniqueType: string | undefined;
110
+ dataType: string;
111
+ columnType: string;
112
+ generated: GeneratedColumnConfig<TData> | undefined;
113
+ generatedIdentity: GeneratedIdentityConfig | undefined;
114
+ collation?: string | undefined;
115
+ } & TRuntimeConfig;
116
+
117
+ export interface ColumnBuilderExtraConfig {
118
+ primaryKeyHasDefault?: boolean;
119
+ }
120
+
121
+ export type NotNull<T extends ColumnBuilderBase> = T & {
122
+ _: {
123
+ notNull: true;
124
+ };
125
+ };
126
+
127
+ export type HasDefault<T extends ColumnBuilderBase> = T & {
128
+ _: {
129
+ hasDefault: true;
130
+ };
131
+ };
132
+
133
+ export type IsPrimaryKey<T extends ColumnBuilderBase> = T & {
134
+ _: {
135
+ isPrimaryKey: true;
136
+ };
137
+ };
138
+
139
+ export type IsAutoincrement<T extends ColumnBuilderBase> = T & {
140
+ _: {
141
+ isAutoincrement: true;
142
+ };
143
+ };
144
+
145
+ export type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {
146
+ _: {
147
+ hasRuntimeDefault: true;
148
+ };
149
+ };
150
+
151
+ export type $Type<T extends ColumnBuilderBase, TType> = T & {
152
+ _: {
153
+ $type: TType;
154
+ };
155
+ };
156
+
157
+ export type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {
158
+ _: {
159
+ hasDefault: true;
160
+ generated: TGenerated;
161
+ };
162
+ };
163
+
164
+ export type IsIdentity<
165
+ T extends ColumnBuilderBase,
166
+ TType extends 'always' | 'byDefault',
167
+ > = T & {
168
+ _: {
169
+ notNull: true;
170
+ hasDefault: true;
171
+ identity: TType;
172
+ };
173
+ };
174
+ export interface ColumnBuilderBase<
175
+ T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,
176
+ TTypeConfig extends object = object,
177
+ > {
178
+ _: ColumnBuilderTypeConfig<T, TTypeConfig>;
179
+ }
180
+
181
+ // To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.
182
+ export abstract class ColumnBuilder<
183
+ T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,
184
+ TRuntimeConfig extends object = object,
185
+ TTypeConfig extends object = object,
186
+ TExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,
187
+ > implements ColumnBuilderBase<T, TTypeConfig> {
188
+ static readonly [entityKind]: string = 'ColumnBuilder';
189
+
190
+ declare _: ColumnBuilderTypeConfig<T, TTypeConfig>;
191
+
192
+ protected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;
193
+
194
+ constructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {
195
+ this.config = {
196
+ name,
197
+ keyAsName: name === '',
198
+ notNull: false,
199
+ default: undefined,
200
+ hasDefault: false,
201
+ primaryKey: false,
202
+ isUnique: false,
203
+ uniqueName: undefined,
204
+ uniqueType: undefined,
205
+ dataType,
206
+ columnType,
207
+ generated: undefined,
208
+ } as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;
209
+ }
210
+
211
+ /**
212
+ * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.
213
+ *
214
+ * @example
215
+ * ```ts
216
+ * const users = pgTable('users', {
217
+ * id: integer('id').$type<UserId>().primaryKey(),
218
+ * details: json('details').$type<UserDetails>().notNull(),
219
+ * });
220
+ * ```
221
+ */
222
+ $type<TType>(): $Type<this, TType> {
223
+ return this as $Type<this, TType>;
224
+ }
225
+
226
+ /**
227
+ * Adds a `not null` clause to the column definition.
228
+ *
229
+ * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.
230
+ */
231
+ notNull(): NotNull<this> {
232
+ this.config.notNull = true;
233
+ return this as NotNull<this>;
234
+ }
235
+
236
+ /**
237
+ * Adds a `default <value>` clause to the column definition.
238
+ *
239
+ * Affects the `insert` model of the table - columns *with* `default` are optional on insert.
240
+ *
241
+ * If you need to set a dynamic default value, use {@link $defaultFn} instead.
242
+ */
243
+ default(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {
244
+ this.config.default = value;
245
+ this.config.hasDefault = true;
246
+ return this as HasDefault<this>;
247
+ }
248
+
249
+ /**
250
+ * Adds a dynamic default value to the column.
251
+ * The function will be called when the row is inserted, and the returned value will be used as the column value.
252
+ *
253
+ * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.
254
+ */
255
+ $defaultFn(
256
+ fn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,
257
+ ): HasRuntimeDefault<HasDefault<this>> {
258
+ this.config.defaultFn = fn;
259
+ this.config.hasDefault = true;
260
+ return this as HasRuntimeDefault<HasDefault<this>>;
261
+ }
262
+
263
+ /**
264
+ * Alias for {@link $defaultFn}.
265
+ */
266
+ $default = this.$defaultFn;
267
+
268
+ /**
269
+ * Adds a dynamic update value to the column.
270
+ * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.
271
+ * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.
272
+ *
273
+ * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.
274
+ */
275
+ $onUpdateFn(
276
+ fn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,
277
+ ): HasDefault<this> {
278
+ this.config.onUpdateFn = fn;
279
+ this.config.hasDefault = true;
280
+ return this as HasDefault<this>;
281
+ }
282
+
283
+ /**
284
+ * Alias for {@link $onUpdateFn}.
285
+ */
286
+ $onUpdate = this.$onUpdateFn;
287
+
288
+ /**
289
+ * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.
290
+ *
291
+ * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.
292
+ */
293
+ primaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>
294
+ : IsPrimaryKey<NotNull<this>>
295
+ {
296
+ this.config.primaryKey = true;
297
+ this.config.notNull = true;
298
+ return this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>
299
+ : IsPrimaryKey<NotNull<this>>;
300
+ }
301
+
302
+ abstract generatedAlwaysAs(
303
+ as: SQL | T['data'] | (() => SQL),
304
+ config?: Partial<GeneratedColumnConfig<unknown>>,
305
+ ): HasGenerated<this, {
306
+ type: 'always';
307
+ }>;
308
+
309
+ /** @internal Sets the name of the column to the key within the table definition if a name was not given. */
310
+ setName(name: string) {
311
+ if (this.config.name !== '') return;
312
+ this.config.name = name;
313
+ }
314
+ }
315
+
316
+ export type BuildColumn<
317
+ TTableName extends string,
318
+ TBuilder extends ColumnBuilderBase,
319
+ TDialect extends Dialect,
320
+ > = TDialect extends 'pg' ? PgColumn<
321
+ MakeColumnConfig<TBuilder['_'], TTableName>,
322
+ {},
323
+ Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>
324
+ >
325
+ : TDialect extends 'common' ? Column<
326
+ MakeColumnConfig<TBuilder['_'], TTableName>,
327
+ {},
328
+ Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>
329
+ >
330
+ : never;
331
+
332
+ export type BuildIndexColumn<
333
+ TDialect extends Dialect,
334
+ > = TDialect extends 'pg' ? ExtraConfigColumn
335
+ : never;
336
+
337
+ // TODO
338
+ // try to make sql as well + indexRaw
339
+
340
+ // optional after everything will be working as expected
341
+ // also try to leave only needed methods for extraConfig
342
+ // make an error if I pass .asc() to fk and so on
343
+
344
+ export type BuildColumns<
345
+ TTableName extends string,
346
+ TConfigMap extends Record<string, ColumnBuilderBase>,
347
+ TDialect extends Dialect,
348
+ > =
349
+ & {
350
+ [Key in keyof TConfigMap]: BuildColumn<TTableName, {
351
+ _:
352
+ & Omit<TConfigMap[Key]['_'], 'name'>
353
+ & { name: TConfigMap[Key]['_']['name'] extends '' ? Assume<Key, string> : TConfigMap[Key]['_']['name'] };
354
+ }, TDialect>;
355
+ }
356
+ & {};
357
+
358
+ export type BuildExtraConfigColumns<
359
+ _TTableName extends string,
360
+ TConfigMap extends Record<string, ColumnBuilderBase>,
361
+ TDialect extends Dialect,
362
+ > =
363
+ & {
364
+ [Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;
365
+ }
366
+ & {};
367
+
368
+ export type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =
369
+ TDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>
370
+ : never;