@stratum-hq/db-adapters 0.2.1 → 0.2.3
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.
- package/dist/__tests__/pool-manager.test.js +36 -39
- package/dist/__tests__/pool-manager.test.js.map +1 -1
- package/dist/__tests__/sequelize.test.d.ts +2 -0
- package/dist/__tests__/sequelize.test.d.ts.map +1 -0
- package/dist/__tests__/sequelize.test.js +157 -0
- package/dist/__tests__/sequelize.test.js.map +1 -0
- package/dist/adapters/database-raw.js +2 -2
- package/dist/adapters/database-raw.js.map +1 -1
- package/dist/adapters/sequelize.d.ts +25 -0
- package/dist/adapters/sequelize.d.ts.map +1 -0
- package/dist/adapters/sequelize.js +46 -0
- package/dist/adapters/sequelize.js.map +1 -0
- package/dist/database/pool-manager.d.ts +4 -3
- package/dist/database/pool-manager.d.ts.map +1 -1
- package/dist/database/pool-manager.js +19 -6
- package/dist/database/pool-manager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -41,86 +41,83 @@ function makeManager(maxPools = 3) {
|
|
|
41
41
|
mockPoolEnd.mockClear();
|
|
42
42
|
});
|
|
43
43
|
(0, vitest_1.describe)("slug validation", () => {
|
|
44
|
-
(0, vitest_1.it)("rejects slugs starting with a number", () => {
|
|
44
|
+
(0, vitest_1.it)("rejects slugs starting with a number", async () => {
|
|
45
45
|
const mgr = makeManager();
|
|
46
|
-
(0, vitest_1.expect)(
|
|
46
|
+
await (0, vitest_1.expect)(mgr.getPool("123acme")).rejects.toThrow("Invalid tenant slug");
|
|
47
47
|
});
|
|
48
|
-
(0, vitest_1.it)("rejects slugs with uppercase letters", () => {
|
|
48
|
+
(0, vitest_1.it)("rejects slugs with uppercase letters", async () => {
|
|
49
49
|
const mgr = makeManager();
|
|
50
|
-
(0, vitest_1.expect)(
|
|
50
|
+
await (0, vitest_1.expect)(mgr.getPool("Acme")).rejects.toThrow("Invalid tenant slug");
|
|
51
51
|
});
|
|
52
|
-
(0, vitest_1.it)("rejects slugs with hyphens", () => {
|
|
52
|
+
(0, vitest_1.it)("rejects slugs with hyphens", async () => {
|
|
53
53
|
const mgr = makeManager();
|
|
54
|
-
(0, vitest_1.expect)(
|
|
54
|
+
await (0, vitest_1.expect)(mgr.getPool("acme-corp")).rejects.toThrow("Invalid tenant slug");
|
|
55
55
|
});
|
|
56
|
-
(0, vitest_1.it)("rejects slugs with special characters", () => {
|
|
56
|
+
(0, vitest_1.it)("rejects slugs with special characters", async () => {
|
|
57
57
|
const mgr = makeManager();
|
|
58
|
-
(0, vitest_1.expect)(
|
|
58
|
+
await (0, vitest_1.expect)(mgr.getPool("acme; DROP TABLE")).rejects.toThrow("Invalid tenant slug");
|
|
59
59
|
});
|
|
60
|
-
(0, vitest_1.it)("rejects empty slugs", () => {
|
|
60
|
+
(0, vitest_1.it)("rejects empty slugs", async () => {
|
|
61
61
|
const mgr = makeManager();
|
|
62
|
-
(0, vitest_1.expect)(
|
|
62
|
+
await (0, vitest_1.expect)(mgr.getPool("")).rejects.toThrow("Invalid tenant slug");
|
|
63
63
|
});
|
|
64
|
-
(0, vitest_1.it)("accepts valid lowercase slugs with underscores", () => {
|
|
64
|
+
(0, vitest_1.it)("accepts valid lowercase slugs with underscores", async () => {
|
|
65
65
|
const mgr = makeManager();
|
|
66
|
-
(0, vitest_1.expect)(
|
|
66
|
+
await (0, vitest_1.expect)(mgr.getPool("acme_corp")).resolves.toBeDefined();
|
|
67
67
|
});
|
|
68
68
|
});
|
|
69
69
|
(0, vitest_1.describe)("getPool", () => {
|
|
70
|
-
(0, vitest_1.it)("creates a new pool for an unseen tenant slug", () => {
|
|
70
|
+
(0, vitest_1.it)("creates a new pool for an unseen tenant slug", async () => {
|
|
71
71
|
const mgr = makeManager();
|
|
72
|
-
const pool = mgr.getPool("acme");
|
|
72
|
+
const pool = await mgr.getPool("acme");
|
|
73
73
|
(0, vitest_1.expect)(pool).toBeDefined();
|
|
74
74
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(1);
|
|
75
75
|
});
|
|
76
|
-
(0, vitest_1.it)("returns the same pool instance on subsequent calls", () => {
|
|
76
|
+
(0, vitest_1.it)("returns the same pool instance on subsequent calls", async () => {
|
|
77
77
|
const mgr = makeManager();
|
|
78
|
-
const pool1 = mgr.getPool("acme");
|
|
79
|
-
const pool2 = mgr.getPool("acme");
|
|
78
|
+
const pool1 = await mgr.getPool("acme");
|
|
79
|
+
const pool2 = await mgr.getPool("acme");
|
|
80
80
|
(0, vitest_1.expect)(pool1).toBe(pool2);
|
|
81
81
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(1);
|
|
82
82
|
});
|
|
83
|
-
(0, vitest_1.it)("creates separate pools for different slugs", () => {
|
|
83
|
+
(0, vitest_1.it)("creates separate pools for different slugs", async () => {
|
|
84
84
|
const mgr = makeManager();
|
|
85
|
-
const pool1 = mgr.getPool("acme");
|
|
86
|
-
const pool2 = mgr.getPool("globex");
|
|
85
|
+
const pool1 = await mgr.getPool("acme");
|
|
86
|
+
const pool2 = await mgr.getPool("globex");
|
|
87
87
|
(0, vitest_1.expect)(pool1).not.toBe(pool2);
|
|
88
88
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
89
89
|
});
|
|
90
|
-
(0, vitest_1.it)("connects to the correct database name", () => {
|
|
90
|
+
(0, vitest_1.it)("connects to the correct database name", async () => {
|
|
91
91
|
const mgr = makeManager();
|
|
92
|
-
const pool = mgr.getPool("acme");
|
|
92
|
+
const pool = (await mgr.getPool("acme"));
|
|
93
93
|
(0, vitest_1.expect)(pool.database).toBe("stratum_tenant_acme");
|
|
94
94
|
});
|
|
95
95
|
});
|
|
96
96
|
(0, vitest_1.describe)("LRU eviction", () => {
|
|
97
97
|
(0, vitest_1.it)("evicts the least recently used pool when maxPools is exceeded", async () => {
|
|
98
98
|
const mgr = makeManager(2);
|
|
99
|
-
mgr.getPool("tenant_a");
|
|
99
|
+
await mgr.getPool("tenant_a");
|
|
100
100
|
// Small delay to ensure different timestamps
|
|
101
101
|
await new Promise((r) => setTimeout(r, 2));
|
|
102
|
-
mgr.getPool("tenant_b");
|
|
102
|
+
await mgr.getPool("tenant_b");
|
|
103
103
|
// tenant_a is now the LRU entry; adding tenant_c should evict it.
|
|
104
104
|
await new Promise((r) => setTimeout(r, 2));
|
|
105
|
-
mgr.getPool("tenant_c");
|
|
106
|
-
// Allow the async eviction microtask to complete.
|
|
107
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
105
|
+
await mgr.getPool("tenant_c");
|
|
108
106
|
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(1);
|
|
109
107
|
// poolCount should be back to maxPools (2) after eviction.
|
|
110
108
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
111
109
|
});
|
|
112
110
|
(0, vitest_1.it)("updates lastUsed when an existing pool is accessed", async () => {
|
|
113
111
|
const mgr = makeManager(2);
|
|
114
|
-
mgr.getPool("tenant_a");
|
|
112
|
+
await mgr.getPool("tenant_a");
|
|
115
113
|
await new Promise((r) => setTimeout(r, 2));
|
|
116
|
-
mgr.getPool("tenant_b");
|
|
114
|
+
await mgr.getPool("tenant_b");
|
|
117
115
|
await new Promise((r) => setTimeout(r, 2));
|
|
118
116
|
// Re-access tenant_a to make it the most recently used.
|
|
119
|
-
mgr.getPool("tenant_a");
|
|
117
|
+
await mgr.getPool("tenant_a");
|
|
120
118
|
await new Promise((r) => setTimeout(r, 2));
|
|
121
119
|
// Now tenant_b is the LRU; adding tenant_c should evict tenant_b.
|
|
122
|
-
mgr.getPool("tenant_c");
|
|
123
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
120
|
+
await mgr.getPool("tenant_c");
|
|
124
121
|
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(1);
|
|
125
122
|
// tenant_a and tenant_c should remain.
|
|
126
123
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
@@ -129,7 +126,7 @@ function makeManager(maxPools = 3) {
|
|
|
129
126
|
(0, vitest_1.describe)("closePool", () => {
|
|
130
127
|
(0, vitest_1.it)("closes and removes the specified pool", async () => {
|
|
131
128
|
const mgr = makeManager();
|
|
132
|
-
mgr.getPool("acme");
|
|
129
|
+
await mgr.getPool("acme");
|
|
133
130
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(1);
|
|
134
131
|
await mgr.closePool("acme");
|
|
135
132
|
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(1);
|
|
@@ -144,9 +141,9 @@ function makeManager(maxPools = 3) {
|
|
|
144
141
|
(0, vitest_1.describe)("closeAll", () => {
|
|
145
142
|
(0, vitest_1.it)("closes all pools", async () => {
|
|
146
143
|
const mgr = makeManager(10);
|
|
147
|
-
mgr.getPool("a");
|
|
148
|
-
mgr.getPool("b");
|
|
149
|
-
mgr.getPool("c");
|
|
144
|
+
await mgr.getPool("a");
|
|
145
|
+
await mgr.getPool("b");
|
|
146
|
+
await mgr.getPool("c");
|
|
150
147
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(3);
|
|
151
148
|
await mgr.closeAll();
|
|
152
149
|
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(3);
|
|
@@ -163,10 +160,10 @@ function makeManager(maxPools = 3) {
|
|
|
163
160
|
const mgr = makeManager();
|
|
164
161
|
(0, vitest_1.expect)(mgr.getStats()).toEqual({ poolCount: 0, activeConnections: 0 });
|
|
165
162
|
});
|
|
166
|
-
(0, vitest_1.it)("reflects current pool count", () => {
|
|
163
|
+
(0, vitest_1.it)("reflects current pool count", async () => {
|
|
167
164
|
const mgr = makeManager(10);
|
|
168
|
-
mgr.getPool("x");
|
|
169
|
-
mgr.getPool("y");
|
|
165
|
+
await mgr.getPool("x");
|
|
166
|
+
await mgr.getPool("y");
|
|
170
167
|
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
171
168
|
});
|
|
172
169
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/pool-manager.test.ts"],"names":[],"mappings":";;AAAA,mCAAyE;AACzE,iEAAkE;AAElE,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,WAAW,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAEzD,WAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;IACjB,MAAM,IAAI;QACD,QAAQ,CAAS;QACjB,UAAU,GAAG,CAAC,CAAC;QACf,SAAS,GAAG,CAAC,CAAC;QACrB,GAAG,GAAG,WAAW,CAAC;QAElB,YAAY,MAA4B;YACtC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,CAAC;KACF;IACD,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,WAAW,CAAC,QAAQ,GAAG,CAAC;IAC/B,OAAO,IAAI,qCAAmB,CAAC;QAC7B,oBAAoB,EAAE;YACpB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,QAAQ;SACnB;QACD,QAAQ;QACR,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAW,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,sCAAsC,EAAE,
|
|
1
|
+
{"version":3,"file":"pool-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/pool-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sequelize.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const sequelize_js_1 = require("../adapters/sequelize.js");
|
|
5
|
+
const base_adapter_js_1 = require("../base-adapter.js");
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Mock pg
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
class MockPool {
|
|
10
|
+
}
|
|
11
|
+
vitest_1.vi.mock("pg", () => {
|
|
12
|
+
return { default: { Pool: MockPool }, Pool: MockPool };
|
|
13
|
+
});
|
|
14
|
+
function createMockSequelize() {
|
|
15
|
+
const queries = [];
|
|
16
|
+
return {
|
|
17
|
+
queries,
|
|
18
|
+
query: async (sql, options) => {
|
|
19
|
+
queries.push({ sql, options });
|
|
20
|
+
return [[], 0];
|
|
21
|
+
},
|
|
22
|
+
transaction: async (fn) => fn({}),
|
|
23
|
+
addHook: vitest_1.vi.fn(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Tests
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
(0, vitest_1.describe)("SequelizeAdapter", () => {
|
|
30
|
+
let pool;
|
|
31
|
+
let adapter;
|
|
32
|
+
(0, vitest_1.beforeEach)(() => {
|
|
33
|
+
vitest_1.vi.clearAllMocks();
|
|
34
|
+
pool = new MockPool();
|
|
35
|
+
adapter = new sequelize_js_1.SequelizeAdapter(pool);
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)("extends BaseAdapter", () => {
|
|
38
|
+
(0, vitest_1.expect)(adapter).toBeInstanceOf(base_adapter_js_1.BaseAdapter);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.describe)("withTenantScope (method)", () => {
|
|
41
|
+
(0, vitest_1.it)("returns a new wrapped object, not the original instance", () => {
|
|
42
|
+
const mock = createMockSequelize();
|
|
43
|
+
const result = adapter.withTenantScope(mock, () => "tenant-1");
|
|
44
|
+
(0, vitest_1.expect)(result).not.toBe(mock);
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)("returned object exposes query, transaction, and addHook", () => {
|
|
47
|
+
const mock = createMockSequelize();
|
|
48
|
+
const result = adapter.withTenantScope(mock, () => "tenant-1");
|
|
49
|
+
(0, vitest_1.expect)(typeof result.query).toBe("function");
|
|
50
|
+
(0, vitest_1.expect)(typeof result.transaction).toBe("function");
|
|
51
|
+
(0, vitest_1.expect)(typeof result.addHook).toBe("function");
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)("wrapped query calls transaction() and sets set_config inside it", async () => {
|
|
54
|
+
const mock = createMockSequelize();
|
|
55
|
+
const transactionSpy = vitest_1.vi.spyOn(mock, "transaction");
|
|
56
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-abc");
|
|
57
|
+
await wrapped.query("SELECT 1");
|
|
58
|
+
(0, vitest_1.expect)(transactionSpy).toHaveBeenCalledTimes(1);
|
|
59
|
+
(0, vitest_1.expect)(mock.queries).toHaveLength(2);
|
|
60
|
+
(0, vitest_1.expect)(mock.queries[0].sql).toContain("set_config");
|
|
61
|
+
(0, vitest_1.expect)(mock.queries[0].sql).toContain("app.current_tenant_id");
|
|
62
|
+
(0, vitest_1.expect)(mock.queries[1].sql).toBe("SELECT 1");
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)("set_config receives tenant ID as bind parameter", async () => {
|
|
65
|
+
const mock = createMockSequelize();
|
|
66
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-xyz");
|
|
67
|
+
await wrapped.query("SELECT 1");
|
|
68
|
+
(0, vitest_1.expect)(mock.queries[0].options).toMatchObject({ bind: ["tenant-xyz"] });
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)("passes transaction handle to both set_config and the actual query", async () => {
|
|
71
|
+
const fakeT = { id: "fake-transaction" };
|
|
72
|
+
const mock = createMockSequelize();
|
|
73
|
+
mock.transaction = async (fn) => fn(fakeT);
|
|
74
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-1");
|
|
75
|
+
await wrapped.query("SELECT 1");
|
|
76
|
+
(0, vitest_1.expect)(mock.queries[0].options).toMatchObject({ transaction: fakeT });
|
|
77
|
+
(0, vitest_1.expect)(mock.queries[1].options).toMatchObject({ transaction: fakeT });
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)("merges caller-supplied options with transaction handle", async () => {
|
|
80
|
+
const mock = createMockSequelize();
|
|
81
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-1");
|
|
82
|
+
await wrapped.query("SELECT 1", { type: "SELECT" });
|
|
83
|
+
// The actual query (index 1) should carry both caller options and transaction
|
|
84
|
+
(0, vitest_1.expect)(mock.queries[1].options).toMatchObject({ type: "SELECT" });
|
|
85
|
+
(0, vitest_1.expect)(mock.queries[1].options).toHaveProperty("transaction");
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)("reads tenant ID lazily from contextFn on each query call", async () => {
|
|
88
|
+
let currentTenant = "tenant-1";
|
|
89
|
+
const mock = createMockSequelize();
|
|
90
|
+
const wrapped = adapter.withTenantScope(mock, () => currentTenant);
|
|
91
|
+
await wrapped.query("SELECT 1");
|
|
92
|
+
(0, vitest_1.expect)(mock.queries[0].options).toMatchObject({ bind: ["tenant-1"] });
|
|
93
|
+
currentTenant = "tenant-2";
|
|
94
|
+
mock.queries.length = 0;
|
|
95
|
+
await wrapped.query("SELECT 2");
|
|
96
|
+
(0, vitest_1.expect)(mock.queries[0].options).toMatchObject({ bind: ["tenant-2"] });
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)("skips transaction wrapper when contextFn returns empty string", async () => {
|
|
99
|
+
const mock = createMockSequelize();
|
|
100
|
+
const transactionSpy = vitest_1.vi.spyOn(mock, "transaction");
|
|
101
|
+
const wrapped = adapter.withTenantScope(mock, () => "");
|
|
102
|
+
await wrapped.query("SELECT 1");
|
|
103
|
+
(0, vitest_1.expect)(transactionSpy).not.toHaveBeenCalled();
|
|
104
|
+
(0, vitest_1.expect)(mock.queries).toHaveLength(1);
|
|
105
|
+
(0, vitest_1.expect)(mock.queries[0].sql).toBe("SELECT 1");
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)("propagates errors thrown by set_config", async () => {
|
|
108
|
+
const mock = createMockSequelize();
|
|
109
|
+
mock.transaction = async (fn) => fn({});
|
|
110
|
+
mock.query = vitest_1.vi.fn().mockRejectedValueOnce(new Error("set_config failed"));
|
|
111
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-1");
|
|
112
|
+
await (0, vitest_1.expect)(wrapped.query("SELECT 1")).rejects.toThrow("set_config failed");
|
|
113
|
+
});
|
|
114
|
+
(0, vitest_1.it)("delegates transaction() to the original instance", async () => {
|
|
115
|
+
const mock = createMockSequelize();
|
|
116
|
+
const transactionSpy = vitest_1.vi.spyOn(mock, "transaction");
|
|
117
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-1");
|
|
118
|
+
const fn = async (_t) => "result";
|
|
119
|
+
await wrapped.transaction(fn);
|
|
120
|
+
(0, vitest_1.expect)(transactionSpy).toHaveBeenCalledWith(fn);
|
|
121
|
+
});
|
|
122
|
+
(0, vitest_1.it)("delegates addHook() to the original instance", () => {
|
|
123
|
+
const mock = createMockSequelize();
|
|
124
|
+
const wrapped = adapter.withTenantScope(mock, () => "tenant-1");
|
|
125
|
+
const hookFn = vitest_1.vi.fn();
|
|
126
|
+
wrapped.addHook("beforeFind", hookFn);
|
|
127
|
+
(0, vitest_1.expect)(mock.addHook).toHaveBeenCalledWith("beforeFind", hookFn);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.describe)("withTenantScope (convenience function)", () => {
|
|
132
|
+
(0, vitest_1.it)("returns a new wrapped object, not the original instance", () => {
|
|
133
|
+
const mock = createMockSequelize();
|
|
134
|
+
const pool = new MockPool();
|
|
135
|
+
const result = (0, sequelize_js_1.withTenantScope)(mock, () => "tenant-1", pool);
|
|
136
|
+
(0, vitest_1.expect)(result).not.toBe(mock);
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)("wrapped query calls transaction() with set_config", async () => {
|
|
139
|
+
const mock = createMockSequelize();
|
|
140
|
+
const transactionSpy = vitest_1.vi.spyOn(mock, "transaction");
|
|
141
|
+
const pool = new MockPool();
|
|
142
|
+
const wrapped = (0, sequelize_js_1.withTenantScope)(mock, () => "fn-tenant", pool);
|
|
143
|
+
await wrapped.query("SELECT 1");
|
|
144
|
+
(0, vitest_1.expect)(transactionSpy).toHaveBeenCalledTimes(1);
|
|
145
|
+
(0, vitest_1.expect)(mock.queries[0].options).toMatchObject({ bind: ["fn-tenant"] });
|
|
146
|
+
});
|
|
147
|
+
(0, vitest_1.it)("skips transaction when contextFn returns empty string", async () => {
|
|
148
|
+
const mock = createMockSequelize();
|
|
149
|
+
const transactionSpy = vitest_1.vi.spyOn(mock, "transaction");
|
|
150
|
+
const pool = new MockPool();
|
|
151
|
+
const wrapped = (0, sequelize_js_1.withTenantScope)(mock, () => "", pool);
|
|
152
|
+
await wrapped.query("SELECT 1");
|
|
153
|
+
(0, vitest_1.expect)(transactionSpy).not.toHaveBeenCalled();
|
|
154
|
+
(0, vitest_1.expect)(mock.queries).toHaveLength(1);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=sequelize.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize.test.js","sourceRoot":"","sources":["../../src/__tests__/sequelize.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ class DatabaseRawAdapter {
|
|
|
17
17
|
* The connection is acquired and released automatically.
|
|
18
18
|
*/
|
|
19
19
|
async query(tenantSlug, text, values) {
|
|
20
|
-
const pool = this.poolManager.getPool(tenantSlug);
|
|
20
|
+
const pool = await this.poolManager.getPool(tenantSlug);
|
|
21
21
|
const client = await pool.connect();
|
|
22
22
|
try {
|
|
23
23
|
return await client.query(text, values);
|
|
@@ -31,7 +31,7 @@ class DatabaseRawAdapter {
|
|
|
31
31
|
* The transaction is automatically committed on success and rolled back on error.
|
|
32
32
|
*/
|
|
33
33
|
async executeWithTenantContext(tenantSlug, queryFn) {
|
|
34
|
-
const pool = this.poolManager.getPool(tenantSlug);
|
|
34
|
+
const pool = await this.poolManager.getPool(tenantSlug);
|
|
35
35
|
const client = await pool.connect();
|
|
36
36
|
try {
|
|
37
37
|
await client.query("BEGIN");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-raw.js","sourceRoot":"","sources":["../../src/adapters/database-raw.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACH,MAAa,kBAAkB;IACA;IAA7B,YAA6B,WAAgC;QAAhC,gBAAW,GAAX,WAAW,CAAqB;IAAG,CAAC;IAEjE;;;OAGG;IACH,KAAK,CAAC,KAAK,CACT,UAAkB,EAClB,IAAY,EACZ,MAAkB;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"database-raw.js","sourceRoot":"","sources":["../../src/adapters/database-raw.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACH,MAAa,kBAAkB;IACA;IAA7B,YAA6B,WAAgC;QAAhC,gBAAW,GAAX,WAAW,CAAqB;IAAG,CAAC;IAEjE;;;OAGG;IACH,KAAK,CAAC,KAAK,CACT,UAAkB,EAClB,IAAY,EACZ,MAAkB;QAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,KAAK,CAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,wBAAwB,CAC5B,UAAkB,EAClB,OAA8C;QAE9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AA3CD,gDA2CC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseAdapter } from "../base-adapter.js";
|
|
2
|
+
import pg from "pg";
|
|
3
|
+
interface SequelizeLike {
|
|
4
|
+
query(sql: string, options?: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
transaction<T>(fn: (t: unknown) => Promise<T>): Promise<T>;
|
|
6
|
+
addHook(hookName: string, fn: (...args: unknown[]) => void | Promise<void>): void;
|
|
7
|
+
}
|
|
8
|
+
export declare class SequelizeAdapter extends BaseAdapter {
|
|
9
|
+
constructor(pool: pg.Pool);
|
|
10
|
+
/**
|
|
11
|
+
* Returns a proxy-like object wrapping the given Sequelize instance so that
|
|
12
|
+
* every call to `query()` runs inside a transaction where `set_config` is
|
|
13
|
+
* called first. This guarantees that the tenant context and the actual query
|
|
14
|
+
* execute on the same connection, preventing RLS context leaks across
|
|
15
|
+
* connection-pool hops.
|
|
16
|
+
*
|
|
17
|
+
* contextFn should return the current tenant ID (e.g. from AsyncLocalStorage).
|
|
18
|
+
* When contextFn returns an empty string the original query is forwarded
|
|
19
|
+
* without wrapping.
|
|
20
|
+
*/
|
|
21
|
+
withTenantScope(sequelize: SequelizeLike, contextFn: () => string): SequelizeLike;
|
|
22
|
+
}
|
|
23
|
+
export declare function withTenantScope(sequelize: SequelizeLike, contextFn: () => string, pool: pg.Pool): SequelizeLike;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=sequelize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/adapters/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,UAAU,aAAa;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACnF;AAED,qBAAa,gBAAiB,SAAQ,WAAW;gBACnC,IAAI,EAAE,EAAE,CAAC,IAAI;IAIzB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,aAAa;CAuBlF;AAGD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,MAAM,EACvB,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,aAAa,CAGf"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SequelizeAdapter = void 0;
|
|
4
|
+
exports.withTenantScope = withTenantScope;
|
|
5
|
+
const base_adapter_js_1 = require("../base-adapter.js");
|
|
6
|
+
class SequelizeAdapter extends base_adapter_js_1.BaseAdapter {
|
|
7
|
+
constructor(pool) {
|
|
8
|
+
super(pool);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Returns a proxy-like object wrapping the given Sequelize instance so that
|
|
12
|
+
* every call to `query()` runs inside a transaction where `set_config` is
|
|
13
|
+
* called first. This guarantees that the tenant context and the actual query
|
|
14
|
+
* execute on the same connection, preventing RLS context leaks across
|
|
15
|
+
* connection-pool hops.
|
|
16
|
+
*
|
|
17
|
+
* contextFn should return the current tenant ID (e.g. from AsyncLocalStorage).
|
|
18
|
+
* When contextFn returns an empty string the original query is forwarded
|
|
19
|
+
* without wrapping.
|
|
20
|
+
*/
|
|
21
|
+
withTenantScope(sequelize, contextFn) {
|
|
22
|
+
const original = sequelize;
|
|
23
|
+
const wrappedQuery = async (sql, options) => {
|
|
24
|
+
const tenantId = contextFn();
|
|
25
|
+
if (!tenantId) {
|
|
26
|
+
return original.query(sql, options);
|
|
27
|
+
}
|
|
28
|
+
return original.transaction(async (t) => {
|
|
29
|
+
await original.query(`SELECT set_config('app.current_tenant_id', $1, true)`, { bind: [tenantId], transaction: t });
|
|
30
|
+
return original.query(sql, { ...options, transaction: t });
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
query: wrappedQuery,
|
|
35
|
+
transaction: original.transaction.bind(original),
|
|
36
|
+
addHook: original.addHook.bind(original),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.SequelizeAdapter = SequelizeAdapter;
|
|
41
|
+
// Convenience function matching PrismaAdapter's withTenant API shape.
|
|
42
|
+
function withTenantScope(sequelize, contextFn, pool) {
|
|
43
|
+
const adapter = new SequelizeAdapter(pool);
|
|
44
|
+
return adapter.withTenantScope(sequelize, contextFn);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sequelize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize.js","sourceRoot":"","sources":["../../src/adapters/sequelize.ts"],"names":[],"mappings":";;;AAqDA,0CAOC;AA5DD,wDAAiD;AAWjD,MAAa,gBAAiB,SAAQ,6BAAW;IAC/C,YAAY,IAAa;QACvB,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,eAAe,CAAC,SAAwB,EAAE,SAAuB;QAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC;QAE3B,MAAM,YAAY,GAAG,KAAK,EAAE,GAAW,EAAE,OAAiC,EAAE,EAAE;YAC5E,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAU,EAAE,EAAE;gBAC/C,MAAM,QAAQ,CAAC,KAAK,CAClB,sDAAsD,EACtD,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,EAA6B,CAChE,CAAC;gBACF,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,CAAC,EAA6B,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC,CAAC;IACJ,CAAC;CACF;AAvCD,4CAuCC;AAED,sEAAsE;AACtE,SAAgB,eAAe,CAC7B,SAAwB,EACxB,SAAuB,EACvB,IAAa;IAEb,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -28,9 +28,10 @@ export declare class DatabasePoolManager {
|
|
|
28
28
|
* When a regionId is provided, the pool is keyed as `regionId:slug` to support
|
|
29
29
|
* multi-region deployments where the same slug may exist in different regions.
|
|
30
30
|
*/
|
|
31
|
-
getPool(tenantSlug: string, regionId?: string): pg.Pool
|
|
32
|
-
/** Closes and removes the pool for the given tenant slug. No-op if not found.
|
|
33
|
-
|
|
31
|
+
getPool(tenantSlug: string, regionId?: string): Promise<pg.Pool>;
|
|
32
|
+
/** Closes and removes the pool for the given tenant slug. No-op if not found.
|
|
33
|
+
* Accepts either a bare slug or a region-prefixed key (`regionId:slug`). */
|
|
34
|
+
closePool(tenantSlug: string, regionId?: string): Promise<void>;
|
|
34
35
|
/** Closes all managed pools. Call during application shutdown. */
|
|
35
36
|
closeAll(): Promise<void>;
|
|
36
37
|
/** Returns a snapshot of current pool statistics. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool-manager.d.ts","sourceRoot":"","sources":["../../src/database/pool-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,mHAAmH;IACnH,oBAAoB,EAAE,EAAE,CAAC,UAAU,CAAC;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,EAAE,0BAA0B;IAM/C,oEAAoE;IACpE,OAAO,CAAC,YAAY;IAWpB;;;;;;OAMG;
|
|
1
|
+
{"version":3,"file":"pool-manager.d.ts","sourceRoot":"","sources":["../../src/database/pool-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,mHAAmH;IACnH,oBAAoB,EAAE,EAAE,CAAC,UAAU,CAAC;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,EAAE,0BAA0B;IAM/C,oEAAoE;IACpE,OAAO,CAAC,YAAY;IAWpB;;;;;;OAMG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;IAyBtE;gFAC4E;IACtE,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrE,kEAAkE;IAC5D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,qDAAqD;IACrD,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE;IAW5D,sDAAsD;YACxC,QAAQ;CAevB"}
|
|
@@ -37,7 +37,7 @@ class DatabasePoolManager {
|
|
|
37
37
|
* When a regionId is provided, the pool is keyed as `regionId:slug` to support
|
|
38
38
|
* multi-region deployments where the same slug may exist in different regions.
|
|
39
39
|
*/
|
|
40
|
-
getPool(tenantSlug, regionId) {
|
|
40
|
+
async getPool(tenantSlug, regionId) {
|
|
41
41
|
this.validateSlug(tenantSlug);
|
|
42
42
|
const poolKey = regionId ? `${regionId}:${tenantSlug}` : tenantSlug;
|
|
43
43
|
const existing = this.pools.get(poolKey);
|
|
@@ -47,7 +47,7 @@ class DatabasePoolManager {
|
|
|
47
47
|
}
|
|
48
48
|
// Evict before adding so we never exceed maxPools.
|
|
49
49
|
if (this.pools.size >= this.maxPools) {
|
|
50
|
-
|
|
50
|
+
await this.evictLRU();
|
|
51
51
|
}
|
|
52
52
|
const dbName = `stratum_tenant_${tenantSlug}`;
|
|
53
53
|
const pool = new pg_1.default.Pool({
|
|
@@ -58,12 +58,25 @@ class DatabasePoolManager {
|
|
|
58
58
|
this.pools.set(poolKey, { pool, lastUsed: Date.now() });
|
|
59
59
|
return pool;
|
|
60
60
|
}
|
|
61
|
-
/** Closes and removes the pool for the given tenant slug. No-op if not found.
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
/** Closes and removes the pool for the given tenant slug. No-op if not found.
|
|
62
|
+
* Accepts either a bare slug or a region-prefixed key (`regionId:slug`). */
|
|
63
|
+
async closePool(tenantSlug, regionId) {
|
|
64
|
+
const poolKey = regionId ? `${regionId}:${tenantSlug}` : tenantSlug;
|
|
65
|
+
// Also check for any region-prefixed key that ends with this slug when
|
|
66
|
+
// no regionId is provided, so callers don't have to know the prefix.
|
|
67
|
+
let resolvedKey = poolKey;
|
|
68
|
+
if (!this.pools.has(poolKey) && !regionId) {
|
|
69
|
+
for (const key of this.pools.keys()) {
|
|
70
|
+
if (key === tenantSlug || key.endsWith(`:${tenantSlug}`)) {
|
|
71
|
+
resolvedKey = key;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const entry = this.pools.get(resolvedKey);
|
|
64
77
|
if (!entry)
|
|
65
78
|
return;
|
|
66
|
-
this.pools.delete(
|
|
79
|
+
this.pools.delete(resolvedKey);
|
|
67
80
|
await entry.pool.end();
|
|
68
81
|
}
|
|
69
82
|
/** Closes all managed pools. Call during application shutdown. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool-manager.js","sourceRoot":"","sources":["../../src/database/pool-manager.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AAgBpB;;;;;GAKG;AACH,MAAa,mBAAmB;IACb,KAAK,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC1C,UAAU,CAAgB;IAC1B,QAAQ,CAAS;IACjB,aAAa,CAAS;IAEvC,YAAY,OAAmC;QAC7C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC;IACvD,CAAC;IAED,oEAAoE;IAC5D,YAAY,CAAC,IAAY;QAC/B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,iHAAiH,CAC/I,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,UAAkB,EAAE,QAAiB;
|
|
1
|
+
{"version":3,"file":"pool-manager.js","sourceRoot":"","sources":["../../src/database/pool-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,4 +13,5 @@ export { DatabasePoolManager } from "./database/pool-manager.js";
|
|
|
13
13
|
export type { DatabasePoolManagerOptions } from "./database/pool-manager.js";
|
|
14
14
|
export { DatabaseRawAdapter } from "./adapters/database-raw.js";
|
|
15
15
|
export { DatabasePrismaAdapter } from "./adapters/database-prisma.js";
|
|
16
|
+
export { SequelizeAdapter, withTenantScope } from "./adapters/sequelize.js";
|
|
16
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,SAAS,IAAI,kBAAkB,EAC/B,qBAAqB,EACrB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,SAAS,IAAI,kBAAkB,EAC/B,qBAAqB,EACrB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DatabasePrismaAdapter = exports.DatabaseRawAdapter = exports.DatabasePoolManager = exports.dropDatabase = exports.createDatabase = exports.databaseExists = exports.getDatabaseName = exports.migrateTable = exports.createIsolationPolicy = exports.enableRLSMigration = exports.addTenantColumn = exports.getCurrentSearchPath = exports.resetSearchPath = exports.setSchemaSearchPath = exports.tenantSchemaName = exports.replicateTableToSchema = exports.listTenantSchemas = exports.schemaExists = exports.dropSchema = exports.createSchema = exports.getCurrentTenantId = exports.resetTenantContext = exports.setTenantContext = exports.isRLSEnabled = exports.disableRLS = exports.enableRLS = exports.dropPolicy = exports.createPolicy = exports.withSchemaTenant = exports.SchemaPrismaAdapter = exports.createSchemaTenantPool = exports.SchemaRawAdapter = exports.withTenant = exports.PrismaAdapter = exports.createTenantPool = exports.RawAdapter = exports.BaseAdapter = void 0;
|
|
3
|
+
exports.withTenantScope = exports.SequelizeAdapter = exports.DatabasePrismaAdapter = exports.DatabaseRawAdapter = exports.DatabasePoolManager = exports.dropDatabase = exports.createDatabase = exports.databaseExists = exports.getDatabaseName = exports.migrateTable = exports.createIsolationPolicy = exports.enableRLSMigration = exports.addTenantColumn = exports.getCurrentSearchPath = exports.resetSearchPath = exports.setSchemaSearchPath = exports.tenantSchemaName = exports.replicateTableToSchema = exports.listTenantSchemas = exports.schemaExists = exports.dropSchema = exports.createSchema = exports.getCurrentTenantId = exports.resetTenantContext = exports.setTenantContext = exports.isRLSEnabled = exports.disableRLS = exports.enableRLS = exports.dropPolicy = exports.createPolicy = exports.withSchemaTenant = exports.SchemaPrismaAdapter = exports.createSchemaTenantPool = exports.SchemaRawAdapter = exports.withTenant = exports.PrismaAdapter = exports.createTenantPool = exports.RawAdapter = exports.BaseAdapter = void 0;
|
|
4
4
|
var base_adapter_js_1 = require("./base-adapter.js");
|
|
5
5
|
Object.defineProperty(exports, "BaseAdapter", { enumerable: true, get: function () { return base_adapter_js_1.BaseAdapter; } });
|
|
6
6
|
var raw_js_1 = require("./adapters/raw.js");
|
|
@@ -53,4 +53,7 @@ var database_raw_js_1 = require("./adapters/database-raw.js");
|
|
|
53
53
|
Object.defineProperty(exports, "DatabaseRawAdapter", { enumerable: true, get: function () { return database_raw_js_1.DatabaseRawAdapter; } });
|
|
54
54
|
var database_prisma_js_1 = require("./adapters/database-prisma.js");
|
|
55
55
|
Object.defineProperty(exports, "DatabasePrismaAdapter", { enumerable: true, get: function () { return database_prisma_js_1.DatabasePrismaAdapter; } });
|
|
56
|
+
var sequelize_js_1 = require("./adapters/sequelize.js");
|
|
57
|
+
Object.defineProperty(exports, "SequelizeAdapter", { enumerable: true, get: function () { return sequelize_js_1.SequelizeAdapter; } });
|
|
58
|
+
Object.defineProperty(exports, "withTenantScope", { enumerable: true, get: function () { return sequelize_js_1.withTenantScope; } });
|
|
56
59
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAgD;AAAvC,8GAAA,WAAW,OAAA;AAEpB,4CAAiE;AAAxD,oGAAA,UAAU,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AACrC,kDAAiE;AAAxD,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA;AAClC,0DAGkC;AAFhC,iHAAA,gBAAgB,OAAA;AAChB,uHAAA,sBAAsB,OAAA;AAExB,gEAGqC;AAFnC,uHAAA,mBAAmB,OAAA;AACnB,oHAAA,gBAAgB,OAAA;AAGlB,+CAM0B;AALxB,0GAAA,YAAY,OAAA;AACZ,wGAAA,UAAU,OAAA;AACV,uGAAA,SAAS,OAAA;AACT,wGAAA,UAAU,OAAA;AACV,0GAAA,YAAY,OAAA;AAGd,+CAI0B;AAHxB,8GAAA,gBAAgB,OAAA;AAChB,gHAAA,kBAAkB,OAAA;AAClB,gHAAA,kBAAkB,OAAA;AAGpB,kDAO6B;AAN3B,0GAAA,YAAY,OAAA;AACZ,wGAAA,UAAU,OAAA;AACV,0GAAA,YAAY,OAAA;AACZ,+GAAA,iBAAiB,OAAA;AACjB,oHAAA,sBAAsB,OAAA;AACtB,8GAAA,gBAAgB,OAAA;AAGlB,kDAI6B;AAH3B,iHAAA,mBAAmB,OAAA;AACnB,6GAAA,eAAe,OAAA;AACf,kHAAA,oBAAoB,OAAA;AAGtB,+DAKgC;AAJ9B,uHAAA,eAAe,OAAA;AACf,0HAAA,SAAS,OAAsB;AAC/B,6HAAA,qBAAqB,OAAA;AACrB,oHAAA,YAAY,OAAA;AAGd,0BAA0B;AAC1B,oDAK+B;AAJ7B,6GAAA,eAAe,OAAA;AACf,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,0GAAA,YAAY,OAAA;AAGd,8DAAiE;AAAxD,sHAAA,mBAAmB,OAAA;AAG5B,8DAAgE;AAAvD,qHAAA,kBAAkB,OAAA;AAC3B,oEAAsE;AAA7D,2HAAA,qBAAqB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAgD;AAAvC,8GAAA,WAAW,OAAA;AAEpB,4CAAiE;AAAxD,oGAAA,UAAU,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AACrC,kDAAiE;AAAxD,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA;AAClC,0DAGkC;AAFhC,iHAAA,gBAAgB,OAAA;AAChB,uHAAA,sBAAsB,OAAA;AAExB,gEAGqC;AAFnC,uHAAA,mBAAmB,OAAA;AACnB,oHAAA,gBAAgB,OAAA;AAGlB,+CAM0B;AALxB,0GAAA,YAAY,OAAA;AACZ,wGAAA,UAAU,OAAA;AACV,uGAAA,SAAS,OAAA;AACT,wGAAA,UAAU,OAAA;AACV,0GAAA,YAAY,OAAA;AAGd,+CAI0B;AAHxB,8GAAA,gBAAgB,OAAA;AAChB,gHAAA,kBAAkB,OAAA;AAClB,gHAAA,kBAAkB,OAAA;AAGpB,kDAO6B;AAN3B,0GAAA,YAAY,OAAA;AACZ,wGAAA,UAAU,OAAA;AACV,0GAAA,YAAY,OAAA;AACZ,+GAAA,iBAAiB,OAAA;AACjB,oHAAA,sBAAsB,OAAA;AACtB,8GAAA,gBAAgB,OAAA;AAGlB,kDAI6B;AAH3B,iHAAA,mBAAmB,OAAA;AACnB,6GAAA,eAAe,OAAA;AACf,kHAAA,oBAAoB,OAAA;AAGtB,+DAKgC;AAJ9B,uHAAA,eAAe,OAAA;AACf,0HAAA,SAAS,OAAsB;AAC/B,6HAAA,qBAAqB,OAAA;AACrB,oHAAA,YAAY,OAAA;AAGd,0BAA0B;AAC1B,oDAK+B;AAJ7B,6GAAA,eAAe,OAAA;AACf,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,0GAAA,YAAY,OAAA;AAGd,8DAAiE;AAAxD,sHAAA,mBAAmB,OAAA;AAG5B,8DAAgE;AAAvD,qHAAA,kBAAkB,OAAA;AAC3B,oEAAsE;AAA7D,2HAAA,qBAAqB,OAAA;AAC9B,wDAA4E;AAAnE,gHAAA,gBAAgB,OAAA;AAAE,+GAAA,eAAe,OAAA"}
|