@stratum-hq/db-adapters 0.3.0 → 0.3.1
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__/schema-session.test.d.ts +2 -0
- package/dist/__tests__/schema-session.test.d.ts.map +1 -0
- package/dist/__tests__/schema-session.test.js +23 -0
- package/dist/__tests__/schema-session.test.js.map +1 -0
- package/dist/schema/session.d.ts.map +1 -1
- package/dist/schema/session.js +6 -3
- package/dist/schema/session.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-session.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema-session.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const session_js_1 = require("../schema/session.js");
|
|
5
|
+
function makeClient() {
|
|
6
|
+
const query = vitest_1.vi.fn(async () => ({ rows: [], rowCount: 0 }));
|
|
7
|
+
return { query };
|
|
8
|
+
}
|
|
9
|
+
(0, vitest_1.describe)("setSchemaSearchPath", () => {
|
|
10
|
+
(0, vitest_1.it)("sets the search_path for a valid tenant slug", async () => {
|
|
11
|
+
const client = makeClient();
|
|
12
|
+
await (0, session_js_1.setSchemaSearchPath)(client, "acme_corp_2024");
|
|
13
|
+
(0, vitest_1.expect)(client.query).toHaveBeenCalledWith("SET LOCAL search_path TO tenant_acme_corp_2024, public");
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)("rejects a slug outside the canonical charset before issuing any query", async () => {
|
|
16
|
+
const client = makeClient();
|
|
17
|
+
// Anything with characters outside the slug charset must never reach the
|
|
18
|
+
// search_path statement (the schema name is interpolated, not bound).
|
|
19
|
+
await (0, vitest_1.expect)((0, session_js_1.setSchemaSearchPath)(client, "bad; DROP TABLE tenants--")).rejects.toThrow(/Invalid tenant slug/);
|
|
20
|
+
(0, vitest_1.expect)(client.query).not.toHaveBeenCalled();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=schema-session.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-session.test.js","sourceRoot":"","sources":["../../src/__tests__/schema-session.test.ts"],"names":[],"mappings":";;AAAA,mCAAkD;AAClD,qDAA2D;AAG3D,SAAS,UAAU;IACjB,MAAM,KAAK,GAAG,WAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,KAAK,EAA8B,CAAC;AAC/C,CAAC;AAED,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAA,WAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAA,gCAAmB,EAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACvC,wDAAwD,CACzD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,IAAA,eAAM,EACV,IAAA,gCAAmB,EAAC,MAAM,EAAE,2BAA2B,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/schema/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/schema/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,EAAE,CAAC,UAAU,GACpB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
package/dist/schema/session.js
CHANGED
|
@@ -3,11 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.setSchemaSearchPath = setSchemaSearchPath;
|
|
4
4
|
exports.resetSearchPath = resetSearchPath;
|
|
5
5
|
exports.getCurrentSearchPath = getCurrentSearchPath;
|
|
6
|
+
const core_1 = require("@stratum-hq/core");
|
|
6
7
|
const manager_js_1 = require("./manager.js");
|
|
7
8
|
async function setSchemaSearchPath(client, tenantSlug) {
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
// SET LOCAL only takes effect for the current
|
|
9
|
+
// The schema name is interpolated (identifiers cannot be bound), so the slug
|
|
10
|
+
// must be validated against the canonical slug charset first; validateSlug
|
|
11
|
+
// throws on anything else. SET LOCAL only takes effect for the current
|
|
12
|
+
// transaction.
|
|
13
|
+
const schemaName = (0, manager_js_1.tenantSchemaName)((0, core_1.validateSlug)(tenantSlug));
|
|
11
14
|
await client.query(`SET LOCAL search_path TO ${schemaName}, public`);
|
|
12
15
|
}
|
|
13
16
|
async function resetSearchPath(client) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/schema/session.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/schema/session.ts"],"names":[],"mappings":";;AAIA,kDAUC;AAED,0CAEC;AAED,oDAKC;AAxBD,2CAAgD;AAChD,6CAAgD;AAEzC,KAAK,UAAU,mBAAmB,CACvC,MAAqB,EACrB,UAAkB;IAElB,6EAA6E;IAC7E,2EAA2E;IAC3E,uEAAuE;IACvE,eAAe;IACf,MAAM,UAAU,GAAG,IAAA,6BAAgB,EAAC,IAAA,mBAAY,EAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,MAAM,MAAM,CAAC,KAAK,CAAC,4BAA4B,UAAU,UAAU,CAAC,CAAC;AACvE,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,MAAqB;IACzD,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAC1C,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,MAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAA0B,kBAAkB,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stratum-hq/db-adapters",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Stratum PostgreSQL adapters for tenant-scoped query isolation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"multi-tenancy",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "tsc",
|
|
34
34
|
"test": "vitest run",
|
|
35
|
-
"
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"lint": "eslint .",
|
|
36
37
|
"clean": "rm -rf dist"
|
|
37
38
|
},
|
|
38
39
|
"publishConfig": {
|