@stratum-hq/db-adapters 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.
- package/dist/__tests__/base-adapter.test.d.ts +2 -0
- package/dist/__tests__/base-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/base-adapter.test.js +194 -0
- package/dist/__tests__/base-adapter.test.js.map +1 -0
- package/dist/__tests__/database-manager.test.d.ts +2 -0
- package/dist/__tests__/database-manager.test.d.ts.map +1 -0
- package/dist/__tests__/database-manager.test.js +110 -0
- package/dist/__tests__/database-manager.test.js.map +1 -0
- package/dist/__tests__/pool-manager.test.d.ts +2 -0
- package/dist/__tests__/pool-manager.test.d.ts.map +1 -0
- package/dist/__tests__/pool-manager.test.js +174 -0
- package/dist/__tests__/pool-manager.test.js.map +1 -0
- package/dist/__tests__/rls-manager.test.d.ts +2 -0
- package/dist/__tests__/rls-manager.test.d.ts.map +1 -0
- package/dist/__tests__/rls-manager.test.js +180 -0
- package/dist/__tests__/rls-manager.test.js.map +1 -0
- package/dist/__tests__/rls-session.test.d.ts +2 -0
- package/dist/__tests__/rls-session.test.d.ts.map +1 -0
- package/dist/__tests__/rls-session.test.js +102 -0
- package/dist/__tests__/rls-session.test.js.map +1 -0
- package/dist/__tests__/schema-manager.test.d.ts +2 -0
- package/dist/__tests__/schema-manager.test.d.ts.map +1 -0
- package/dist/__tests__/schema-manager.test.js +116 -0
- package/dist/__tests__/schema-manager.test.js.map +1 -0
- package/dist/adapters/database-prisma.d.ts +50 -0
- package/dist/adapters/database-prisma.d.ts.map +1 -0
- package/dist/adapters/database-prisma.js +66 -0
- package/dist/adapters/database-prisma.js.map +1 -0
- package/dist/adapters/database-raw.d.ts +23 -0
- package/dist/adapters/database-raw.d.ts.map +1 -0
- package/dist/adapters/database-raw.js +52 -0
- package/dist/adapters/database-raw.js.map +1 -0
- package/dist/adapters/prisma.d.ts +14 -0
- package/dist/adapters/prisma.d.ts.map +1 -0
- package/dist/adapters/prisma.js +29 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/raw.d.ts +8 -0
- package/dist/adapters/raw.d.ts.map +1 -0
- package/dist/adapters/raw.js +26 -0
- package/dist/adapters/raw.js.map +1 -0
- package/dist/adapters/schema-prisma.d.ts +11 -0
- package/dist/adapters/schema-prisma.d.ts.map +1 -0
- package/dist/adapters/schema-prisma.js +35 -0
- package/dist/adapters/schema-prisma.js.map +1 -0
- package/dist/adapters/schema-raw.d.ts +13 -0
- package/dist/adapters/schema-raw.d.ts.map +1 -0
- package/dist/adapters/schema-raw.js +63 -0
- package/dist/adapters/schema-raw.js.map +1 -0
- package/dist/base-adapter.d.ts +7 -0
- package/dist/base-adapter.d.ts.map +1 -0
- package/dist/base-adapter.js +32 -0
- package/dist/base-adapter.js.map +1 -0
- package/dist/database/manager.d.ts +27 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.js +68 -0
- package/dist/database/manager.js.map +1 -0
- package/dist/database/pool-manager.d.ts +44 -0
- package/dist/database/pool-manager.d.ts.map +1 -0
- package/dist/database/pool-manager.js +102 -0
- package/dist/database/pool-manager.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/migration-helpers.d.ts +6 -0
- package/dist/migration-helpers.d.ts.map +1 -0
- package/dist/migration-helpers.js +34 -0
- package/dist/migration-helpers.js.map +1 -0
- package/dist/rls/manager.d.ts +7 -0
- package/dist/rls/manager.d.ts.map +1 -0
- package/dist/rls/manager.js +46 -0
- package/dist/rls/manager.js.map +1 -0
- package/dist/rls/session.d.ts +5 -0
- package/dist/rls/session.d.ts.map +1 -0
- package/dist/rls/session.js +18 -0
- package/dist/rls/session.js.map +1 -0
- package/dist/schema/manager.d.ts +8 -0
- package/dist/schema/manager.d.ts.map +1 -0
- package/dist/schema/manager.js +49 -0
- package/dist/schema/manager.js.map +1 -0
- package/dist/schema/session.d.ts +5 -0
- package/dist/schema/session.d.ts.map +1 -0
- package/dist/schema/session.js +21 -0
- package/dist/schema/session.js.map +1 -0
- package/package.json +38 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
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;
|
|
4
|
+
var base_adapter_js_1 = require("./base-adapter.js");
|
|
5
|
+
Object.defineProperty(exports, "BaseAdapter", { enumerable: true, get: function () { return base_adapter_js_1.BaseAdapter; } });
|
|
6
|
+
var raw_js_1 = require("./adapters/raw.js");
|
|
7
|
+
Object.defineProperty(exports, "RawAdapter", { enumerable: true, get: function () { return raw_js_1.RawAdapter; } });
|
|
8
|
+
Object.defineProperty(exports, "createTenantPool", { enumerable: true, get: function () { return raw_js_1.createTenantPool; } });
|
|
9
|
+
var prisma_js_1 = require("./adapters/prisma.js");
|
|
10
|
+
Object.defineProperty(exports, "PrismaAdapter", { enumerable: true, get: function () { return prisma_js_1.PrismaAdapter; } });
|
|
11
|
+
Object.defineProperty(exports, "withTenant", { enumerable: true, get: function () { return prisma_js_1.withTenant; } });
|
|
12
|
+
var schema_raw_js_1 = require("./adapters/schema-raw.js");
|
|
13
|
+
Object.defineProperty(exports, "SchemaRawAdapter", { enumerable: true, get: function () { return schema_raw_js_1.SchemaRawAdapter; } });
|
|
14
|
+
Object.defineProperty(exports, "createSchemaTenantPool", { enumerable: true, get: function () { return schema_raw_js_1.createSchemaTenantPool; } });
|
|
15
|
+
var schema_prisma_js_1 = require("./adapters/schema-prisma.js");
|
|
16
|
+
Object.defineProperty(exports, "SchemaPrismaAdapter", { enumerable: true, get: function () { return schema_prisma_js_1.SchemaPrismaAdapter; } });
|
|
17
|
+
Object.defineProperty(exports, "withSchemaTenant", { enumerable: true, get: function () { return schema_prisma_js_1.withSchemaTenant; } });
|
|
18
|
+
var manager_js_1 = require("./rls/manager.js");
|
|
19
|
+
Object.defineProperty(exports, "createPolicy", { enumerable: true, get: function () { return manager_js_1.createPolicy; } });
|
|
20
|
+
Object.defineProperty(exports, "dropPolicy", { enumerable: true, get: function () { return manager_js_1.dropPolicy; } });
|
|
21
|
+
Object.defineProperty(exports, "enableRLS", { enumerable: true, get: function () { return manager_js_1.enableRLS; } });
|
|
22
|
+
Object.defineProperty(exports, "disableRLS", { enumerable: true, get: function () { return manager_js_1.disableRLS; } });
|
|
23
|
+
Object.defineProperty(exports, "isRLSEnabled", { enumerable: true, get: function () { return manager_js_1.isRLSEnabled; } });
|
|
24
|
+
var session_js_1 = require("./rls/session.js");
|
|
25
|
+
Object.defineProperty(exports, "setTenantContext", { enumerable: true, get: function () { return session_js_1.setTenantContext; } });
|
|
26
|
+
Object.defineProperty(exports, "resetTenantContext", { enumerable: true, get: function () { return session_js_1.resetTenantContext; } });
|
|
27
|
+
Object.defineProperty(exports, "getCurrentTenantId", { enumerable: true, get: function () { return session_js_1.getCurrentTenantId; } });
|
|
28
|
+
var manager_js_2 = require("./schema/manager.js");
|
|
29
|
+
Object.defineProperty(exports, "createSchema", { enumerable: true, get: function () { return manager_js_2.createSchema; } });
|
|
30
|
+
Object.defineProperty(exports, "dropSchema", { enumerable: true, get: function () { return manager_js_2.dropSchema; } });
|
|
31
|
+
Object.defineProperty(exports, "schemaExists", { enumerable: true, get: function () { return manager_js_2.schemaExists; } });
|
|
32
|
+
Object.defineProperty(exports, "listTenantSchemas", { enumerable: true, get: function () { return manager_js_2.listTenantSchemas; } });
|
|
33
|
+
Object.defineProperty(exports, "replicateTableToSchema", { enumerable: true, get: function () { return manager_js_2.replicateTableToSchema; } });
|
|
34
|
+
Object.defineProperty(exports, "tenantSchemaName", { enumerable: true, get: function () { return manager_js_2.tenantSchemaName; } });
|
|
35
|
+
var session_js_2 = require("./schema/session.js");
|
|
36
|
+
Object.defineProperty(exports, "setSchemaSearchPath", { enumerable: true, get: function () { return session_js_2.setSchemaSearchPath; } });
|
|
37
|
+
Object.defineProperty(exports, "resetSearchPath", { enumerable: true, get: function () { return session_js_2.resetSearchPath; } });
|
|
38
|
+
Object.defineProperty(exports, "getCurrentSearchPath", { enumerable: true, get: function () { return session_js_2.getCurrentSearchPath; } });
|
|
39
|
+
var migration_helpers_js_1 = require("./migration-helpers.js");
|
|
40
|
+
Object.defineProperty(exports, "addTenantColumn", { enumerable: true, get: function () { return migration_helpers_js_1.addTenantColumn; } });
|
|
41
|
+
Object.defineProperty(exports, "enableRLSMigration", { enumerable: true, get: function () { return migration_helpers_js_1.enableRLS; } });
|
|
42
|
+
Object.defineProperty(exports, "createIsolationPolicy", { enumerable: true, get: function () { return migration_helpers_js_1.createIsolationPolicy; } });
|
|
43
|
+
Object.defineProperty(exports, "migrateTable", { enumerable: true, get: function () { return migration_helpers_js_1.migrateTable; } });
|
|
44
|
+
// DB_PER_TENANT isolation
|
|
45
|
+
var manager_js_3 = require("./database/manager.js");
|
|
46
|
+
Object.defineProperty(exports, "getDatabaseName", { enumerable: true, get: function () { return manager_js_3.getDatabaseName; } });
|
|
47
|
+
Object.defineProperty(exports, "databaseExists", { enumerable: true, get: function () { return manager_js_3.databaseExists; } });
|
|
48
|
+
Object.defineProperty(exports, "createDatabase", { enumerable: true, get: function () { return manager_js_3.createDatabase; } });
|
|
49
|
+
Object.defineProperty(exports, "dropDatabase", { enumerable: true, get: function () { return manager_js_3.dropDatabase; } });
|
|
50
|
+
var pool_manager_js_1 = require("./database/pool-manager.js");
|
|
51
|
+
Object.defineProperty(exports, "DatabasePoolManager", { enumerable: true, get: function () { return pool_manager_js_1.DatabasePoolManager; } });
|
|
52
|
+
var database_raw_js_1 = require("./adapters/database-raw.js");
|
|
53
|
+
Object.defineProperty(exports, "DatabaseRawAdapter", { enumerable: true, get: function () { return database_raw_js_1.DatabaseRawAdapter; } });
|
|
54
|
+
var database_prisma_js_1 = require("./adapters/database-prisma.js");
|
|
55
|
+
Object.defineProperty(exports, "DatabasePrismaAdapter", { enumerable: true, get: function () { return database_prisma_js_1.DatabasePrismaAdapter; } });
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export declare function addTenantColumn(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
3
|
+
export declare function enableRLS(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
4
|
+
export declare function createIsolationPolicy(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
5
|
+
export declare function migrateTable(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=migration-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-helpers.d.ts","sourceRoot":"","sources":["../src/migration-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,wBAAsB,eAAe,CACnC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migrateTable = exports.createIsolationPolicy = exports.enableRLS = exports.addTenantColumn = void 0;
|
|
4
|
+
// Validate table name to prevent SQL injection (only allows alphanumeric + underscores)
|
|
5
|
+
function validateTableName(name) {
|
|
6
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
|
|
7
|
+
throw new Error(`Invalid table name: ${name}`);
|
|
8
|
+
}
|
|
9
|
+
return name;
|
|
10
|
+
}
|
|
11
|
+
async function addTenantColumn(client, tableName) {
|
|
12
|
+
const safe = validateTableName(tableName);
|
|
13
|
+
await client.query(`ALTER TABLE ${safe} ADD COLUMN tenant_id UUID NOT NULL`);
|
|
14
|
+
}
|
|
15
|
+
exports.addTenantColumn = addTenantColumn;
|
|
16
|
+
async function enableRLS(client, tableName) {
|
|
17
|
+
const safe = validateTableName(tableName);
|
|
18
|
+
await client.query(`ALTER TABLE ${safe} ENABLE ROW LEVEL SECURITY`);
|
|
19
|
+
await client.query(`ALTER TABLE ${safe} FORCE ROW LEVEL SECURITY`);
|
|
20
|
+
}
|
|
21
|
+
exports.enableRLS = enableRLS;
|
|
22
|
+
async function createIsolationPolicy(client, tableName) {
|
|
23
|
+
const safe = validateTableName(tableName);
|
|
24
|
+
await client.query(`CREATE POLICY tenant_isolation ON ${safe}
|
|
25
|
+
USING (tenant_id = current_setting('app.current_tenant_id')::uuid)`);
|
|
26
|
+
}
|
|
27
|
+
exports.createIsolationPolicy = createIsolationPolicy;
|
|
28
|
+
async function migrateTable(client, tableName) {
|
|
29
|
+
await addTenantColumn(client, tableName);
|
|
30
|
+
await enableRLS(client, tableName);
|
|
31
|
+
await createIsolationPolicy(client, tableName);
|
|
32
|
+
}
|
|
33
|
+
exports.migrateTable = migrateTable;
|
|
34
|
+
//# sourceMappingURL=migration-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-helpers.js","sourceRoot":"","sources":["../src/migration-helpers.ts"],"names":[],"mappings":";;;AAEA,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,CAChB,eAAe,IAAI,qCAAqC,CACzD,CAAC;AACJ,CAAC;AARD,0CAQC;AAEM,KAAK,UAAU,SAAS,CAC7B,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,4BAA4B,CAAC,CAAC;IACpE,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC;AACrE,CAAC;AAPD,8BAOC;AAEM,KAAK,UAAU,qBAAqB,CACzC,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,CAChB,qCAAqC,IAAI;wEAC2B,CACrE,CAAC;AACJ,CAAC;AATD,sDASC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAqB,EACrB,SAAiB;IAEjB,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAPD,oCAOC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export declare function createPolicy(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
3
|
+
export declare function dropPolicy(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
4
|
+
export declare function enableRLS(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
5
|
+
export declare function disableRLS(client: pg.PoolClient, tableName: string): Promise<void>;
|
|
6
|
+
export declare function isRLSEnabled(client: pg.PoolClient, tableName: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/rls/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,wBAAsB,YAAY,CAChC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isRLSEnabled = exports.disableRLS = exports.enableRLS = exports.dropPolicy = exports.createPolicy = void 0;
|
|
4
|
+
// Validate table name to prevent SQL injection (only allows alphanumeric + underscores)
|
|
5
|
+
function validateTableName(tableName) {
|
|
6
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {
|
|
7
|
+
throw new Error(`Invalid table name: ${tableName}`);
|
|
8
|
+
}
|
|
9
|
+
return tableName;
|
|
10
|
+
}
|
|
11
|
+
async function createPolicy(client, tableName) {
|
|
12
|
+
const safe = validateTableName(tableName);
|
|
13
|
+
// Cannot use parameterized queries inside DO blocks or for DDL identifiers.
|
|
14
|
+
// Table name is validated via allowlist regex above.
|
|
15
|
+
const exists = await client.query(`SELECT count(*) FROM pg_policies WHERE tablename = $1 AND policyname = 'tenant_isolation'`, [safe]);
|
|
16
|
+
if (parseInt(exists.rows[0].count, 10) === 0) {
|
|
17
|
+
await client.query(`CREATE POLICY tenant_isolation ON ${safe} USING (tenant_id = current_setting('app.current_tenant_id')::uuid)`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.createPolicy = createPolicy;
|
|
21
|
+
async function dropPolicy(client, tableName) {
|
|
22
|
+
const safe = validateTableName(tableName);
|
|
23
|
+
await client.query(`DROP POLICY IF EXISTS tenant_isolation ON ${safe}`);
|
|
24
|
+
}
|
|
25
|
+
exports.dropPolicy = dropPolicy;
|
|
26
|
+
async function enableRLS(client, tableName) {
|
|
27
|
+
const safe = validateTableName(tableName);
|
|
28
|
+
await client.query(`ALTER TABLE ${safe} ENABLE ROW LEVEL SECURITY`);
|
|
29
|
+
await client.query(`ALTER TABLE ${safe} FORCE ROW LEVEL SECURITY`);
|
|
30
|
+
}
|
|
31
|
+
exports.enableRLS = enableRLS;
|
|
32
|
+
async function disableRLS(client, tableName) {
|
|
33
|
+
const safe = validateTableName(tableName);
|
|
34
|
+
await client.query(`ALTER TABLE ${safe} NO FORCE ROW LEVEL SECURITY`);
|
|
35
|
+
await client.query(`ALTER TABLE ${safe} DISABLE ROW LEVEL SECURITY`);
|
|
36
|
+
}
|
|
37
|
+
exports.disableRLS = disableRLS;
|
|
38
|
+
async function isRLSEnabled(client, tableName) {
|
|
39
|
+
const res = await client.query(`SELECT relrowsecurity FROM pg_class WHERE relname = $1`, [tableName]);
|
|
40
|
+
if (res.rows.length === 0) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return res.rows[0].relrowsecurity;
|
|
44
|
+
}
|
|
45
|
+
exports.isRLSEnabled = isRLSEnabled;
|
|
46
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/rls/manager.ts"],"names":[],"mappings":";;;AAEA,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,2FAA2F,EAC3F,CAAC,IAAI,CAAC,CACP,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,KAAK,CAChB,qCAAqC,IAAI,qEAAqE,CAC/G,CAAC;IACJ,CAAC;AACH,CAAC;AAhBD,oCAgBC;AAEM,KAAK,UAAU,UAAU,CAC9B,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;AAC1E,CAAC;AAND,gCAMC;AAEM,KAAK,UAAU,SAAS,CAC7B,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,4BAA4B,CAAC,CAAC;IACpE,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC;AACrE,CAAC;AAPD,8BAOC;AAEM,KAAK,UAAU,UAAU,CAC9B,MAAqB,EACrB,SAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,8BAA8B,CAAC,CAAC;IACtE,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,6BAA6B,CAAC,CAAC;AACvE,CAAC;AAPD,gCAOC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAqB,EACrB,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B,wDAAwD,EACxD,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AACpC,CAAC;AAZD,oCAYC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export declare function setTenantContext(client: pg.PoolClient, tenantId: string): Promise<void>;
|
|
3
|
+
export declare function resetTenantContext(client: pg.PoolClient): Promise<void>;
|
|
4
|
+
export declare function getCurrentTenantId(client: pg.PoolClient): Promise<string | null>;
|
|
5
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/rls/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,EAAE,CAAC,UAAU,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCurrentTenantId = exports.resetTenantContext = exports.setTenantContext = void 0;
|
|
4
|
+
async function setTenantContext(client, tenantId) {
|
|
5
|
+
await client.query("SELECT set_config('app.current_tenant_id', $1, true)", [tenantId]);
|
|
6
|
+
}
|
|
7
|
+
exports.setTenantContext = setTenantContext;
|
|
8
|
+
async function resetTenantContext(client) {
|
|
9
|
+
await client.query("RESET app.current_tenant_id");
|
|
10
|
+
}
|
|
11
|
+
exports.resetTenantContext = resetTenantContext;
|
|
12
|
+
async function getCurrentTenantId(client) {
|
|
13
|
+
const res = await client.query(`SELECT current_setting('app.current_tenant_id', true) AS current_setting`);
|
|
14
|
+
const value = res.rows[0]?.current_setting;
|
|
15
|
+
return value || null;
|
|
16
|
+
}
|
|
17
|
+
exports.getCurrentTenantId = getCurrentTenantId;
|
|
18
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/rls/session.ts"],"names":[],"mappings":";;;AAEO,KAAK,UAAU,gBAAgB,CACpC,MAAqB,EACrB,QAAgB;IAEhB,MAAM,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzF,CAAC;AALD,4CAKC;AAEM,KAAK,UAAU,kBAAkB,CAAC,MAAqB;IAC5D,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACpD,CAAC;AAFD,gDAEC;AAEM,KAAK,UAAU,kBAAkB,CACtC,MAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B,0EAA0E,CAC3E,CAAC;IACF,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;IAC3C,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AARD,gDAQC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export declare function tenantSchemaName(tenantSlug: string): string;
|
|
3
|
+
export declare function createSchema(client: pg.PoolClient, tenantSlug: string): Promise<void>;
|
|
4
|
+
export declare function dropSchema(client: pg.PoolClient, tenantSlug: string): Promise<void>;
|
|
5
|
+
export declare function schemaExists(client: pg.PoolClient, tenantSlug: string): Promise<boolean>;
|
|
6
|
+
export declare function listTenantSchemas(client: pg.PoolClient): Promise<string[]>;
|
|
7
|
+
export declare function replicateTableToSchema(client: pg.PoolClient, tableName: string, schemaName: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/schema/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAkBpB,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,EAAE,CAAC,UAAU,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.replicateTableToSchema = exports.listTenantSchemas = exports.schemaExists = exports.dropSchema = exports.createSchema = exports.tenantSchemaName = void 0;
|
|
4
|
+
// Validate schema name to prevent SQL injection (only allows alphanumeric + underscores)
|
|
5
|
+
function validateSchemaName(schemaName) {
|
|
6
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(schemaName)) {
|
|
7
|
+
throw new Error(`Invalid schema name: ${schemaName}`);
|
|
8
|
+
}
|
|
9
|
+
return schemaName;
|
|
10
|
+
}
|
|
11
|
+
// Validate table name to prevent SQL injection (only allows alphanumeric + underscores)
|
|
12
|
+
function validateTableName(tableName) {
|
|
13
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {
|
|
14
|
+
throw new Error(`Invalid table name: ${tableName}`);
|
|
15
|
+
}
|
|
16
|
+
return tableName;
|
|
17
|
+
}
|
|
18
|
+
function tenantSchemaName(tenantSlug) {
|
|
19
|
+
return `tenant_${tenantSlug}`;
|
|
20
|
+
}
|
|
21
|
+
exports.tenantSchemaName = tenantSchemaName;
|
|
22
|
+
async function createSchema(client, tenantSlug) {
|
|
23
|
+
const schemaName = validateSchemaName(tenantSchemaName(tenantSlug));
|
|
24
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS ${schemaName}`);
|
|
25
|
+
}
|
|
26
|
+
exports.createSchema = createSchema;
|
|
27
|
+
async function dropSchema(client, tenantSlug) {
|
|
28
|
+
const schemaName = validateSchemaName(tenantSchemaName(tenantSlug));
|
|
29
|
+
await client.query(`DROP SCHEMA IF EXISTS ${schemaName} CASCADE`);
|
|
30
|
+
}
|
|
31
|
+
exports.dropSchema = dropSchema;
|
|
32
|
+
async function schemaExists(client, tenantSlug) {
|
|
33
|
+
const schemaName = tenantSchemaName(tenantSlug);
|
|
34
|
+
const res = await client.query(`SELECT count(*) FROM pg_namespace WHERE nspname = $1`, [schemaName]);
|
|
35
|
+
return parseInt(res.rows[0].count, 10) > 0;
|
|
36
|
+
}
|
|
37
|
+
exports.schemaExists = schemaExists;
|
|
38
|
+
async function listTenantSchemas(client) {
|
|
39
|
+
const res = await client.query(`SELECT nspname FROM pg_namespace WHERE nspname LIKE 'tenant_%' ORDER BY nspname`);
|
|
40
|
+
return res.rows.map((r) => r.nspname);
|
|
41
|
+
}
|
|
42
|
+
exports.listTenantSchemas = listTenantSchemas;
|
|
43
|
+
async function replicateTableToSchema(client, tableName, schemaName) {
|
|
44
|
+
const safeTable = validateTableName(tableName);
|
|
45
|
+
const safeSchema = validateSchemaName(schemaName);
|
|
46
|
+
await client.query(`CREATE TABLE IF NOT EXISTS ${safeSchema}.${safeTable} (LIKE public.${safeTable} INCLUDING ALL)`);
|
|
47
|
+
}
|
|
48
|
+
exports.replicateTableToSchema = replicateTableToSchema;
|
|
49
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/schema/manager.ts"],"names":[],"mappings":";;;AAEA,yFAAyF;AACzF,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,gBAAgB,CAAC,UAAkB;IACjD,OAAO,UAAU,UAAU,EAAE,CAAC;AAChC,CAAC;AAFD,4CAEC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAqB,EACrB,UAAkB;IAElB,MAAM,UAAU,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,CAAC,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;AAClE,CAAC;AAND,oCAMC;AAEM,KAAK,UAAU,UAAU,CAC9B,MAAqB,EACrB,UAAkB;IAElB,MAAM,UAAU,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,CAAC,KAAK,CAAC,yBAAyB,UAAU,UAAU,CAAC,CAAC;AACpE,CAAC;AAND,gCAMC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAqB,EACrB,UAAkB;IAElB,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B,sDAAsD,EACtD,CAAC,UAAU,CAAC,CACb,CAAC;IACF,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC;AAVD,oCAUC;AAEM,KAAK,UAAU,iBAAiB,CACrC,MAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B,iFAAiF,CAClF,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAPD,8CAOC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,MAAqB,EACrB,SAAiB,EACjB,UAAkB;IAElB,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,MAAM,CAAC,KAAK,CAChB,8BAA8B,UAAU,IAAI,SAAS,iBAAiB,SAAS,iBAAiB,CACjG,CAAC;AACJ,CAAC;AAVD,wDAUC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export declare function setSchemaSearchPath(client: pg.PoolClient, tenantSlug: string): Promise<void>;
|
|
3
|
+
export declare function resetSearchPath(client: pg.PoolClient): Promise<void>;
|
|
4
|
+
export declare function getCurrentSearchPath(client: pg.PoolClient): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/schema/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,EAAE,CAAC,UAAU,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAKf;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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCurrentSearchPath = exports.resetSearchPath = exports.setSchemaSearchPath = void 0;
|
|
4
|
+
const manager_js_1 = require("./manager.js");
|
|
5
|
+
async function setSchemaSearchPath(client, tenantSlug) {
|
|
6
|
+
const schemaName = (0, manager_js_1.tenantSchemaName)(tenantSlug);
|
|
7
|
+
// Schema name is derived from a validated slug — safe for interpolation.
|
|
8
|
+
// SET LOCAL only takes effect for the current transaction.
|
|
9
|
+
await client.query(`SET LOCAL search_path TO ${schemaName}, public`);
|
|
10
|
+
}
|
|
11
|
+
exports.setSchemaSearchPath = setSchemaSearchPath;
|
|
12
|
+
async function resetSearchPath(client) {
|
|
13
|
+
await client.query("RESET search_path");
|
|
14
|
+
}
|
|
15
|
+
exports.resetSearchPath = resetSearchPath;
|
|
16
|
+
async function getCurrentSearchPath(client) {
|
|
17
|
+
const res = await client.query("SHOW search_path");
|
|
18
|
+
return res.rows[0].search_path;
|
|
19
|
+
}
|
|
20
|
+
exports.getCurrentSearchPath = getCurrentSearchPath;
|
|
21
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/schema/session.ts"],"names":[],"mappings":";;;AACA,6CAAgD;AAEzC,KAAK,UAAU,mBAAmB,CACvC,MAAqB,EACrB,UAAkB;IAElB,MAAM,UAAU,GAAG,IAAA,6BAAgB,EAAC,UAAU,CAAC,CAAC;IAChD,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,MAAM,CAAC,KAAK,CAAC,4BAA4B,UAAU,UAAU,CAAC,CAAC;AACvE,CAAC;AARD,kDAQC;AAEM,KAAK,UAAU,eAAe,CAAC,MAAqB;IACzD,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAC1C,CAAC;AAFD,0CAEC;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;AALD,oDAKC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stratum-hq/db-adapters",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Stratum PostgreSQL adapters for tenant-scoped query isolation",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"lint": "tsc --noEmit",
|
|
22
|
+
"clean": "rm -rf dist"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public",
|
|
26
|
+
"registry": "https://registry.npmjs.org/"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@stratum-hq/core": "*",
|
|
30
|
+
"pg": "^8.11.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@prisma/client": "^5.10.0",
|
|
34
|
+
"@types/pg": "^8.11.0",
|
|
35
|
+
"typescript": "^5.4.0",
|
|
36
|
+
"vitest": "^1.6.0"
|
|
37
|
+
}
|
|
38
|
+
}
|