@stratum-hq/lib 0.2.3 → 0.3.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/__tests__/migrate-schemas.test.d.ts +2 -0
  4. package/dist/__tests__/migrate-schemas.test.d.ts.map +1 -0
  5. package/dist/__tests__/migrate-schemas.test.js +225 -0
  6. package/dist/__tests__/migrate-schemas.test.js.map +1 -0
  7. package/dist/__tests__/stratum-als.test.d.ts +2 -0
  8. package/dist/__tests__/stratum-als.test.d.ts.map +1 -0
  9. package/dist/__tests__/stratum-als.test.js +49 -0
  10. package/dist/__tests__/stratum-als.test.js.map +1 -0
  11. package/dist/crypto.d.ts.map +1 -1
  12. package/dist/crypto.js +9 -3
  13. package/dist/crypto.js.map +1 -1
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/migrate-schemas.d.ts +22 -0
  19. package/dist/migrate-schemas.d.ts.map +1 -0
  20. package/dist/migrate-schemas.js +128 -0
  21. package/dist/migrate-schemas.js.map +1 -0
  22. package/dist/migrations/001_init.sql +12 -3
  23. package/dist/services/event-service.d.ts +7 -0
  24. package/dist/services/event-service.d.ts.map +1 -1
  25. package/dist/services/event-service.js +2 -0
  26. package/dist/services/event-service.js.map +1 -1
  27. package/dist/stratum.d.ts +16 -3
  28. package/dist/stratum.d.ts.map +1 -1
  29. package/dist/stratum.js +30 -23
  30. package/dist/stratum.js.map +1 -1
  31. package/package.json +25 -1
  32. package/dist/migrations/migrations/001_init.sql +0 -145
  33. package/dist/migrations/migrations/002_schema_isolation.sql +0 -6
  34. package/dist/migrations/migrations/003_db_isolation.sql +0 -12
  35. package/dist/migrations/migrations/004_webhooks.sql +0 -53
  36. package/dist/migrations/migrations/005_audit_logs.sql +0 -21
  37. package/dist/migrations/migrations/006_api_key_scopes.sql +0 -2
  38. package/dist/migrations/migrations/007_sensitive_config.sql +0 -1
  39. package/dist/migrations/migrations/008_api_key_management.sql +0 -7
  40. package/dist/migrations/migrations/009_consent.sql +0 -18
  41. package/dist/migrations/migrations/010_multi_region.sql +0 -19
  42. package/dist/migrations/migrations/011_demo_bootstrap.sql +0 -5
  43. package/dist/migrations/migrations/012_roles.sql +0 -18
  44. package/dist/migrations/migrations/013_api_key_hmac.sql +0 -4
  45. package/dist/migrations/migrations/014_sort_order.sql +0 -5
  46. package/dist/migrations/migrations/015_region_url_encryption.sql +0 -5
  47. package/dist/migrations/migrations/016_migration_alias.sql +0 -8
  48. /package/dist/migrations/{migrations/017_abac_policies.sql → 017_abac_policies.sql} +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Christian Crank
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,83 @@
1
+ # @stratum-hq/lib
2
+
3
+ Framework-agnostic library for embedding [Stratum](https://github.com/stratum-hq/Stratum) directly in your Node.js app. Talks straight to PostgreSQL with no HTTP server in between — maximum performance for tenant operations.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @stratum-hq/lib @stratum-hq/core pg
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { Pool } from "pg";
15
+ import { Stratum } from "@stratum-hq/lib";
16
+
17
+ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
18
+ const stratum = new Stratum({ pool, autoMigrate: true });
19
+ await stratum.initialize();
20
+
21
+ const msp = await stratum.createTenant({ name: "NorthStar MSP", slug: "northstar" });
22
+ const customer = await stratum.createTenant({
23
+ name: "Acme Corp",
24
+ slug: "acme",
25
+ parent_id: msp.id,
26
+ isolation_strategy: "SHARED_RLS",
27
+ });
28
+
29
+ // Config flows root → leaf — children inherit automatically
30
+ await stratum.setConfig(msp.id, "max_seats", { value: 500, locked: true });
31
+ const config = await stratum.resolveConfig(customer.id);
32
+ // → { max_seats: { value: 500, inherited: true, locked: true } }
33
+
34
+ const permissions = await stratum.resolvePermissions(customer.id);
35
+ ```
36
+
37
+ The `pool` is **borrowed, not owned** — Stratum never creates or closes it. With `autoMigrate: true`, `initialize()` runs the schema migrations on first start; leave it off and manage migrations yourself via `migrate`.
38
+
39
+ ## API Summary
40
+
41
+ The `Stratum` instance covers the full tenant lifecycle:
42
+
43
+ - **Tenants** — `createTenant`, `getTenant`, `listTenants`, `updateTenant`, `moveTenant`, `getAncestors`, `getDescendants`, `batchCreateTenants`
44
+ - **Config** — `resolveConfig`, `setConfig`, `deleteConfig`, `batchSetConfig`, `diffConfig`
45
+ - **Permissions & ABAC** — `resolvePermissions`, `createPermission`, `createAbacPolicy`, `evaluateAbac`
46
+ - **API keys & roles** — `createApiKey`, `validateApiKey`, `rotateApiKey`, `createRole`, `assignRoleToKey`
47
+ - **Webhooks & audit** — `createWebhook`, `testWebhook`, `queryAuditLogs`, `listFailedDeliveries`
48
+ - **GDPR & regions** — `exportTenantData`, `purgeTenant`, `grantConsent`, `createRegion`, `migrateRegion`
49
+
50
+ Low-level pool helpers are also exported:
51
+
52
+ ```typescript
53
+ import { withClient, withTransaction } from "@stratum-hq/lib";
54
+
55
+ await withTransaction(pool, async (client) => {
56
+ await client.query("INSERT INTO ...");
57
+ });
58
+ ```
59
+
60
+ ## Error Handling
61
+
62
+ All errors come from `@stratum-hq/core` and extend `StratumError`:
63
+
64
+ ```typescript
65
+ import { ConfigLockedError } from "@stratum-hq/core";
66
+
67
+ try {
68
+ await stratum.setConfig(childId, "max_seats", { value: 999 });
69
+ } catch (err) {
70
+ if (err instanceof ConfigLockedError) {
71
+ // A parent locked this key — child cannot override
72
+ }
73
+ }
74
+ ```
75
+
76
+ ## Links
77
+
78
+ - Documentation: https://docs.stratum-hq.org/packages/lib/
79
+ - GitHub: https://github.com/stratum-hq/Stratum
80
+
81
+ ## License
82
+
83
+ MIT © Christian Crank
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=migrate-schemas.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-schemas.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/migrate-schemas.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const migrate_schemas_js_1 = require("../migrate-schemas.js");
5
+ // Mock fs and path so we don't need real migration files
6
+ vitest_1.vi.mock("node:fs", () => ({
7
+ default: {
8
+ existsSync: vitest_1.vi.fn().mockReturnValue(true),
9
+ readdirSync: vitest_1.vi.fn().mockReturnValue(["001_init.sql", "002_schema.sql"]),
10
+ readFileSync: vitest_1.vi.fn().mockImplementation((_path) => {
11
+ if (_path.includes("001_init"))
12
+ return "CREATE TABLE test1 (id INT);";
13
+ return "CREATE TABLE test2 (id INT);";
14
+ }),
15
+ },
16
+ }));
17
+ function createMockClient() {
18
+ const applied = new Set();
19
+ return {
20
+ query: vitest_1.vi.fn().mockImplementation((sql, params) => {
21
+ // Track SET search_path calls
22
+ if (typeof sql === "string" && sql.includes("search_path")) {
23
+ return Promise.resolve({ rows: [] });
24
+ }
25
+ // Check if migration already applied
26
+ if (typeof sql === "string" &&
27
+ sql.includes("SELECT 1 FROM _migrations") &&
28
+ params) {
29
+ const name = params[0];
30
+ if (applied.has(name)) {
31
+ return Promise.resolve({ rows: [{ "?column?": 1 }] });
32
+ }
33
+ return Promise.resolve({ rows: [] });
34
+ }
35
+ // Record applied migration
36
+ if (typeof sql === "string" &&
37
+ sql.includes("INSERT INTO _migrations") &&
38
+ params) {
39
+ applied.add(params[0]);
40
+ return Promise.resolve({ rows: [] });
41
+ }
42
+ return Promise.resolve({ rows: [] });
43
+ }),
44
+ release: vitest_1.vi.fn(),
45
+ };
46
+ }
47
+ function createMockPool(schemas, opts) {
48
+ const clients = [];
49
+ const pool = {
50
+ query: vitest_1.vi.fn().mockImplementation((sql) => {
51
+ if (sql.includes("SELECT slug FROM tenants")) {
52
+ return Promise.resolve({
53
+ rows: schemas.map((s) => ({ slug: s })),
54
+ });
55
+ }
56
+ return Promise.resolve({ rows: [] });
57
+ }),
58
+ connect: vitest_1.vi.fn().mockImplementation(() => {
59
+ const client = createMockClient();
60
+ if (opts?.failSchema) {
61
+ const origQuery = client.query;
62
+ client.query = vitest_1.vi.fn().mockImplementation((sql, params) => {
63
+ // Fail on the actual migration SQL for the target schema
64
+ if (typeof sql === "string" &&
65
+ sql.includes("search_path") &&
66
+ sql.includes(`tenant_${opts.failSchema}`)) {
67
+ // Let the search_path call succeed, but fail on the next migration SQL
68
+ const innerQuery = vitest_1.vi.fn().mockImplementation((innerSql, innerParams) => {
69
+ if (innerSql.startsWith("CREATE TABLE test")) {
70
+ return Promise.reject(new Error(`Migration failed for schema tenant_${opts.failSchema}`));
71
+ }
72
+ return origQuery(innerSql, innerParams);
73
+ });
74
+ // Replace query for subsequent calls
75
+ client.query = innerQuery;
76
+ return Promise.resolve({ rows: [] });
77
+ }
78
+ return origQuery(sql, params);
79
+ });
80
+ }
81
+ clients.push(client);
82
+ return Promise.resolve(client);
83
+ }),
84
+ _clients: clients,
85
+ };
86
+ return pool;
87
+ }
88
+ (0, vitest_1.beforeEach)(() => {
89
+ vitest_1.vi.clearAllMocks();
90
+ });
91
+ (0, vitest_1.describe)("migrateAllSchemas", () => {
92
+ (0, vitest_1.it)("discovers schemas from tenants table", async () => {
93
+ const pool = createMockPool(["acme", "globex"]);
94
+ await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool });
95
+ (0, vitest_1.expect)(pool.query).toHaveBeenCalledWith(vitest_1.expect.stringContaining("SELECT slug FROM tenants"));
96
+ });
97
+ (0, vitest_1.it)("runs migrations per schema with correct search_path", async () => {
98
+ const pool = createMockPool(["acme"]);
99
+ const result = await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool });
100
+ (0, vitest_1.expect)(result.succeeded).toContain("tenant_acme");
101
+ (0, vitest_1.expect)(result.failed).toHaveLength(0);
102
+ // Verify search_path was set for the schema
103
+ const allCalls = pool._clients.flatMap((c) => c.query.mock.calls.map((call) => call[0]));
104
+ const searchPathCalls = allCalls.filter((s) => typeof s === "string" && s.includes("search_path"));
105
+ (0, vitest_1.expect)(searchPathCalls.some((s) => s.includes("tenant_acme"))).toBe(true);
106
+ });
107
+ (0, vitest_1.it)("continue-on-error: collects failures in result.failed[]", async () => {
108
+ // Create a pool where one schema will fail
109
+ const pool = createMockPool(["acme", "badco"]);
110
+ // Override connect to fail for badco's migration
111
+ let callCount = 0;
112
+ const origConnect = pool.connect;
113
+ pool.connect = vitest_1.vi.fn().mockImplementation(() => {
114
+ callCount++;
115
+ const client = createMockClient();
116
+ // Make every other set of clients fail for badco
117
+ const origQuery = client.query;
118
+ let currentSchema = "";
119
+ client.query = vitest_1.vi.fn().mockImplementation((sql, params) => {
120
+ if (typeof sql === "string" && sql.includes("search_path")) {
121
+ if (sql.includes("tenant_badco")) {
122
+ currentSchema = "badco";
123
+ }
124
+ else {
125
+ currentSchema = "";
126
+ }
127
+ }
128
+ if (currentSchema === "badco" &&
129
+ typeof sql === "string" &&
130
+ sql.startsWith("CREATE TABLE test")) {
131
+ return Promise.reject(new Error("Schema migration failed"));
132
+ }
133
+ return origQuery(sql, params);
134
+ });
135
+ pool._clients.push(client);
136
+ return Promise.resolve(client);
137
+ });
138
+ const result = await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool });
139
+ (0, vitest_1.expect)(result.succeeded).toContain("tenant_acme");
140
+ (0, vitest_1.expect)(result.failed.length).toBeGreaterThan(0);
141
+ (0, vitest_1.expect)(result.failed[0].schema).toBe("tenant_badco");
142
+ (0, vitest_1.expect)(result.failed[0].error).toBeInstanceOf(Error);
143
+ });
144
+ (0, vitest_1.it)("progress callback called with correct args", async () => {
145
+ const pool = createMockPool(["acme", "globex"]);
146
+ const progress = vitest_1.vi.fn();
147
+ await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool, onProgress: progress });
148
+ (0, vitest_1.expect)(progress).toHaveBeenCalledTimes(2);
149
+ // Each call should have (schema, index, total)
150
+ const calls = progress.mock.calls;
151
+ for (const call of calls) {
152
+ (0, vitest_1.expect)(typeof call[0]).toBe("string");
153
+ (0, vitest_1.expect)(typeof call[1]).toBe("number");
154
+ (0, vitest_1.expect)(call[2]).toBe(2);
155
+ }
156
+ // Indices should be 1 and 2 (completed count)
157
+ const indices = calls.map((c) => c[1]).sort();
158
+ (0, vitest_1.expect)(indices).toEqual([1, 2]);
159
+ });
160
+ (0, vitest_1.it)("idempotent re-run: already-applied migrations skipped", async () => {
161
+ // Create pool with a client that reports migrations as already applied
162
+ const pool = createMockPool(["acme"]);
163
+ const origConnect = pool.connect;
164
+ pool.connect = vitest_1.vi.fn().mockImplementation(() => {
165
+ const client = createMockClient();
166
+ // Override: all migrations already applied
167
+ const origQuery = client.query;
168
+ client.query = vitest_1.vi.fn().mockImplementation((sql, params) => {
169
+ if (typeof sql === "string" &&
170
+ sql.includes("SELECT 1 FROM _migrations") &&
171
+ params) {
172
+ return Promise.resolve({ rows: [{ "?column?": 1 }] });
173
+ }
174
+ return origQuery(sql, params);
175
+ });
176
+ pool._clients.push(client);
177
+ return Promise.resolve(client);
178
+ });
179
+ const result = await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool });
180
+ (0, vitest_1.expect)(result.succeeded).toContain("tenant_acme");
181
+ (0, vitest_1.expect)(result.failed).toHaveLength(0);
182
+ // No INSERT should have been called (migrations skipped)
183
+ const allCalls = pool._clients.flatMap((c) => c.query.mock.calls.map((call) => call[0]));
184
+ const inserts = allCalls.filter((s) => typeof s === "string" && s.includes("INSERT INTO _migrations"));
185
+ (0, vitest_1.expect)(inserts).toHaveLength(0);
186
+ });
187
+ (0, vitest_1.it)("empty schema list returns empty result", async () => {
188
+ const pool = createMockPool([]);
189
+ const result = await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool });
190
+ (0, vitest_1.expect)(result.succeeded).toEqual([]);
191
+ (0, vitest_1.expect)(result.failed).toEqual([]);
192
+ });
193
+ (0, vitest_1.it)("respects concurrency limit", async () => {
194
+ const schemas = Array.from({ length: 10 }, (_, i) => `tenant${i}`);
195
+ const pool = createMockPool(schemas);
196
+ let maxConcurrent = 0;
197
+ let currentConcurrent = 0;
198
+ const origConnect = pool.connect;
199
+ pool.connect = vitest_1.vi.fn().mockImplementation(async () => {
200
+ currentConcurrent++;
201
+ if (currentConcurrent > maxConcurrent) {
202
+ maxConcurrent = currentConcurrent;
203
+ }
204
+ const client = createMockClient();
205
+ // Add a small delay to simulate work
206
+ const origQuery = client.query;
207
+ client.query = vitest_1.vi.fn().mockImplementation(async (sql, params) => {
208
+ if (typeof sql === "string" && sql.includes("COMMIT")) {
209
+ // Small delay on commit
210
+ await new Promise((r) => setTimeout(r, 5));
211
+ currentConcurrent--;
212
+ }
213
+ return origQuery(sql, params);
214
+ });
215
+ pool._clients.push(client);
216
+ return client;
217
+ });
218
+ await (0, migrate_schemas_js_1.migrateAllSchemas)({ pool, concurrency: 3 });
219
+ // maxConcurrent should not exceed concurrency * migrations_per_schema
220
+ // but the schema-level concurrency should be limited
221
+ // Due to the semaphore, we expect at most 3 schemas in flight
222
+ (0, vitest_1.expect)(maxConcurrent).toBeLessThanOrEqual(3 * 2); // 3 concurrent * 2 migration files
223
+ });
224
+ });
225
+ //# sourceMappingURL=migrate-schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-schemas.test.js","sourceRoot":"","sources":["../../src/__tests__/migrate-schemas.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stratum-als.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stratum-als.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stratum-als.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const stratum_js_1 = require("../stratum.js");
5
+ const mockContext = {
6
+ tenant_id: "t_abc-123",
7
+ ancestry_path: "/t_abc-123",
8
+ depth: 0,
9
+ resolved_config: { feature_x: true },
10
+ resolved_permissions: {},
11
+ isolation_strategy: "SHARED_RLS",
12
+ };
13
+ (0, vitest_1.describe)("Stratum ALS convenience methods", () => {
14
+ (0, vitest_1.it)("currentTenantId() returns tenant ID inside runWithTenant", () => {
15
+ const result = stratum_js_1.Stratum.runWithTenant(mockContext, () => {
16
+ return stratum_js_1.Stratum.currentTenantId();
17
+ });
18
+ (0, vitest_1.expect)(result).toBe("t_abc-123");
19
+ });
20
+ (0, vitest_1.it)("currentTenantId() returns undefined outside any context", () => {
21
+ (0, vitest_1.expect)(stratum_js_1.Stratum.currentTenantId()).toBeUndefined();
22
+ });
23
+ (0, vitest_1.it)("currentTenantContext() returns full context object", () => {
24
+ const result = stratum_js_1.Stratum.runWithTenant(mockContext, () => {
25
+ return stratum_js_1.Stratum.currentTenantContext();
26
+ });
27
+ (0, vitest_1.expect)(result).toEqual(mockContext);
28
+ });
29
+ (0, vitest_1.it)("currentTenantContext() returns undefined outside any context", () => {
30
+ (0, vitest_1.expect)(stratum_js_1.Stratum.currentTenantContext()).toBeUndefined();
31
+ });
32
+ (0, vitest_1.it)("runWithTenant() executes the function and returns its value", () => {
33
+ const result = stratum_js_1.Stratum.runWithTenant(mockContext, () => 42);
34
+ (0, vitest_1.expect)(result).toBe(42);
35
+ });
36
+ (0, vitest_1.it)("nested runWithTenant() uses innermost context", () => {
37
+ const inner = {
38
+ ...mockContext,
39
+ tenant_id: "t_inner-456",
40
+ };
41
+ const result = stratum_js_1.Stratum.runWithTenant(mockContext, () => {
42
+ return stratum_js_1.Stratum.runWithTenant(inner, () => {
43
+ return stratum_js_1.Stratum.currentTenantId();
44
+ });
45
+ });
46
+ (0, vitest_1.expect)(result).toBe("t_inner-456");
47
+ });
48
+ });
49
+ //# sourceMappingURL=stratum-als.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stratum-als.test.js","sourceRoot":"","sources":["../../src/__tests__/stratum-als.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,8CAAwC;AAGxC,MAAM,WAAW,GAAwB;IACvC,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,YAAY;IAC3B,KAAK,EAAE,CAAC;IACR,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACpC,oBAAoB,EAAE,EAAE;IACxB,kBAAkB,EAAE,YAAY;CACjC,CAAC;AAEF,IAAA,iBAAQ,EAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,oBAAO,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE;YACrD,OAAO,oBAAO,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAA,eAAM,EAAC,oBAAO,CAAC,eAAe,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,oBAAO,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE;YACrD,OAAO,oBAAO,CAAC,oBAAoB,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,IAAA,eAAM,EAAC,oBAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,MAAM,GAAG,oBAAO,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAwB;YACjC,GAAG,WAAW;YACd,SAAS,EAAE,aAAa;SACzB,CAAC;QACF,MAAM,MAAM,GAAG,oBAAO,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE;YACrD,OAAO,oBAAO,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE;gBACvC,OAAO,oBAAO,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AA6DA,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;yDAEyD;AACzD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED,uHAAuH;AACvH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAGnG"}
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAmEA,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;yDAEyD;AACzD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED,uHAAuH;AACvH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAGnG"}
package/dist/crypto.js CHANGED
@@ -11,9 +11,15 @@ const ALGORITHM = "aes-256-gcm";
11
11
  const IV_LENGTH = 12;
12
12
  const AUTH_TAG_LENGTH = 16;
13
13
  const CURRENT_KEY_VERSION = "v1";
14
- const HKDF_SALT = process.env.STRATUM_HKDF_SALT
15
- ? Buffer.from(process.env.STRATUM_HKDF_SALT, "hex")
16
- : Buffer.alloc(32, 0);
14
+ const HKDF_SALT = (() => {
15
+ if (process.env.STRATUM_HKDF_SALT) {
16
+ return Buffer.from(process.env.STRATUM_HKDF_SALT, "hex");
17
+ }
18
+ if (process.env.NODE_ENV === "production") {
19
+ throw new Error("STRATUM_HKDF_SALT must be set in production");
20
+ }
21
+ return node_crypto_1.default.randomBytes(32);
22
+ })();
17
23
  function hkdfDeriveKey(keyMaterial, info = "stratum-aes-key") {
18
24
  return Buffer.from(node_crypto_1.default.hkdfSync("sha256", Buffer.from(keyMaterial, "utf8"), HKDF_SALT, info, 32));
19
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":";;;;;AA8DA,0BAEC;AAKD,0BAcC;AAGD,8BAGC;AAzFD,8DAAiC;AAEjC,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,SAAS,GAAW,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACrD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC;IACnD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAExB,SAAS,aAAa,CAAC,WAAmB,EAAE,IAAI,GAAG,iBAAiB;IAClE,OAAO,MAAM,CAAC,IAAI,CAChB,qBAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CACjF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACxF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,yDAAyD;IACzD,OAAO,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,aAAa,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,GAAW;IACpD,MAAM,EAAE,GAAG,qBAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,qBAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,OAAO,GAAG,mBAAmB,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAChH,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,GAAW;IACpD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAa,EAAE,UAAkB,EAAE,aAAqB,CAAC;IAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,sCAAsC;QACtC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,KAAyC,CAAC;IACnF,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,gCAAgC;QAChC,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,KAAiC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,qBAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;IACjG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED,qFAAqF;AACrF,SAAgB,OAAO,CAAC,SAAiB;IACvC,OAAO,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;yDAEyD;AACzD,SAAgB,OAAO,CAAC,SAAiB;IACvC,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;QAChE,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,OAAO,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,uHAAuH;AACvH,SAAgB,SAAS,CAAC,SAAiB,EAAE,cAAsB,EAAE,cAAsB;IACzF,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IACvE,OAAO,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { Stratum, type StratumOptions } from "./stratum.js";
2
2
  export { migrate, type MigrateOptions } from "./migrate.js";
3
+ export { migrateAllSchemas, type MigrateSchemasOptions, type MigrateSchemasResult, } from "./migrate-schemas.js";
3
4
  export { withClient, withTransaction } from "./pool-helpers.js";
4
5
  export { traced, getTracer, isTracingEnabled } from "./telemetry.js";
5
6
  export type { TenantNode, TenantContext, CreateTenantInput, UpdateTenantInput, MoveTenantInput, PaginationInput, PaginatedResult, ConfigEntry, SetConfigInput, ResolvedConfigEntry, ResolvedConfig, PermissionPolicy, CreatePermissionInput, UpdatePermissionInput, ResolvedPermission, } from "@stratum-hq/core";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGrE,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvH,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGzF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGrE,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvH,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGzF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noopLogger = exports.defaultLogger = exports.isTracingEnabled = exports.getTracer = exports.traced = exports.withTransaction = exports.withClient = exports.migrate = exports.Stratum = void 0;
3
+ exports.noopLogger = exports.defaultLogger = exports.isTracingEnabled = exports.getTracer = exports.traced = exports.withTransaction = exports.withClient = exports.migrateAllSchemas = exports.migrate = exports.Stratum = void 0;
4
4
  var stratum_js_1 = require("./stratum.js");
5
5
  Object.defineProperty(exports, "Stratum", { enumerable: true, get: function () { return stratum_js_1.Stratum; } });
6
6
  var migrate_js_1 = require("./migrate.js");
7
7
  Object.defineProperty(exports, "migrate", { enumerable: true, get: function () { return migrate_js_1.migrate; } });
8
+ var migrate_schemas_js_1 = require("./migrate-schemas.js");
9
+ Object.defineProperty(exports, "migrateAllSchemas", { enumerable: true, get: function () { return migrate_schemas_js_1.migrateAllSchemas; } });
8
10
  var pool_helpers_js_1 = require("./pool-helpers.js");
9
11
  Object.defineProperty(exports, "withClient", { enumerable: true, get: function () { return pool_helpers_js_1.withClient; } });
10
12
  Object.defineProperty(exports, "withTransaction", { enumerable: true, get: function () { return pool_helpers_js_1.withTransaction; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,qDAAgE;AAAvD,6GAAA,UAAU,OAAA;AAAE,kHAAA,eAAe,OAAA;AACpC,+CAAqE;AAA5D,sGAAA,MAAM,OAAA;AAAE,yGAAA,SAAS,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AA8B5C,yCAAwD;AAA/C,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2DAI8B;AAH5B,uHAAA,iBAAiB,OAAA;AAInB,qDAAgE;AAAvD,6GAAA,UAAU,OAAA;AAAE,kHAAA,eAAe,OAAA;AACpC,+CAAqE;AAA5D,sGAAA,MAAM,OAAA;AAAE,yGAAA,SAAS,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AA8B5C,yCAAwD;AAA/C,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA"}
@@ -0,0 +1,22 @@
1
+ import pg from "pg";
2
+ export interface MigrateSchemasOptions {
3
+ pool: pg.Pool;
4
+ concurrency?: number;
5
+ onProgress?: (schema: string, index: number, total: number) => void;
6
+ enforceRls?: boolean;
7
+ }
8
+ export interface MigrateSchemasResult {
9
+ succeeded: string[];
10
+ failed: {
11
+ schema: string;
12
+ error: Error;
13
+ }[];
14
+ }
15
+ /**
16
+ * Discover all tenant schemas (tenants with SCHEMA_PER_TENANT isolation)
17
+ * and run the standard migration set against each one.
18
+ *
19
+ * Continues on error: schemas that fail are collected in result.failed[].
20
+ */
21
+ export declare function migrateAllSchemas(options: MigrateSchemasOptions): Promise<MigrateSchemasResult>;
22
+ //# sourceMappingURL=migrate-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-schemas.d.ts","sourceRoot":"","sources":["../src/migrate-schemas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAAE,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA2D/B"}