drizzle-orm 0.40.0-af1f2fe → 0.40.0-ca1033e

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 (216) hide show
  1. package/aws-data-api/pg/driver.cjs +5 -1
  2. package/aws-data-api/pg/driver.cjs.map +1 -1
  3. package/aws-data-api/pg/driver.d.cts +1 -0
  4. package/aws-data-api/pg/driver.d.ts +1 -0
  5. package/aws-data-api/pg/driver.js +5 -1
  6. package/aws-data-api/pg/driver.js.map +1 -1
  7. package/aws-data-api/pg/session.cjs +15 -4
  8. package/aws-data-api/pg/session.cjs.map +1 -1
  9. package/aws-data-api/pg/session.d.cts +13 -3
  10. package/aws-data-api/pg/session.d.ts +13 -3
  11. package/aws-data-api/pg/session.js +15 -4
  12. package/aws-data-api/pg/session.js.map +1 -1
  13. package/bun-sql/driver.cjs +5 -1
  14. package/bun-sql/driver.cjs.map +1 -1
  15. package/bun-sql/driver.js +5 -1
  16. package/bun-sql/driver.js.map +1 -1
  17. package/bun-sql/session.cjs +21 -9
  18. package/bun-sql/session.cjs.map +1 -1
  19. package/bun-sql/session.d.cts +12 -3
  20. package/bun-sql/session.d.ts +12 -3
  21. package/bun-sql/session.js +21 -9
  22. package/bun-sql/session.js.map +1 -1
  23. package/cache/core/cache.cjs +47 -0
  24. package/cache/core/cache.cjs.map +1 -0
  25. package/cache/core/cache.d.cts +35 -0
  26. package/cache/core/cache.d.ts +35 -0
  27. package/cache/core/cache.js +22 -0
  28. package/cache/core/cache.js.map +1 -0
  29. package/cache/core/index.cjs +23 -0
  30. package/cache/core/index.cjs.map +1 -0
  31. package/cache/core/index.d.cts +1 -0
  32. package/cache/core/index.d.ts +1 -0
  33. package/cache/core/index.js +2 -0
  34. package/cache/core/index.js.map +1 -0
  35. package/cache/core/types.cjs +17 -0
  36. package/cache/core/types.cjs.map +1 -0
  37. package/cache/core/types.d.cts +22 -0
  38. package/cache/core/types.d.ts +22 -0
  39. package/cache/core/types.js +1 -0
  40. package/cache/core/types.js.map +1 -0
  41. package/cache/upstash/cache.cjs +114 -0
  42. package/cache/upstash/cache.cjs.map +1 -0
  43. package/cache/upstash/cache.d.cts +23 -0
  44. package/cache/upstash/cache.d.ts +23 -0
  45. package/cache/upstash/cache.js +89 -0
  46. package/cache/upstash/cache.js.map +1 -0
  47. package/cache/upstash/index.cjs +23 -0
  48. package/cache/upstash/index.cjs.map +1 -0
  49. package/cache/upstash/index.d.cts +1 -0
  50. package/cache/upstash/index.d.ts +1 -0
  51. package/cache/upstash/index.js +2 -0
  52. package/cache/upstash/index.js.map +1 -0
  53. package/neon-http/driver.cjs +9 -2
  54. package/neon-http/driver.cjs.map +1 -1
  55. package/neon-http/driver.d.cts +2 -0
  56. package/neon-http/driver.d.ts +2 -0
  57. package/neon-http/driver.js +9 -2
  58. package/neon-http/driver.js.map +1 -1
  59. package/neon-http/session.cjs +25 -15
  60. package/neon-http/session.cjs.map +1 -1
  61. package/neon-http/session.d.cts +12 -3
  62. package/neon-http/session.d.ts +12 -3
  63. package/neon-http/session.js +25 -15
  64. package/neon-http/session.js.map +1 -1
  65. package/neon-serverless/driver.cjs +9 -2
  66. package/neon-serverless/driver.cjs.map +1 -1
  67. package/neon-serverless/driver.d.cts +2 -0
  68. package/neon-serverless/driver.d.ts +2 -0
  69. package/neon-serverless/driver.js +9 -2
  70. package/neon-serverless/driver.js.map +1 -1
  71. package/neon-serverless/session.cjs +21 -7
  72. package/neon-serverless/session.cjs.map +1 -1
  73. package/neon-serverless/session.d.cts +12 -3
  74. package/neon-serverless/session.d.ts +12 -3
  75. package/neon-serverless/session.js +21 -7
  76. package/neon-serverless/session.js.map +1 -1
  77. package/node-postgres/driver.cjs +9 -2
  78. package/node-postgres/driver.cjs.map +1 -1
  79. package/node-postgres/driver.d.cts +2 -0
  80. package/node-postgres/driver.d.ts +2 -0
  81. package/node-postgres/driver.js +9 -2
  82. package/node-postgres/driver.js.map +1 -1
  83. package/node-postgres/session.cjs +19 -6
  84. package/node-postgres/session.cjs.map +1 -1
  85. package/node-postgres/session.d.cts +13 -3
  86. package/node-postgres/session.d.ts +13 -3
  87. package/node-postgres/session.js +19 -6
  88. package/node-postgres/session.js.map +1 -1
  89. package/package.json +112 -59
  90. package/pg-core/db.cjs +1 -0
  91. package/pg-core/db.cjs.map +1 -1
  92. package/pg-core/db.d.cts +4 -0
  93. package/pg-core/db.d.ts +4 -0
  94. package/pg-core/db.js +1 -0
  95. package/pg-core/db.js.map +1 -1
  96. package/pg-core/query-builders/delete.cjs +6 -1
  97. package/pg-core/query-builders/delete.cjs.map +1 -1
  98. package/pg-core/query-builders/delete.d.cts +2 -1
  99. package/pg-core/query-builders/delete.d.ts +2 -1
  100. package/pg-core/query-builders/delete.js +6 -1
  101. package/pg-core/query-builders/delete.js.map +1 -1
  102. package/pg-core/query-builders/insert.cjs +6 -1
  103. package/pg-core/query-builders/insert.cjs.map +1 -1
  104. package/pg-core/query-builders/insert.d.cts +2 -1
  105. package/pg-core/query-builders/insert.d.ts +2 -1
  106. package/pg-core/query-builders/insert.js +6 -1
  107. package/pg-core/query-builders/insert.js.map +1 -1
  108. package/pg-core/query-builders/select.cjs +31 -5
  109. package/pg-core/query-builders/select.cjs.map +1 -1
  110. package/pg-core/query-builders/select.d.cts +11 -2
  111. package/pg-core/query-builders/select.d.ts +11 -2
  112. package/pg-core/query-builders/select.js +31 -5
  113. package/pg-core/query-builders/select.js.map +1 -1
  114. package/pg-core/query-builders/select.types.cjs.map +1 -1
  115. package/pg-core/query-builders/select.types.d.cts +7 -0
  116. package/pg-core/query-builders/select.types.d.ts +7 -0
  117. package/pg-core/query-builders/update.cjs +6 -1
  118. package/pg-core/query-builders/update.cjs.map +1 -1
  119. package/pg-core/query-builders/update.d.cts +4 -3
  120. package/pg-core/query-builders/update.d.ts +4 -3
  121. package/pg-core/query-builders/update.js +6 -1
  122. package/pg-core/query-builders/update.js.map +1 -1
  123. package/pg-core/session.cjs +58 -1
  124. package/pg-core/session.cjs.map +1 -1
  125. package/pg-core/session.d.cts +14 -3
  126. package/pg-core/session.d.ts +14 -3
  127. package/pg-core/session.js +59 -2
  128. package/pg-core/session.js.map +1 -1
  129. package/pg-core/utils.cjs +16 -0
  130. package/pg-core/utils.cjs.map +1 -1
  131. package/pg-core/utils.d.cts +8 -4
  132. package/pg-core/utils.d.ts +8 -4
  133. package/pg-core/utils.js +16 -1
  134. package/pg-core/utils.js.map +1 -1
  135. package/pg-proxy/driver.cjs +7 -2
  136. package/pg-proxy/driver.cjs.map +1 -1
  137. package/pg-proxy/driver.js +7 -2
  138. package/pg-proxy/driver.js.map +1 -1
  139. package/pg-proxy/session.cjs +15 -5
  140. package/pg-proxy/session.cjs.map +1 -1
  141. package/pg-proxy/session.d.cts +12 -3
  142. package/pg-proxy/session.d.ts +12 -3
  143. package/pg-proxy/session.js +15 -5
  144. package/pg-proxy/session.js.map +1 -1
  145. package/pglite/driver.cjs +9 -2
  146. package/pglite/driver.cjs.map +1 -1
  147. package/pglite/driver.d.cts +2 -0
  148. package/pglite/driver.d.ts +2 -0
  149. package/pglite/driver.js +9 -2
  150. package/pglite/driver.js.map +1 -1
  151. package/pglite/session.cjs +19 -7
  152. package/pglite/session.cjs.map +1 -1
  153. package/pglite/session.d.cts +12 -3
  154. package/pglite/session.d.ts +12 -3
  155. package/pglite/session.js +19 -7
  156. package/pglite/session.js.map +1 -1
  157. package/postgres-js/driver.cjs +5 -1
  158. package/postgres-js/driver.cjs.map +1 -1
  159. package/postgres-js/driver.js +5 -1
  160. package/postgres-js/driver.js.map +1 -1
  161. package/postgres-js/session.cjs +18 -6
  162. package/postgres-js/session.cjs.map +1 -1
  163. package/postgres-js/session.d.cts +12 -3
  164. package/postgres-js/session.d.ts +12 -3
  165. package/postgres-js/session.js +18 -6
  166. package/postgres-js/session.js.map +1 -1
  167. package/prisma/pg/session.cjs +1 -1
  168. package/prisma/pg/session.cjs.map +1 -1
  169. package/prisma/pg/session.js +1 -1
  170. package/prisma/pg/session.js.map +1 -1
  171. package/query-builders/query-builder.cjs.map +1 -1
  172. package/query-builders/query-builder.d.cts +2 -1
  173. package/query-builders/query-builder.d.ts +2 -1
  174. package/query-builders/query-builder.js.map +1 -1
  175. package/sql/sql.cjs +7 -0
  176. package/sql/sql.cjs.map +1 -1
  177. package/sql/sql.js +7 -0
  178. package/sql/sql.js.map +1 -1
  179. package/subquery.cjs +4 -3
  180. package/subquery.cjs.map +1 -1
  181. package/subquery.d.cts +2 -1
  182. package/subquery.d.ts +2 -1
  183. package/subquery.js +4 -3
  184. package/subquery.js.map +1 -1
  185. package/utils.cjs.map +1 -1
  186. package/utils.d.cts +2 -0
  187. package/utils.d.ts +2 -0
  188. package/utils.js.map +1 -1
  189. package/vercel-postgres/driver.cjs +9 -2
  190. package/vercel-postgres/driver.cjs.map +1 -1
  191. package/vercel-postgres/driver.d.cts +2 -0
  192. package/vercel-postgres/driver.d.ts +2 -0
  193. package/vercel-postgres/driver.js +9 -2
  194. package/vercel-postgres/driver.js.map +1 -1
  195. package/vercel-postgres/session.cjs +21 -7
  196. package/vercel-postgres/session.cjs.map +1 -1
  197. package/vercel-postgres/session.d.cts +12 -3
  198. package/vercel-postgres/session.d.ts +12 -3
  199. package/vercel-postgres/session.js +21 -7
  200. package/vercel-postgres/session.js.map +1 -1
  201. package/version.cjs +1 -1
  202. package/version.d.cts +1 -1
  203. package/version.d.ts +1 -1
  204. package/version.js +1 -1
  205. package/xata-http/driver.cjs +7 -2
  206. package/xata-http/driver.cjs.map +1 -1
  207. package/xata-http/driver.d.cts +2 -0
  208. package/xata-http/driver.d.ts +2 -0
  209. package/xata-http/driver.js +7 -2
  210. package/xata-http/driver.js.map +1 -1
  211. package/xata-http/session.cjs +21 -7
  212. package/xata-http/session.cjs.map +1 -1
  213. package/xata-http/session.d.cts +12 -3
  214. package/xata-http/session.d.ts +12 -3
  215. package/xata-http/session.js +21 -7
  216. package/xata-http/session.js.map +1 -1
@@ -0,0 +1,22 @@
1
+ export type CacheConfig = {
2
+ /**
3
+ * expire time, in seconds (a positive integer)
4
+ */
5
+ ex?: number;
6
+ /**
7
+ * expire time, in milliseconds (a positive integer).
8
+ */
9
+ px?: number;
10
+ /**
11
+ * Unix time at which the key will expire, in seconds (a positive integer).
12
+ */
13
+ exat?: number;
14
+ /**
15
+ * Unix time at which the key will expire, in milliseconds (a positive integer)
16
+ */
17
+ pxat?: number;
18
+ /**
19
+ * Retain the time to live associated with the key.
20
+ */
21
+ keepTtl?: boolean;
22
+ };
@@ -0,0 +1,22 @@
1
+ export type CacheConfig = {
2
+ /**
3
+ * expire time, in seconds (a positive integer)
4
+ */
5
+ ex?: number;
6
+ /**
7
+ * expire time, in milliseconds (a positive integer).
8
+ */
9
+ px?: number;
10
+ /**
11
+ * Unix time at which the key will expire, in seconds (a positive integer).
12
+ */
13
+ exat?: number;
14
+ /**
15
+ * Unix time at which the key will expire, in milliseconds (a positive integer)
16
+ */
17
+ pxat?: number;
18
+ /**
19
+ * Retain the time to live associated with the key.
20
+ */
21
+ keepTtl?: boolean;
22
+ };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var cache_exports = {};
20
+ __export(cache_exports, {
21
+ UpstashCache: () => UpstashCache,
22
+ upstashCache: () => upstashCache
23
+ });
24
+ module.exports = __toCommonJS(cache_exports);
25
+ var import_redis = require("@upstash/redis");
26
+ var import_core = require("../core/index.cjs");
27
+ var import_entity = require("../../entity.cjs");
28
+ var import__ = require("../../index.cjs");
29
+ class UpstashCache extends import_core.Cache {
30
+ constructor(redis, config, useGlobally) {
31
+ super();
32
+ this.redis = redis;
33
+ this.useGlobally = useGlobally;
34
+ this.internalConfig = this.toInternalConfig(config);
35
+ }
36
+ static [import_entity.entityKind] = "UpstashCache";
37
+ internalConfig;
38
+ strategy() {
39
+ return this.useGlobally ? "all" : "explicit";
40
+ }
41
+ toInternalConfig(config) {
42
+ return config ? {
43
+ ex: config.ex,
44
+ exat: config.exat,
45
+ px: config.px,
46
+ pxat: config.pxat,
47
+ keepTtl: config.keepTtl
48
+ } : void 0;
49
+ }
50
+ async get(key, tables, isTag = false) {
51
+ const compositeKey = tables.sort().join(",");
52
+ if (isTag) {
53
+ const tagCompositeKey = await this.redis.hget("tagsMap", key);
54
+ if (tagCompositeKey) {
55
+ return await this.redis.hget(tagCompositeKey, key);
56
+ }
57
+ return void 0;
58
+ }
59
+ return (await this.redis.hget(compositeKey, key)) ?? void 0;
60
+ }
61
+ async put(key, response, tables, isTag = false, _config) {
62
+ if (isTag) {
63
+ const compositeKey = tables.sort().join(",");
64
+ await this.redis.hset(compositeKey, { [key]: response });
65
+ await this.redis.hset("tagsMap", { [key]: compositeKey });
66
+ for (const table of tables) {
67
+ await this.redis.sadd(`prefix_${table}`, compositeKey);
68
+ }
69
+ } else {
70
+ const compositeKey = tables.sort().join(",");
71
+ await this.redis.hset(compositeKey, { [key]: response });
72
+ }
73
+ }
74
+ async onMutate(params) {
75
+ const tags = Array.isArray(params.tags) ? params.tags : params.tags ? [params.tags] : [];
76
+ const tables = Array.isArray(params.tables) ? params.tables : params.tables ? [params.tables] : [];
77
+ const mappedTables = tables.map((table) => (0, import_entity.is)(table, import__.Table) ? table[import__.OriginalName] : table);
78
+ const prefixedMappedTables = tables.map((table) => `prefix_${table}`);
79
+ const keysToDelete = /* @__PURE__ */ new Set();
80
+ if (tables.length > 0) {
81
+ const compositeKeys = await this.redis.sunion(...prefixedMappedTables);
82
+ for (const composite of compositeKeys) {
83
+ const keys = await this.redis.hkeys(composite);
84
+ for (const key of keys)
85
+ keysToDelete.add(key);
86
+ await this.redis.del(composite);
87
+ }
88
+ await this.redis.del(...prefixedMappedTables, ...mappedTables);
89
+ }
90
+ for (const tag of tags) {
91
+ const compositeKey = await this.redis.hget("tagsMap", tag);
92
+ if (compositeKey) {
93
+ await this.redis.hdel(compositeKey, tag);
94
+ await this.redis.hdel("tagsMap", tag);
95
+ }
96
+ }
97
+ if (keysToDelete.size > 0) {
98
+ await this.redis.del(...keysToDelete);
99
+ }
100
+ }
101
+ }
102
+ function upstashCache({ url, token, config, global = false }) {
103
+ const redis = new import_redis.Redis({
104
+ url,
105
+ token
106
+ });
107
+ return new UpstashCache(redis, config, global);
108
+ }
109
+ // Annotate the CommonJS export names for ESM import in node:
110
+ 0 && (module.exports = {
111
+ UpstashCache,
112
+ upstashCache
113
+ });
114
+ //# sourceMappingURL=cache.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cache/upstash/cache.ts"],"sourcesContent":["import type { SetCommandOptions } from '@upstash/redis';\nimport { Redis } from '@upstash/redis';\nimport type { MutationOption } from '~/cache/core/index.ts';\nimport { Cache } from '~/cache/core/index.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { OriginalName, Table } from '~/index.ts';\nimport type { CacheConfig } from '../core/types.ts';\n\nexport class UpstashCache extends Cache {\n\tstatic override readonly [entityKind]: string = 'UpstashCache';\n\n\tprivate internalConfig?: SetCommandOptions;\n\n\tconstructor(public redis: Redis, config?: CacheConfig, protected useGlobally?: boolean) {\n\t\tsuper();\n\t\tthis.internalConfig = this.toInternalConfig(config);\n\t}\n\n\tpublic strategy() {\n\t\treturn this.useGlobally ? 'all' : 'explicit';\n\t}\n\n\tprivate toInternalConfig(config?: CacheConfig) {\n\t\treturn config\n\t\t\t? {\n\t\t\t\tex: config.ex,\n\t\t\t\texat: config.exat,\n\t\t\t\tpx: config.px,\n\t\t\t\tpxat: config.pxat,\n\t\t\t\tkeepTtl: config.keepTtl,\n\t\t\t} as SetCommandOptions\n\t\t\t: undefined;\n\t}\n\n\toverride async get(key: string, tables: string[], isTag: boolean = false): Promise<any[] | undefined> {\n\t\tconst compositeKey = tables.sort().join(','); // Generate the composite key for the query\n\n\t\tif (isTag) {\n\t\t\t// Handle cache lookup for tags\n\t\t\tconst tagCompositeKey = await this.redis.hget<string>('tagsMap', key); // Retrieve composite key associated with the tag\n\t\t\tif (tagCompositeKey) {\n\t\t\t\treturn await this.redis.hget(tagCompositeKey, key) as any[]; // Retrieve the cached result for the tag\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Normal cache lookup for the composite key\n\t\treturn await this.redis.hget(compositeKey, key) ?? undefined; // Retrieve result for normal query\n\t}\n\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean = false,\n\t\t_config?: CacheConfig,\n\t): Promise<void> {\n\t\tif (isTag) {\n\t\t\t// When it's a tag, store the response in the composite key\n\t\t\tconst compositeKey = tables.sort().join(',');\n\t\t\tawait this.redis.hset(compositeKey, { [key]: response }); // Store the result with the tag under the composite key\n\t\t\tawait this.redis.hset('tagsMap', { [key]: compositeKey }); // Store the tag and its composite key in the map\n\t\t\tfor (const table of tables) {\n\t\t\t\tawait this.redis.sadd(`prefix_${table}`, compositeKey);\n\t\t\t}\n\t\t} else {\n\t\t\t// Normal cache store\n\t\t\tconst compositeKey = tables.sort().join(',');\n\t\t\tawait this.redis.hset(compositeKey, { [key]: response }); // Store the result with the composite key\n\t\t}\n\t}\n\n\toverride async onMutate(params: MutationOption) {\n\t\tconst tags = Array.isArray(params.tags) ? params.tags : params.tags ? [params.tags] : [];\n\t\tconst tables = Array.isArray(params.tables) ? params.tables : params.tables ? [params.tables] : [];\n\t\tconst mappedTables = tables.map((table) => is(table, Table) ? table[OriginalName] : table as string);\n\t\tconst prefixedMappedTables = tables.map((table) => `prefix_${table}`);\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\t// Invalidate by table\n\t\tif (tables.length > 0) {\n\t\t\t// @ts-expect-error\n\t\t\tconst compositeKeys: string[] = await this.redis.sunion(...prefixedMappedTables);\n\t\t\tfor (const composite of compositeKeys) {\n\t\t\t\tconst keys = await this.redis.hkeys(composite);\n\t\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t\t\tawait this.redis.del(composite); // Remove composite entry\n\t\t\t}\n\t\t\tawait this.redis.del(...prefixedMappedTables, ...mappedTables); // Remove table mappings\n\t\t}\n\n\t\t// Invalidate by tag (WITHOUT invalidating the entire table)\n\t\tfor (const tag of tags) {\n\t\t\tconst compositeKey = await this.redis.hget<string>('tagsMap', tag);\n\t\t\tif (compositeKey) {\n\t\t\t\tawait this.redis.hdel(compositeKey, tag); // Only remove the tag-related entry\n\t\t\t\tawait this.redis.hdel('tagsMap', tag); // Remove tag reference\n\t\t\t}\n\t\t}\n\n\t\t// Delete affected cache entries\n\t\tif (keysToDelete.size > 0) {\n\t\t\tawait this.redis.del(...keysToDelete);\n\t\t}\n\t}\n}\n\nexport function upstashCache(\n\t{ url, token, config, global = false }: { url: string; token: string; config?: CacheConfig; global?: boolean },\n): UpstashCache {\n\tconst redis = new Redis({\n\t\turl,\n\t\ttoken,\n\t});\n\n\treturn new UpstashCache(redis, config, global);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ import { Redis } from '@upstash/redis';
2
+ import type { MutationOption } from "../core/index.cjs";
3
+ import { Cache } from "../core/index.cjs";
4
+ import { entityKind } from "../../entity.cjs";
5
+ import type { CacheConfig } from "../core/types.cjs";
6
+ export declare class UpstashCache extends Cache {
7
+ redis: Redis;
8
+ protected useGlobally?: boolean | undefined;
9
+ static readonly [entityKind]: string;
10
+ private internalConfig?;
11
+ constructor(redis: Redis, config?: CacheConfig, useGlobally?: boolean | undefined);
12
+ strategy(): "all" | "explicit";
13
+ private toInternalConfig;
14
+ get(key: string, tables: string[], isTag?: boolean): Promise<any[] | undefined>;
15
+ put(key: string, response: any, tables: string[], isTag?: boolean, _config?: CacheConfig): Promise<void>;
16
+ onMutate(params: MutationOption): Promise<void>;
17
+ }
18
+ export declare function upstashCache({ url, token, config, global }: {
19
+ url: string;
20
+ token: string;
21
+ config?: CacheConfig;
22
+ global?: boolean;
23
+ }): UpstashCache;
@@ -0,0 +1,23 @@
1
+ import { Redis } from '@upstash/redis';
2
+ import type { MutationOption } from "../core/index.js";
3
+ import { Cache } from "../core/index.js";
4
+ import { entityKind } from "../../entity.js";
5
+ import type { CacheConfig } from "../core/types.js";
6
+ export declare class UpstashCache extends Cache {
7
+ redis: Redis;
8
+ protected useGlobally?: boolean | undefined;
9
+ static readonly [entityKind]: string;
10
+ private internalConfig?;
11
+ constructor(redis: Redis, config?: CacheConfig, useGlobally?: boolean | undefined);
12
+ strategy(): "all" | "explicit";
13
+ private toInternalConfig;
14
+ get(key: string, tables: string[], isTag?: boolean): Promise<any[] | undefined>;
15
+ put(key: string, response: any, tables: string[], isTag?: boolean, _config?: CacheConfig): Promise<void>;
16
+ onMutate(params: MutationOption): Promise<void>;
17
+ }
18
+ export declare function upstashCache({ url, token, config, global }: {
19
+ url: string;
20
+ token: string;
21
+ config?: CacheConfig;
22
+ global?: boolean;
23
+ }): UpstashCache;
@@ -0,0 +1,89 @@
1
+ import { Redis } from "@upstash/redis";
2
+ import { Cache } from "../core/index.js";
3
+ import { entityKind, is } from "../../entity.js";
4
+ import { OriginalName, Table } from "../../index.js";
5
+ class UpstashCache extends Cache {
6
+ constructor(redis, config, useGlobally) {
7
+ super();
8
+ this.redis = redis;
9
+ this.useGlobally = useGlobally;
10
+ this.internalConfig = this.toInternalConfig(config);
11
+ }
12
+ static [entityKind] = "UpstashCache";
13
+ internalConfig;
14
+ strategy() {
15
+ return this.useGlobally ? "all" : "explicit";
16
+ }
17
+ toInternalConfig(config) {
18
+ return config ? {
19
+ ex: config.ex,
20
+ exat: config.exat,
21
+ px: config.px,
22
+ pxat: config.pxat,
23
+ keepTtl: config.keepTtl
24
+ } : void 0;
25
+ }
26
+ async get(key, tables, isTag = false) {
27
+ const compositeKey = tables.sort().join(",");
28
+ if (isTag) {
29
+ const tagCompositeKey = await this.redis.hget("tagsMap", key);
30
+ if (tagCompositeKey) {
31
+ return await this.redis.hget(tagCompositeKey, key);
32
+ }
33
+ return void 0;
34
+ }
35
+ return (await this.redis.hget(compositeKey, key)) ?? void 0;
36
+ }
37
+ async put(key, response, tables, isTag = false, _config) {
38
+ if (isTag) {
39
+ const compositeKey = tables.sort().join(",");
40
+ await this.redis.hset(compositeKey, { [key]: response });
41
+ await this.redis.hset("tagsMap", { [key]: compositeKey });
42
+ for (const table of tables) {
43
+ await this.redis.sadd(`prefix_${table}`, compositeKey);
44
+ }
45
+ } else {
46
+ const compositeKey = tables.sort().join(",");
47
+ await this.redis.hset(compositeKey, { [key]: response });
48
+ }
49
+ }
50
+ async onMutate(params) {
51
+ const tags = Array.isArray(params.tags) ? params.tags : params.tags ? [params.tags] : [];
52
+ const tables = Array.isArray(params.tables) ? params.tables : params.tables ? [params.tables] : [];
53
+ const mappedTables = tables.map((table) => is(table, Table) ? table[OriginalName] : table);
54
+ const prefixedMappedTables = tables.map((table) => `prefix_${table}`);
55
+ const keysToDelete = /* @__PURE__ */ new Set();
56
+ if (tables.length > 0) {
57
+ const compositeKeys = await this.redis.sunion(...prefixedMappedTables);
58
+ for (const composite of compositeKeys) {
59
+ const keys = await this.redis.hkeys(composite);
60
+ for (const key of keys)
61
+ keysToDelete.add(key);
62
+ await this.redis.del(composite);
63
+ }
64
+ await this.redis.del(...prefixedMappedTables, ...mappedTables);
65
+ }
66
+ for (const tag of tags) {
67
+ const compositeKey = await this.redis.hget("tagsMap", tag);
68
+ if (compositeKey) {
69
+ await this.redis.hdel(compositeKey, tag);
70
+ await this.redis.hdel("tagsMap", tag);
71
+ }
72
+ }
73
+ if (keysToDelete.size > 0) {
74
+ await this.redis.del(...keysToDelete);
75
+ }
76
+ }
77
+ }
78
+ function upstashCache({ url, token, config, global = false }) {
79
+ const redis = new Redis({
80
+ url,
81
+ token
82
+ });
83
+ return new UpstashCache(redis, config, global);
84
+ }
85
+ export {
86
+ UpstashCache,
87
+ upstashCache
88
+ };
89
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cache/upstash/cache.ts"],"sourcesContent":["import type { SetCommandOptions } from '@upstash/redis';\nimport { Redis } from '@upstash/redis';\nimport type { MutationOption } from '~/cache/core/index.ts';\nimport { Cache } from '~/cache/core/index.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { OriginalName, Table } from '~/index.ts';\nimport type { CacheConfig } from '../core/types.ts';\n\nexport class UpstashCache extends Cache {\n\tstatic override readonly [entityKind]: string = 'UpstashCache';\n\n\tprivate internalConfig?: SetCommandOptions;\n\n\tconstructor(public redis: Redis, config?: CacheConfig, protected useGlobally?: boolean) {\n\t\tsuper();\n\t\tthis.internalConfig = this.toInternalConfig(config);\n\t}\n\n\tpublic strategy() {\n\t\treturn this.useGlobally ? 'all' : 'explicit';\n\t}\n\n\tprivate toInternalConfig(config?: CacheConfig) {\n\t\treturn config\n\t\t\t? {\n\t\t\t\tex: config.ex,\n\t\t\t\texat: config.exat,\n\t\t\t\tpx: config.px,\n\t\t\t\tpxat: config.pxat,\n\t\t\t\tkeepTtl: config.keepTtl,\n\t\t\t} as SetCommandOptions\n\t\t\t: undefined;\n\t}\n\n\toverride async get(key: string, tables: string[], isTag: boolean = false): Promise<any[] | undefined> {\n\t\tconst compositeKey = tables.sort().join(','); // Generate the composite key for the query\n\n\t\tif (isTag) {\n\t\t\t// Handle cache lookup for tags\n\t\t\tconst tagCompositeKey = await this.redis.hget<string>('tagsMap', key); // Retrieve composite key associated with the tag\n\t\t\tif (tagCompositeKey) {\n\t\t\t\treturn await this.redis.hget(tagCompositeKey, key) as any[]; // Retrieve the cached result for the tag\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Normal cache lookup for the composite key\n\t\treturn await this.redis.hget(compositeKey, key) ?? undefined; // Retrieve result for normal query\n\t}\n\n\toverride async put(\n\t\tkey: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean = false,\n\t\t_config?: CacheConfig,\n\t): Promise<void> {\n\t\tif (isTag) {\n\t\t\t// When it's a tag, store the response in the composite key\n\t\t\tconst compositeKey = tables.sort().join(',');\n\t\t\tawait this.redis.hset(compositeKey, { [key]: response }); // Store the result with the tag under the composite key\n\t\t\tawait this.redis.hset('tagsMap', { [key]: compositeKey }); // Store the tag and its composite key in the map\n\t\t\tfor (const table of tables) {\n\t\t\t\tawait this.redis.sadd(`prefix_${table}`, compositeKey);\n\t\t\t}\n\t\t} else {\n\t\t\t// Normal cache store\n\t\t\tconst compositeKey = tables.sort().join(',');\n\t\t\tawait this.redis.hset(compositeKey, { [key]: response }); // Store the result with the composite key\n\t\t}\n\t}\n\n\toverride async onMutate(params: MutationOption) {\n\t\tconst tags = Array.isArray(params.tags) ? params.tags : params.tags ? [params.tags] : [];\n\t\tconst tables = Array.isArray(params.tables) ? params.tables : params.tables ? [params.tables] : [];\n\t\tconst mappedTables = tables.map((table) => is(table, Table) ? table[OriginalName] : table as string);\n\t\tconst prefixedMappedTables = tables.map((table) => `prefix_${table}`);\n\n\t\tconst keysToDelete = new Set<string>();\n\n\t\t// Invalidate by table\n\t\tif (tables.length > 0) {\n\t\t\t// @ts-expect-error\n\t\t\tconst compositeKeys: string[] = await this.redis.sunion(...prefixedMappedTables);\n\t\t\tfor (const composite of compositeKeys) {\n\t\t\t\tconst keys = await this.redis.hkeys(composite);\n\t\t\t\tfor (const key of keys) keysToDelete.add(key);\n\t\t\t\tawait this.redis.del(composite); // Remove composite entry\n\t\t\t}\n\t\t\tawait this.redis.del(...prefixedMappedTables, ...mappedTables); // Remove table mappings\n\t\t}\n\n\t\t// Invalidate by tag (WITHOUT invalidating the entire table)\n\t\tfor (const tag of tags) {\n\t\t\tconst compositeKey = await this.redis.hget<string>('tagsMap', tag);\n\t\t\tif (compositeKey) {\n\t\t\t\tawait this.redis.hdel(compositeKey, tag); // Only remove the tag-related entry\n\t\t\t\tawait this.redis.hdel('tagsMap', tag); // Remove tag reference\n\t\t\t}\n\t\t}\n\n\t\t// Delete affected cache entries\n\t\tif (keysToDelete.size > 0) {\n\t\t\tawait this.redis.del(...keysToDelete);\n\t\t}\n\t}\n}\n\nexport function upstashCache(\n\t{ url, token, config, global = false }: { url: string; token: string; config?: CacheConfig; global?: boolean },\n): UpstashCache {\n\tconst redis = new Redis({\n\t\turl,\n\t\ttoken,\n\t});\n\n\treturn new UpstashCache(redis, config, global);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+ var upstash_exports = {};
17
+ module.exports = __toCommonJS(upstash_exports);
18
+ __reExport(upstash_exports, require("./cache.cjs"), module.exports);
19
+ // Annotate the CommonJS export names for ESM import in node:
20
+ 0 && (module.exports = {
21
+ ...require("./cache.cjs")
22
+ });
23
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cache/upstash/index.ts"],"sourcesContent":["export * from './cache.ts';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,4BAAc,uBAAd;","names":[]}
@@ -0,0 +1 @@
1
+ export * from "./cache.cjs";
@@ -0,0 +1 @@
1
+ export * from "./cache.js";
@@ -0,0 +1,2 @@
1
+ export * from "./cache.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cache/upstash/index.ts"],"sourcesContent":["export * from './cache.ts';\n"],"mappings":"AAAA,cAAc;","names":[]}
@@ -40,7 +40,10 @@ class NeonHttpDriver {
40
40
  }
41
41
  static [import_entity.entityKind] = "NeonHttpDriver";
42
42
  createSession(schema) {
43
- return new import_session.NeonHttpSession(this.client, this.dialect, schema, { logger: this.options.logger });
43
+ return new import_session.NeonHttpSession(this.client, this.dialect, schema, {
44
+ logger: this.options.logger,
45
+ cache: this.options.cache
46
+ });
44
47
  }
45
48
  initMappers() {
46
49
  import_serverless.types.setTypeParser(import_serverless.types.builtins.TIMESTAMPTZ, (val) => val);
@@ -106,7 +109,7 @@ function construct(client, config = {}) {
106
109
  tableNamesMap: tablesConfig.tableNamesMap
107
110
  };
108
111
  }
109
- const driver = new NeonHttpDriver(client, dialect, { logger });
112
+ const driver = new NeonHttpDriver(client, dialect, { logger, cache: config.cache });
110
113
  const session = driver.createSession(schema);
111
114
  const db = new NeonHttpDatabase(
112
115
  dialect,
@@ -114,6 +117,10 @@ function construct(client, config = {}) {
114
117
  schema
115
118
  );
116
119
  db.$client = client;
120
+ db.$cache = config.cache;
121
+ if (db.$cache) {
122
+ db.$cache["invalidate"] = config.cache?.onMutate;
123
+ }
117
124
  return db;
118
125
  }
119
126
  function drizzle(...params) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/neon-http/driver.ts"],"sourcesContent":["import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';\nimport { neon, types } from '@neondatabase/serverless';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from './session.ts';\n\nexport interface NeonDriverOptions {\n\tlogger?: Logger;\n}\n\nexport class NeonHttpDriver {\n\tstatic readonly [entityKind]: string = 'NeonHttpDriver';\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NeonDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NeonHttpSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NeonHttpSession(this.client, this.dialect, schema, { logger: this.options.logger });\n\t}\n\n\tinitMappers() {\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\t}\n}\n\nfunction wrap<T extends object>(\n\ttarget: T,\n\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\tcb: (target: any, p: string | symbol, res: any) => any,\n\tdeep?: boolean,\n) {\n\treturn new Proxy(target, {\n\t\tget(target, p) {\n\t\t\tconst element = target[p as keyof typeof p];\n\t\t\tif (typeof element !== 'function' && (typeof element !== 'object' || element === null)) return element;\n\n\t\t\tif (deep) return wrap(element, token, cb);\n\t\t\tif (p === 'query') return wrap(element, token, cb, true);\n\n\t\t\treturn new Proxy(element as any, {\n\t\t\t\tapply(target, thisArg, argArray) {\n\t\t\t\t\tconst res = target.call(thisArg, ...argArray);\n\t\t\t\t\tif (typeof res === 'object' && res !== null && 'setToken' in res && typeof res.setToken === 'function') {\n\t\t\t\t\t\tres.setToken(token);\n\t\t\t\t\t}\n\t\t\t\t\treturn cb(target, p, res);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport class NeonHttpDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonHttpQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpDatabase';\n\n\t$withAuth(\n\t\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\t): Omit<\n\t\tthis,\n\t\tExclude<\n\t\t\tkeyof this,\n\t\t\t| '$count'\n\t\t\t| 'delete'\n\t\t\t| 'select'\n\t\t\t| 'selectDistinct'\n\t\t\t| 'selectDistinctOn'\n\t\t\t| 'update'\n\t\t\t| 'insert'\n\t\t\t| 'with'\n\t\t\t| 'query'\n\t\t\t| 'execute'\n\t\t\t| 'refreshMaterializedView'\n\t\t>\n\t> {\n\t\tthis.authToken = token;\n\n\t\treturn wrap(this, token, (target, p, res) => {\n\t\t\tif (p === 'with') {\n\t\t\t\treturn wrap(res, token, (_, __, res) => res);\n\t\t\t}\n\t\t\treturn res;\n\t\t});\n\t}\n\n\t/** @internal */\n\tdeclare readonly session: NeonHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<any, any>,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NeonHttpDriver(client, dialect, { logger });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new NeonHttpDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,\n\t);\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<false, false>,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ connectionString: string } & HTTPTransactionOptions<boolean, boolean>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = neon(params[0] as string);\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& {\n\t\t\t\tconnection?:\n\t\t\t\t\t| ({\n\t\t\t\t\t\tconnectionString: string;\n\t\t\t\t\t} & HTTPTransactionOptions<boolean, boolean>)\n\t\t\t\t\t| string;\n\t\t\t\tclient?: TClient;\n\t\t\t}\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { connectionString, ...options } = connection;\n\n\t\t\tconst instance = neon(connectionString, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = neon(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NeonHttpDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"],"mappings":"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","names":["target","res","instance","drizzle"]}
1
+ {"version":3,"sources":["../../src/neon-http/driver.ts"],"sourcesContent":["import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';\nimport { neon, types } from '@neondatabase/serverless';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from './session.ts';\n\nexport interface NeonDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NeonHttpDriver {\n\tstatic readonly [entityKind]: string = 'NeonHttpDriver';\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NeonDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NeonHttpSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NeonHttpSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n\n\tinitMappers() {\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\t}\n}\n\nfunction wrap<T extends object>(\n\ttarget: T,\n\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\tcb: (target: any, p: string | symbol, res: any) => any,\n\tdeep?: boolean,\n) {\n\treturn new Proxy(target, {\n\t\tget(target, p) {\n\t\t\tconst element = target[p as keyof typeof p];\n\t\t\tif (typeof element !== 'function' && (typeof element !== 'object' || element === null)) return element;\n\n\t\t\tif (deep) return wrap(element, token, cb);\n\t\t\tif (p === 'query') return wrap(element, token, cb, true);\n\n\t\t\treturn new Proxy(element as any, {\n\t\t\t\tapply(target, thisArg, argArray) {\n\t\t\t\t\tconst res = target.call(thisArg, ...argArray);\n\t\t\t\t\tif (typeof res === 'object' && res !== null && 'setToken' in res && typeof res.setToken === 'function') {\n\t\t\t\t\t\tres.setToken(token);\n\t\t\t\t\t}\n\t\t\t\t\treturn cb(target, p, res);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport class NeonHttpDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonHttpQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpDatabase';\n\n\t$withAuth(\n\t\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\t): Omit<\n\t\tthis,\n\t\tExclude<\n\t\t\tkeyof this,\n\t\t\t| '$count'\n\t\t\t| 'delete'\n\t\t\t| 'select'\n\t\t\t| 'selectDistinct'\n\t\t\t| 'selectDistinctOn'\n\t\t\t| 'update'\n\t\t\t| 'insert'\n\t\t\t| 'with'\n\t\t\t| 'query'\n\t\t\t| 'execute'\n\t\t\t| 'refreshMaterializedView'\n\t\t>\n\t> {\n\t\tthis.authToken = token;\n\n\t\treturn wrap(this, token, (target, p, res) => {\n\t\t\tif (p === 'with') {\n\t\t\t\treturn wrap(res, token, (_, __, res) => res);\n\t\t\t}\n\t\t\treturn res;\n\t\t});\n\t}\n\n\t/** @internal */\n\tdeclare readonly session: NeonHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<any, any>,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NeonHttpDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new NeonHttpDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,\n\t);\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<false, false>,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ connectionString: string } & HTTPTransactionOptions<boolean, boolean>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = neon(params[0] as string);\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& {\n\t\t\t\tconnection?:\n\t\t\t\t\t| ({\n\t\t\t\t\t\tconnectionString: string;\n\t\t\t\t\t} & HTTPTransactionOptions<boolean, boolean>)\n\t\t\t\t\t| string;\n\t\t\t\tclient?: TClient;\n\t\t\t}\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { connectionString, ...options } = connection;\n\n\t\t\tconst instance = neon(connectionString, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = neon(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NeonHttpDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"],"mappings":"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","names":["target","res","instance","drizzle"]}
@@ -1,5 +1,6 @@
1
1
  import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';
2
2
  import type { BatchItem, BatchResponse } from "../batch.cjs";
3
+ import type { Cache } from "../cache/core/cache.cjs";
3
4
  import { entityKind } from "../entity.cjs";
4
5
  import type { Logger } from "../logger.cjs";
5
6
  import { PgDatabase } from "../pg-core/db.cjs";
@@ -9,6 +10,7 @@ import { type DrizzleConfig } from "../utils.cjs";
9
10
  import { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from "./session.cjs";
10
11
  export interface NeonDriverOptions {
11
12
  logger?: Logger;
13
+ cache?: Cache;
12
14
  }
13
15
  export declare class NeonHttpDriver {
14
16
  private client;
@@ -1,5 +1,6 @@
1
1
  import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';
2
2
  import type { BatchItem, BatchResponse } from "../batch.js";
3
+ import type { Cache } from "../cache/core/cache.js";
3
4
  import { entityKind } from "../entity.js";
4
5
  import type { Logger } from "../logger.js";
5
6
  import { PgDatabase } from "../pg-core/db.js";
@@ -9,6 +10,7 @@ import { type DrizzleConfig } from "../utils.js";
9
10
  import { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from "./session.js";
10
11
  export interface NeonDriverOptions {
11
12
  logger?: Logger;
13
+ cache?: Cache;
12
14
  }
13
15
  export declare class NeonHttpDriver {
14
16
  private client;
@@ -15,7 +15,10 @@ class NeonHttpDriver {
15
15
  }
16
16
  static [entityKind] = "NeonHttpDriver";
17
17
  createSession(schema) {
18
- return new NeonHttpSession(this.client, this.dialect, schema, { logger: this.options.logger });
18
+ return new NeonHttpSession(this.client, this.dialect, schema, {
19
+ logger: this.options.logger,
20
+ cache: this.options.cache
21
+ });
19
22
  }
20
23
  initMappers() {
21
24
  types.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);
@@ -81,7 +84,7 @@ function construct(client, config = {}) {
81
84
  tableNamesMap: tablesConfig.tableNamesMap
82
85
  };
83
86
  }
84
- const driver = new NeonHttpDriver(client, dialect, { logger });
87
+ const driver = new NeonHttpDriver(client, dialect, { logger, cache: config.cache });
85
88
  const session = driver.createSession(schema);
86
89
  const db = new NeonHttpDatabase(
87
90
  dialect,
@@ -89,6 +92,10 @@ function construct(client, config = {}) {
89
92
  schema
90
93
  );
91
94
  db.$client = client;
95
+ db.$cache = config.cache;
96
+ if (db.$cache) {
97
+ db.$cache["invalidate"] = config.cache?.onMutate;
98
+ }
92
99
  return db;
93
100
  }
94
101
  function drizzle(...params) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/neon-http/driver.ts"],"sourcesContent":["import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';\nimport { neon, types } from '@neondatabase/serverless';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from './session.ts';\n\nexport interface NeonDriverOptions {\n\tlogger?: Logger;\n}\n\nexport class NeonHttpDriver {\n\tstatic readonly [entityKind]: string = 'NeonHttpDriver';\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NeonDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NeonHttpSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NeonHttpSession(this.client, this.dialect, schema, { logger: this.options.logger });\n\t}\n\n\tinitMappers() {\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\t}\n}\n\nfunction wrap<T extends object>(\n\ttarget: T,\n\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\tcb: (target: any, p: string | symbol, res: any) => any,\n\tdeep?: boolean,\n) {\n\treturn new Proxy(target, {\n\t\tget(target, p) {\n\t\t\tconst element = target[p as keyof typeof p];\n\t\t\tif (typeof element !== 'function' && (typeof element !== 'object' || element === null)) return element;\n\n\t\t\tif (deep) return wrap(element, token, cb);\n\t\t\tif (p === 'query') return wrap(element, token, cb, true);\n\n\t\t\treturn new Proxy(element as any, {\n\t\t\t\tapply(target, thisArg, argArray) {\n\t\t\t\t\tconst res = target.call(thisArg, ...argArray);\n\t\t\t\t\tif (typeof res === 'object' && res !== null && 'setToken' in res && typeof res.setToken === 'function') {\n\t\t\t\t\t\tres.setToken(token);\n\t\t\t\t\t}\n\t\t\t\t\treturn cb(target, p, res);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport class NeonHttpDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonHttpQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpDatabase';\n\n\t$withAuth(\n\t\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\t): Omit<\n\t\tthis,\n\t\tExclude<\n\t\t\tkeyof this,\n\t\t\t| '$count'\n\t\t\t| 'delete'\n\t\t\t| 'select'\n\t\t\t| 'selectDistinct'\n\t\t\t| 'selectDistinctOn'\n\t\t\t| 'update'\n\t\t\t| 'insert'\n\t\t\t| 'with'\n\t\t\t| 'query'\n\t\t\t| 'execute'\n\t\t\t| 'refreshMaterializedView'\n\t\t>\n\t> {\n\t\tthis.authToken = token;\n\n\t\treturn wrap(this, token, (target, p, res) => {\n\t\t\tif (p === 'with') {\n\t\t\t\treturn wrap(res, token, (_, __, res) => res);\n\t\t\t}\n\t\t\treturn res;\n\t\t});\n\t}\n\n\t/** @internal */\n\tdeclare readonly session: NeonHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<any, any>,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NeonHttpDriver(client, dialect, { logger });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new NeonHttpDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,\n\t);\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<false, false>,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ connectionString: string } & HTTPTransactionOptions<boolean, boolean>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = neon(params[0] as string);\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& {\n\t\t\t\tconnection?:\n\t\t\t\t\t| ({\n\t\t\t\t\t\tconnectionString: string;\n\t\t\t\t\t} & HTTPTransactionOptions<boolean, boolean>)\n\t\t\t\t\t| string;\n\t\t\t\tclient?: TClient;\n\t\t\t}\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { connectionString, ...options } = connection;\n\n\t\t\tconst instance = neon(connectionString, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = neon(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NeonHttpDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"],"mappings":"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","names":["target","res","instance","drizzle"]}
1
+ {"version":3,"sources":["../../src/neon-http/driver.ts"],"sourcesContent":["import type { HTTPQueryOptions, HTTPTransactionOptions, NeonQueryFunction } from '@neondatabase/serverless';\nimport { neon, types } from '@neondatabase/serverless';\nimport type { BatchItem, BatchResponse } from '~/batch.ts';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from './session.ts';\n\nexport interface NeonDriverOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class NeonHttpDriver {\n\tstatic readonly [entityKind]: string = 'NeonHttpDriver';\n\n\tconstructor(\n\t\tprivate client: NeonHttpClient,\n\t\tprivate dialect: PgDialect,\n\t\tprivate options: NeonDriverOptions = {},\n\t) {\n\t\tthis.initMappers();\n\t}\n\n\tcreateSession(\n\t\tschema: RelationalSchemaConfig<TablesRelationalConfig> | undefined,\n\t): NeonHttpSession<Record<string, unknown>, TablesRelationalConfig> {\n\t\treturn new NeonHttpSession(this.client, this.dialect, schema, {\n\t\t\tlogger: this.options.logger,\n\t\t\tcache: this.options.cache,\n\t\t});\n\t}\n\n\tinitMappers() {\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMPTZ, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.TIMESTAMP, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.DATE, (val) => val);\n\t\ttypes.setTypeParser(types.builtins.INTERVAL, (val) => val);\n\t}\n}\n\nfunction wrap<T extends object>(\n\ttarget: T,\n\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\tcb: (target: any, p: string | symbol, res: any) => any,\n\tdeep?: boolean,\n) {\n\treturn new Proxy(target, {\n\t\tget(target, p) {\n\t\t\tconst element = target[p as keyof typeof p];\n\t\t\tif (typeof element !== 'function' && (typeof element !== 'object' || element === null)) return element;\n\n\t\t\tif (deep) return wrap(element, token, cb);\n\t\t\tif (p === 'query') return wrap(element, token, cb, true);\n\n\t\t\treturn new Proxy(element as any, {\n\t\t\t\tapply(target, thisArg, argArray) {\n\t\t\t\t\tconst res = target.call(thisArg, ...argArray);\n\t\t\t\t\tif (typeof res === 'object' && res !== null && 'setToken' in res && typeof res.setToken === 'function') {\n\t\t\t\t\t\tres.setToken(token);\n\t\t\t\t\t}\n\t\t\t\t\treturn cb(target, p, res);\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport class NeonHttpDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<NeonHttpQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'NeonHttpDatabase';\n\n\t$withAuth(\n\t\ttoken: Exclude<HTTPQueryOptions<true, true>['authToken'], undefined>,\n\t): Omit<\n\t\tthis,\n\t\tExclude<\n\t\t\tkeyof this,\n\t\t\t| '$count'\n\t\t\t| 'delete'\n\t\t\t| 'select'\n\t\t\t| 'selectDistinct'\n\t\t\t| 'selectDistinctOn'\n\t\t\t| 'update'\n\t\t\t| 'insert'\n\t\t\t| 'with'\n\t\t\t| 'query'\n\t\t\t| 'execute'\n\t\t\t| 'refreshMaterializedView'\n\t\t>\n\t> {\n\t\tthis.authToken = token;\n\n\t\treturn wrap(this, token, (target, p, res) => {\n\t\t\tif (p === 'with') {\n\t\t\t\treturn wrap(res, token, (_, __, res) => res);\n\t\t\t}\n\t\t\treturn res;\n\t\t});\n\t}\n\n\t/** @internal */\n\tdeclare readonly session: NeonHttpSession<TSchema, ExtractTablesWithRelations<TSchema>>;\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(\n\t\tbatch: T,\n\t): Promise<BatchResponse<T>> {\n\t\treturn this.session.batch(batch) as Promise<BatchResponse<T>>;\n\t}\n}\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<any, any>,\n>(\n\tclient: TClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst driver = new NeonHttpDriver(client, dialect, { logger, cache: config.cache });\n\tconst session = driver.createSession(schema);\n\n\tconst db = new NeonHttpDatabase(\n\t\tdialect,\n\t\tsession,\n\t\tschema as RelationalSchemaConfig<ExtractTablesWithRelations<TSchema>> | undefined,\n\t);\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends NeonQueryFunction<any, any> = NeonQueryFunction<false, false>,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ connectionString: string } & HTTPTransactionOptions<boolean, boolean>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): NeonHttpDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = neon(params[0] as string);\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& {\n\t\t\t\tconnection?:\n\t\t\t\t\t| ({\n\t\t\t\t\t\tconnectionString: string;\n\t\t\t\t\t} & HTTPTransactionOptions<boolean, boolean>)\n\t\t\t\t\t| string;\n\t\t\t\tclient?: TClient;\n\t\t\t}\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig);\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { connectionString, ...options } = connection;\n\n\t\t\tconst instance = neon(connectionString, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = neon(connection!);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): NeonHttpDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n"],"mappings":"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","names":["target","res","instance","drizzle"]}