@neutron-build/data 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/dist/cache/index.d.ts +14 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +29 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/cache/nucleus.d.ts +46 -0
  8. package/dist/cache/nucleus.d.ts.map +1 -0
  9. package/dist/cache/nucleus.js +50 -0
  10. package/dist/cache/nucleus.js.map +1 -0
  11. package/dist/cache/redis.d.ts +28 -0
  12. package/dist/cache/redis.d.ts.map +1 -0
  13. package/dist/cache/redis.js +52 -0
  14. package/dist/cache/redis.js.map +1 -0
  15. package/dist/config.d.ts +21 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +36 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/db/drizzle.d.ts +23 -0
  20. package/dist/db/drizzle.d.ts.map +1 -0
  21. package/dist/db/drizzle.js +124 -0
  22. package/dist/db/drizzle.js.map +1 -0
  23. package/dist/db/index.d.ts +7 -0
  24. package/dist/db/index.d.ts.map +1 -0
  25. package/dist/db/index.js +32 -0
  26. package/dist/db/index.js.map +1 -0
  27. package/dist/index.d.ts +19 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +19 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/internal/lazy-import.d.ts +2 -0
  32. package/dist/internal/lazy-import.d.ts.map +1 -0
  33. package/dist/internal/lazy-import.js +11 -0
  34. package/dist/internal/lazy-import.js.map +1 -0
  35. package/dist/jobs/index.d.ts +6 -0
  36. package/dist/jobs/index.d.ts.map +1 -0
  37. package/dist/jobs/index.js +5 -0
  38. package/dist/jobs/index.js.map +1 -0
  39. package/dist/queue/bullmq.d.ts +42 -0
  40. package/dist/queue/bullmq.d.ts.map +1 -0
  41. package/dist/queue/bullmq.js +80 -0
  42. package/dist/queue/bullmq.js.map +1 -0
  43. package/dist/queue/index.d.ts +21 -0
  44. package/dist/queue/index.d.ts.map +1 -0
  45. package/dist/queue/index.js +43 -0
  46. package/dist/queue/index.js.map +1 -0
  47. package/dist/ratelimit/index.d.ts +12 -0
  48. package/dist/ratelimit/index.d.ts.map +1 -0
  49. package/dist/ratelimit/index.js +28 -0
  50. package/dist/ratelimit/index.js.map +1 -0
  51. package/dist/realtime/index.d.ts +12 -0
  52. package/dist/realtime/index.d.ts.map +1 -0
  53. package/dist/realtime/index.js +31 -0
  54. package/dist/realtime/index.js.map +1 -0
  55. package/dist/realtime/nucleus.d.ts +33 -0
  56. package/dist/realtime/nucleus.d.ts.map +1 -0
  57. package/dist/realtime/nucleus.js +62 -0
  58. package/dist/realtime/nucleus.js.map +1 -0
  59. package/dist/realtime/redis.d.ts +54 -0
  60. package/dist/realtime/redis.d.ts.map +1 -0
  61. package/dist/realtime/redis.js +138 -0
  62. package/dist/realtime/redis.js.map +1 -0
  63. package/dist/session/index.d.ts +19 -0
  64. package/dist/session/index.d.ts.map +1 -0
  65. package/dist/session/index.js +31 -0
  66. package/dist/session/index.js.map +1 -0
  67. package/dist/session/redis.d.ts +12 -0
  68. package/dist/session/redis.d.ts.map +1 -0
  69. package/dist/session/redis.js +22 -0
  70. package/dist/session/redis.js.map +1 -0
  71. package/dist/storage/index.d.ts +17 -0
  72. package/dist/storage/index.d.ts.map +1 -0
  73. package/dist/storage/index.js +13 -0
  74. package/dist/storage/index.js.map +1 -0
  75. package/dist/storage/nucleus.d.ts +40 -0
  76. package/dist/storage/nucleus.d.ts.map +1 -0
  77. package/dist/storage/nucleus.js +45 -0
  78. package/dist/storage/nucleus.js.map +1 -0
  79. package/dist/storage/s3.d.ts +30 -0
  80. package/dist/storage/s3.d.ts.map +1 -0
  81. package/dist/storage/s3.js +123 -0
  82. package/dist/storage/s3.js.map +1 -0
  83. package/package.json +82 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tyler
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # @neutron-build/data
2
+
3
+ Data layer for Neutron applications.
4
+
5
+ Pluggable cache, session, queue, and storage drivers. Works with Drizzle ORM, Redis, S3, BullMQ, and more.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @neutron-build/data
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```typescript
16
+ import { createS3StorageDriver } from "@neutron-build/data";
17
+ ```
18
+
19
+ ## Documentation
20
+
21
+ [neutron.build](https://neutron.build)
22
+
23
+ ## License
24
+
25
+ MIT
@@ -0,0 +1,14 @@
1
+ export interface CacheClient {
2
+ get(key: string): Promise<string | null>;
3
+ set(key: string, value: string, ttlSec?: number): Promise<void>;
4
+ del(key: string): Promise<void>;
5
+ incr(key: string, ttlSec?: number): Promise<number>;
6
+ }
7
+ export declare class MemoryCacheClient implements CacheClient {
8
+ private store;
9
+ get(key: string): Promise<string | null>;
10
+ set(key: string, value: string, ttlSec?: number): Promise<void>;
11
+ del(key: string): Promise<void>;
12
+ incr(key: string, ttlSec?: number): Promise<number>;
13
+ }
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,KAAK,CAAkC;IAEzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAO1D"}
@@ -0,0 +1,29 @@
1
+ export class MemoryCacheClient {
2
+ store = new Map();
3
+ async get(key) {
4
+ const record = this.store.get(key);
5
+ if (!record) {
6
+ return null;
7
+ }
8
+ if (record.expiresAt !== null && record.expiresAt <= Date.now()) {
9
+ this.store.delete(key);
10
+ return null;
11
+ }
12
+ return record.value;
13
+ }
14
+ async set(key, value, ttlSec) {
15
+ const expiresAt = typeof ttlSec === "number" && ttlSec > 0 ? Date.now() + ttlSec * 1000 : null;
16
+ this.store.set(key, { value, expiresAt });
17
+ }
18
+ async del(key) {
19
+ this.store.delete(key);
20
+ }
21
+ async incr(key, ttlSec) {
22
+ const currentRaw = await this.get(key);
23
+ const current = currentRaw ? Number.parseInt(currentRaw, 10) : 0;
24
+ const next = Number.isFinite(current) ? current + 1 : 1;
25
+ await this.set(key, String(next), ttlSec);
26
+ return next;
27
+ }
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,iBAAiB;IACpB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,SAAS,GACb,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ import type { CacheClient } from "./index.js";
2
+ /**
3
+ * A KV-like interface matching the subset of @neutron-build/nucleus KVModel
4
+ * needed by NucleusCacheClient.
5
+ *
6
+ * We define this locally to avoid a hard dependency on @neutron-build/nucleus
7
+ * from neutron-data (it's a peer dependency).
8
+ */
9
+ export interface NucleusKVLike {
10
+ get(key: string): Promise<string | null>;
11
+ set(key: string, value: string, opts?: {
12
+ ttl?: number;
13
+ namespace?: string;
14
+ }): Promise<void>;
15
+ delete(key: string): Promise<boolean>;
16
+ incr(key: string, amount?: number): Promise<number>;
17
+ expire(key: string, seconds: number): Promise<boolean>;
18
+ }
19
+ export interface NucleusCacheClientOptions {
20
+ /** A KV model instance (from `@neutron-build/nucleus`). */
21
+ kv: NucleusKVLike;
22
+ /** Key prefix for all cache entries (default `"cache:"`). */
23
+ prefix?: string;
24
+ }
25
+ /**
26
+ * CacheClient implementation backed by Nucleus KV.
27
+ *
28
+ * This is a drop-in replacement for `MemoryCacheClient` or `RedisCacheClient`
29
+ * that stores data directly in Nucleus, avoiding the need for a separate
30
+ * Redis instance.
31
+ */
32
+ export declare class NucleusCacheClient implements CacheClient {
33
+ private readonly kv;
34
+ private readonly prefix;
35
+ constructor(options: NucleusCacheClientOptions);
36
+ private key;
37
+ get(key: string): Promise<string | null>;
38
+ set(key: string, value: string, ttlSec?: number): Promise<void>;
39
+ del(key: string): Promise<void>;
40
+ incr(key: string, ttlSec?: number): Promise<number>;
41
+ }
42
+ /**
43
+ * Factory function matching the pattern of `createRedisCacheClient`.
44
+ */
45
+ export declare function createNucleusCacheClient(options: NucleusCacheClientOptions): NucleusCacheClient;
46
+ //# sourceMappingURL=nucleus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nucleus.d.ts","sourceRoot":"","sources":["../../src/cache/nucleus.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,yBAAyB;IACxC,2DAA2D;IAC3D,EAAE,EAAE,aAAa,CAAC;IAClB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,yBAAyB;IAK9C,OAAO,CAAC,GAAG;IAIL,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQ1D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAE/F"}
@@ -0,0 +1,50 @@
1
+ // ---------------------------------------------------------------------------
2
+ // CacheClient backed by Nucleus KV model
3
+ // ---------------------------------------------------------------------------
4
+ //
5
+ // When the application connects to Nucleus (instead of Redis), this adapter
6
+ // bridges neutron-data's CacheClient interface to the KV model's SQL functions.
7
+ // ---------------------------------------------------------------------------
8
+ /**
9
+ * CacheClient implementation backed by Nucleus KV.
10
+ *
11
+ * This is a drop-in replacement for `MemoryCacheClient` or `RedisCacheClient`
12
+ * that stores data directly in Nucleus, avoiding the need for a separate
13
+ * Redis instance.
14
+ */
15
+ export class NucleusCacheClient {
16
+ kv;
17
+ prefix;
18
+ constructor(options) {
19
+ this.kv = options.kv;
20
+ this.prefix = options.prefix ?? "cache:";
21
+ }
22
+ key(k) {
23
+ return `${this.prefix}${k}`;
24
+ }
25
+ async get(key) {
26
+ return this.kv.get(this.key(key));
27
+ }
28
+ async set(key, value, ttlSec) {
29
+ const opts = ttlSec && ttlSec > 0 ? { ttl: ttlSec } : undefined;
30
+ await this.kv.set(this.key(key), value, opts);
31
+ }
32
+ async del(key) {
33
+ await this.kv.delete(this.key(key));
34
+ }
35
+ async incr(key, ttlSec) {
36
+ const k = this.key(key);
37
+ const next = await this.kv.incr(k);
38
+ if (ttlSec && ttlSec > 0) {
39
+ await this.kv.expire(k, ttlSec);
40
+ }
41
+ return next;
42
+ }
43
+ }
44
+ /**
45
+ * Factory function matching the pattern of `createRedisCacheClient`.
46
+ */
47
+ export function createNucleusCacheClient(options) {
48
+ return new NucleusCacheClient(options);
49
+ }
50
+ //# sourceMappingURL=nucleus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/cache/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AA0B9E;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACZ,EAAE,CAAgB;IAClB,MAAM,CAAS;IAEhC,YAAY,OAAkC;QAC5C,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC3C,CAAC;IAEO,GAAG,CAAC,CAAS;QACnB,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { CacheClient } from "./index.js";
2
+ export interface RedisCacheClientOptions {
3
+ url?: string;
4
+ keyPrefix?: string;
5
+ connectTimeoutMs?: number;
6
+ }
7
+ interface RedisLikeClient {
8
+ get(key: string): Promise<string | null>;
9
+ set(key: string, value: string, mode?: "EX", ttlSec?: number): Promise<unknown>;
10
+ del(key: string): Promise<unknown>;
11
+ incr(key: string): Promise<number>;
12
+ expire(key: string, ttlSec: number): Promise<unknown>;
13
+ quit(): Promise<unknown>;
14
+ }
15
+ export declare class RedisCacheClient implements CacheClient {
16
+ private readonly client;
17
+ private readonly keyPrefix;
18
+ constructor(client: RedisLikeClient, keyPrefix: string);
19
+ get(key: string): Promise<string | null>;
20
+ set(key: string, value: string, ttlSec?: number): Promise<void>;
21
+ del(key: string): Promise<void>;
22
+ incr(key: string, ttlSec?: number): Promise<number>;
23
+ close(): Promise<void>;
24
+ private key;
25
+ }
26
+ export declare function createRedisCacheClient(options?: RedisCacheClientOptions): Promise<RedisCacheClient>;
27
+ export {};
28
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAEhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM;IAG9B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,GAAG;CAGZ;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAmB3B"}
@@ -0,0 +1,52 @@
1
+ import { lazyImport } from "../internal/lazy-import.js";
2
+ export class RedisCacheClient {
3
+ client;
4
+ keyPrefix;
5
+ constructor(client, keyPrefix) {
6
+ this.client = client;
7
+ this.keyPrefix = keyPrefix;
8
+ }
9
+ async get(key) {
10
+ return await this.client.get(this.key(key));
11
+ }
12
+ async set(key, value, ttlSec) {
13
+ const fullKey = this.key(key);
14
+ if (typeof ttlSec === "number" && ttlSec > 0) {
15
+ await this.client.set(fullKey, value, "EX", ttlSec);
16
+ return;
17
+ }
18
+ await this.client.set(fullKey, value);
19
+ }
20
+ async del(key) {
21
+ await this.client.del(this.key(key));
22
+ }
23
+ async incr(key, ttlSec) {
24
+ const fullKey = this.key(key);
25
+ const value = await this.client.incr(fullKey);
26
+ if (typeof ttlSec === "number" && ttlSec > 0 && value === 1) {
27
+ await this.client.expire(fullKey, ttlSec);
28
+ }
29
+ return value;
30
+ }
31
+ async close() {
32
+ await this.client.quit();
33
+ }
34
+ key(key) {
35
+ return this.keyPrefix ? `${this.keyPrefix}${key}` : key;
36
+ }
37
+ }
38
+ export async function createRedisCacheClient(options = {}) {
39
+ const redisModule = await lazyImport("ioredis", "Install with `pnpm add ioredis` (or npm/yarn equivalent)");
40
+ const RedisCtor = redisModule.default;
41
+ if (!RedisCtor) {
42
+ throw new Error("Failed to resolve ioredis default export.");
43
+ }
44
+ const url = options.url || process.env.DRAGONFLY_URL || process.env.REDIS_URL || "redis://127.0.0.1:6379";
45
+ const client = new RedisCtor(url, {
46
+ lazyConnect: false,
47
+ maxRetriesPerRequest: 3,
48
+ connectTimeout: options.connectTimeoutMs ?? 10000,
49
+ });
50
+ return new RedisCacheClient(client, options.keyPrefix || "");
51
+ }
52
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAiBxD,MAAM,OAAO,gBAAgB;IAER;IACA;IAFnB,YACmB,MAAuB,EACvB,SAAiB;QADjB,WAAM,GAAN,MAAM,CAAiB;QACvB,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAmC,EAAE;IAErC,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,SAAS,EACT,0DAA0D,CAC3D,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;QAChC,WAAW,EAAE,KAAK;QAClB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;KAClD,CAAC,CAAC;IAEH,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type DatabaseProvider = "sqlite" | "postgres" | "nucleus";
2
+ export interface DataConfigInput {
3
+ database?: DatabaseProvider;
4
+ sqlitePath?: string;
5
+ postgresUrlEnv?: string;
6
+ /**
7
+ * Environment variable holding the Nucleus server URL.
8
+ * When `database` is `"nucleus"` (or auto-detected), this is used to
9
+ * configure the `@neutron-build/nucleus` client transport.
10
+ * Defaults to `"NUCLEUS_URL"`, falling back to the Postgres URL env var.
11
+ */
12
+ nucleusUrlEnv?: string;
13
+ }
14
+ export interface ResolvedDataConfig {
15
+ database: DatabaseProvider;
16
+ sqlitePath: string;
17
+ postgresUrlEnv: string;
18
+ nucleusUrlEnv: string;
19
+ }
20
+ export declare function resolveDataConfig(input?: DataConfigInput): ResolvedDataConfig;
21
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,eAAoB,GAAG,kBAAkB,CAiCjF"}
package/dist/config.js ADDED
@@ -0,0 +1,36 @@
1
+ const DEFAULT_SQLITE_PATH = ".neutron/dev.db";
2
+ const DEFAULT_POSTGRES_URL_ENV = "DATABASE_URL";
3
+ const DEFAULT_NUCLEUS_URL_ENV = "NUCLEUS_URL";
4
+ export function resolveDataConfig(input = {}) {
5
+ const postgresUrlEnv = input.postgresUrlEnv || DEFAULT_POSTGRES_URL_ENV;
6
+ const sqlitePath = input.sqlitePath || DEFAULT_SQLITE_PATH;
7
+ const nucleusUrlEnv = input.nucleusUrlEnv || DEFAULT_NUCLEUS_URL_ENV;
8
+ if (input.database) {
9
+ return {
10
+ database: input.database,
11
+ sqlitePath,
12
+ postgresUrlEnv,
13
+ nucleusUrlEnv,
14
+ };
15
+ }
16
+ // Auto-detect: check for Nucleus URL first, then Postgres, then SQLite.
17
+ const hasNucleusUrl = Boolean(process.env[nucleusUrlEnv]);
18
+ const hasPostgresUrl = Boolean(process.env[postgresUrlEnv]);
19
+ let database;
20
+ if (hasNucleusUrl) {
21
+ database = "nucleus";
22
+ }
23
+ else if (hasPostgresUrl) {
24
+ database = "postgres";
25
+ }
26
+ else {
27
+ database = "sqlite";
28
+ }
29
+ return {
30
+ database,
31
+ sqlitePath,
32
+ postgresUrlEnv,
33
+ nucleusUrlEnv,
34
+ };
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsBA,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAChD,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE;IAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,wBAAwB,CAAC;IACxE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,uBAAuB,CAAC;IAErE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU;YACV,cAAc;YACd,aAAa;SACd,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE5D,IAAI,QAA0B,CAAC;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,QAAQ,CAAC;IACtB,CAAC;IAED,OAAO;QACL,QAAQ;QACR,UAAU;QACV,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { DataConfigInput } from "../config.js";
2
+ import { type DatabaseProfile } from "./index.js";
3
+ export interface DrizzleDatabaseOptions {
4
+ profile?: DatabaseProfile;
5
+ config?: DataConfigInput;
6
+ schema?: Record<string, unknown>;
7
+ }
8
+ export interface DrizzleDatabase {
9
+ profile: DatabaseProfile;
10
+ client: unknown;
11
+ db: unknown;
12
+ /**
13
+ * When connected to Nucleus, this holds the `@neutron-build/nucleus` client
14
+ * builder return value after `.connect()`. You can use it to access
15
+ * non-relational models (KV, Vector, Graph, etc.).
16
+ *
17
+ * `null` when connected to plain Postgres or SQLite.
18
+ */
19
+ nucleus: unknown | null;
20
+ close: () => Promise<void>;
21
+ }
22
+ export declare function createDrizzleDatabase(options?: DrizzleDatabaseOptions): Promise<DrizzleDatabase>;
23
+ //# sourceMappingURL=drizzle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/db/drizzle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAG1E,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ;;;;;;OAMG;IACH,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,CAAC,CAY1B"}
@@ -0,0 +1,124 @@
1
+ import * as path from "node:path";
2
+ import { resolveDatabaseProfile } from "./index.js";
3
+ import { lazyImport } from "../internal/lazy-import.js";
4
+ export async function createDrizzleDatabase(options = {}) {
5
+ const profile = options.profile || resolveDatabaseProfile(options.config);
6
+ if (profile.provider === "nucleus") {
7
+ return await createNucleusDrizzle(profile, options.schema);
8
+ }
9
+ if (profile.provider === "postgres") {
10
+ return await createPostgresDrizzle(profile, options.schema);
11
+ }
12
+ return await createSqliteDrizzle(profile, options.schema);
13
+ }
14
+ /**
15
+ * Create a Drizzle database backed by Nucleus.
16
+ *
17
+ * Since Nucleus speaks the PostgreSQL wire protocol, we reuse the same
18
+ * `postgres` driver for Drizzle ORM. In addition, we create a Nucleus
19
+ * client to provide access to non-relational data models.
20
+ */
21
+ async function createNucleusDrizzle(profile, schema) {
22
+ // Use the same postgres driver — Nucleus speaks pgwire
23
+ const postgresModule = await lazyImport("postgres", "Install with `pnpm add postgres drizzle-orm` (or npm/yarn equivalent)");
24
+ const drizzleModule = await lazyImport("drizzle-orm/postgres-js", "Install with `pnpm add drizzle-orm` (or npm/yarn equivalent)");
25
+ if (!postgresModule.default || !drizzleModule.drizzle) {
26
+ throw new Error("Failed to initialize Nucleus Drizzle client.");
27
+ }
28
+ const sqlClient = postgresModule.default(profile.connectionString, {
29
+ max: 10,
30
+ idle_timeout: 20,
31
+ connect_timeout: 10,
32
+ });
33
+ const db = schema
34
+ ? drizzleModule.drizzle(sqlClient, { schema })
35
+ : drizzleModule.drizzle(sqlClient);
36
+ // Optionally create the Nucleus multi-model client.
37
+ // This uses `@neutron-build/nucleus` which may not be installed in every project.
38
+ let nucleus = null;
39
+ try {
40
+ const nucleusModule = await lazyImport("@neutron-build/nucleus", "@neutron-build/nucleus is optional for multi-model features");
41
+ if (nucleusModule.createClient) {
42
+ nucleus = await nucleusModule.createClient({
43
+ url: profile.connectionString,
44
+ }).connect();
45
+ }
46
+ }
47
+ catch {
48
+ // @neutron-build/nucleus not installed — Drizzle-only mode is fine.
49
+ nucleus = null;
50
+ }
51
+ return {
52
+ profile,
53
+ client: sqlClient,
54
+ db,
55
+ nucleus,
56
+ close: async () => {
57
+ if (nucleus && typeof nucleus.close === "function") {
58
+ await nucleus.close();
59
+ }
60
+ if (typeof sqlClient.end === "function") {
61
+ await sqlClient.end();
62
+ }
63
+ },
64
+ };
65
+ }
66
+ async function createPostgresDrizzle(profile, schema) {
67
+ const postgresModule = await lazyImport("postgres", "Install with `pnpm add postgres drizzle-orm` (or npm/yarn equivalent)");
68
+ const drizzleModule = await lazyImport("drizzle-orm/postgres-js", "Install with `pnpm add drizzle-orm` (or npm/yarn equivalent)");
69
+ if (!postgresModule.default || !drizzleModule.drizzle) {
70
+ throw new Error("Failed to initialize Postgres Drizzle client.");
71
+ }
72
+ const sqlClient = postgresModule.default(profile.connectionString, {
73
+ max: 10,
74
+ idle_timeout: 20,
75
+ connect_timeout: 10,
76
+ });
77
+ const db = schema
78
+ ? drizzleModule.drizzle(sqlClient, { schema })
79
+ : drizzleModule.drizzle(sqlClient);
80
+ return {
81
+ profile,
82
+ client: sqlClient,
83
+ db,
84
+ nucleus: null,
85
+ close: async () => {
86
+ if (typeof sqlClient.end === "function") {
87
+ await sqlClient.end();
88
+ }
89
+ },
90
+ };
91
+ }
92
+ async function createSqliteDrizzle(profile, schema) {
93
+ const libsqlModule = await lazyImport("@libsql/client", "Install with `pnpm add @libsql/client drizzle-orm` (or npm/yarn equivalent)");
94
+ const drizzleModule = await lazyImport("drizzle-orm/libsql", "Install with `pnpm add drizzle-orm` (or npm/yarn equivalent)");
95
+ if (!libsqlModule.createClient || !drizzleModule.drizzle) {
96
+ throw new Error("Failed to initialize SQLite Drizzle client.");
97
+ }
98
+ const url = normalizeSqliteConnection(profile.connectionString);
99
+ const client = libsqlModule.createClient({ url });
100
+ const db = schema ? drizzleModule.drizzle(client, { schema }) : drizzleModule.drizzle(client);
101
+ return {
102
+ profile,
103
+ client,
104
+ db,
105
+ nucleus: null,
106
+ close: async () => {
107
+ const maybeClose = client.close;
108
+ if (typeof maybeClose === "function") {
109
+ await maybeClose.call(client);
110
+ }
111
+ },
112
+ };
113
+ }
114
+ function normalizeSqliteConnection(connectionString) {
115
+ if (connectionString.startsWith("file:") ||
116
+ connectionString.startsWith("libsql:") ||
117
+ connectionString.startsWith("http://") ||
118
+ connectionString.startsWith("https://")) {
119
+ return connectionString;
120
+ }
121
+ const absolute = path.resolve(connectionString);
122
+ return `file:${absolute}`;
123
+ }
124
+ //# sourceMappingURL=drizzle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/db/drizzle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type DataConfigInput, type DatabaseProvider } from "../config.js";
2
+ export interface DatabaseProfile {
3
+ provider: DatabaseProvider;
4
+ connectionString: string;
5
+ }
6
+ export declare function resolveDatabaseProfile(input?: DataConfigInput): DatabaseProfile;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,eAAoB,GAAG,eAAe,CAsCnF"}
@@ -0,0 +1,32 @@
1
+ import { resolveDataConfig } from "../config.js";
2
+ export function resolveDatabaseProfile(input = {}) {
3
+ const resolved = resolveDataConfig(input);
4
+ if (resolved.database === "sqlite") {
5
+ return {
6
+ provider: "sqlite",
7
+ connectionString: resolved.sqlitePath,
8
+ };
9
+ }
10
+ if (resolved.database === "nucleus") {
11
+ // Nucleus uses its own URL env var. Falls back to the Postgres URL if
12
+ // the Nucleus-specific var is not set (Nucleus speaks pgwire).
13
+ const connectionString = process.env[resolved.nucleusUrlEnv] ?? process.env[resolved.postgresUrlEnv];
14
+ if (!connectionString) {
15
+ throw new Error(`Nucleus profile selected but neither ${resolved.nucleusUrlEnv} nor ${resolved.postgresUrlEnv} is set.`);
16
+ }
17
+ return {
18
+ provider: "nucleus",
19
+ connectionString,
20
+ };
21
+ }
22
+ // postgres
23
+ const connectionString = process.env[resolved.postgresUrlEnv];
24
+ if (!connectionString) {
25
+ throw new Error(`Postgres profile selected but ${resolved.postgresUrlEnv} is not set.`);
26
+ }
27
+ return {
28
+ provider: "postgres",
29
+ connectionString,
30
+ };
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+C,MAAM,cAAc,CAAC;AAO9F,MAAM,UAAU,sBAAsB,CAAC,QAAyB,EAAE;IAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EAAE,QAAQ,CAAC,UAAU;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,sEAAsE;QACtE,+DAA+D;QAC/D,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wCAAwC,QAAQ,CAAC,aAAa,QAAQ,QAAQ,CAAC,cAAc,UAAU,CACxG,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,WAAW;IACX,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,CAAC,cAAc,cAAc,CACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export { resolveDataConfig, type DataConfigInput, type ResolvedDataConfig, type DatabaseProvider, } from "./config.js";
2
+ export { resolveDatabaseProfile, type DatabaseProfile, } from "./db/index.js";
3
+ export { createDrizzleDatabase, type DrizzleDatabase, type DrizzleDatabaseOptions, } from "./db/drizzle.js";
4
+ export { MemoryCacheClient, type CacheClient, } from "./cache/index.js";
5
+ export { RedisCacheClient, createRedisCacheClient, type RedisCacheClientOptions, } from "./cache/redis.js";
6
+ export { NucleusCacheClient, createNucleusCacheClient, type NucleusCacheClientOptions, type NucleusKVLike, } from "./cache/nucleus.js";
7
+ export { createSessionStore, type SessionData, type SessionRecord, type SessionStore, type SessionStoreOptions, } from "./session/index.js";
8
+ export { createRedisSessionStore, type RedisSessionStore, type RedisSessionStoreOptions, } from "./session/redis.js";
9
+ export { enforceSlidingWindow, type SlidingWindowOptions, type SlidingWindowResult, } from "./ratelimit/index.js";
10
+ export { InMemoryQueueDriver, type QueueDriver, type Job, type JobHandler, } from "./queue/index.js";
11
+ export { BullMqQueueDriver, createBullMqQueueDriver, type BullMqQueueDriverOptions, } from "./queue/bullmq.js";
12
+ export { createJobs, type JobsOptions, } from "./jobs/index.js";
13
+ export { InMemoryStorageDriver, type StorageDriver, type StorageObject, } from "./storage/index.js";
14
+ export { S3StorageDriver, createS3StorageDriver, type S3StorageDriverOptions, } from "./storage/s3.js";
15
+ export { NucleusStorageDriver, createNucleusStorageDriver, type NucleusStorageDriverOptions, type NucleusBlobLike, } from "./storage/nucleus.js";
16
+ export { InMemoryRealtimeBus, type RealtimeBus, } from "./realtime/index.js";
17
+ export { RedisRealtimeBus, createRedisRealtimeBus, type RedisRealtimeBusOptions, } from "./realtime/redis.js";
18
+ export { NucleusRealtimeBus, createNucleusRealtimeBus, type NucleusRealtimeBusOptions, type NucleusPubSubLike, } from "./realtime/nucleus.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,EACV,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,2BAA2B,EAChC,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ export { resolveDataConfig, } from "./config.js";
2
+ export { resolveDatabaseProfile, } from "./db/index.js";
3
+ export { createDrizzleDatabase, } from "./db/drizzle.js";
4
+ export { MemoryCacheClient, } from "./cache/index.js";
5
+ export { RedisCacheClient, createRedisCacheClient, } from "./cache/redis.js";
6
+ export { NucleusCacheClient, createNucleusCacheClient, } from "./cache/nucleus.js";
7
+ export { createSessionStore, } from "./session/index.js";
8
+ export { createRedisSessionStore, } from "./session/redis.js";
9
+ export { enforceSlidingWindow, } from "./ratelimit/index.js";
10
+ export { InMemoryQueueDriver, } from "./queue/index.js";
11
+ export { BullMqQueueDriver, createBullMqQueueDriver, } from "./queue/bullmq.js";
12
+ export { createJobs, } from "./jobs/index.js";
13
+ export { InMemoryStorageDriver, } from "./storage/index.js";
14
+ export { S3StorageDriver, createS3StorageDriver, } from "./storage/s3.js";
15
+ export { NucleusStorageDriver, createNucleusStorageDriver, } from "./storage/nucleus.js";
16
+ export { InMemoryRealtimeBus, } from "./realtime/index.js";
17
+ export { RedisRealtimeBus, createRedisRealtimeBus, } from "./realtime/redis.js";
18
+ export { NucleusRealtimeBus, createNucleusRealtimeBus, } from "./realtime/nucleus.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAIlB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,kBAAkB,GAKnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,GAIpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,GAEX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAG3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,uBAAuB,CAAC"}