@stratum-hq/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/__tests__/ancestry.test.d.ts +2 -0
  2. package/dist/__tests__/ancestry.test.d.ts.map +1 -0
  3. package/dist/__tests__/ancestry.test.js +132 -0
  4. package/dist/__tests__/ancestry.test.js.map +1 -0
  5. package/dist/__tests__/config-types.test.d.ts +2 -0
  6. package/dist/__tests__/config-types.test.d.ts.map +1 -0
  7. package/dist/__tests__/config-types.test.js +143 -0
  8. package/dist/__tests__/config-types.test.js.map +1 -0
  9. package/dist/__tests__/errors.test.d.ts +2 -0
  10. package/dist/__tests__/errors.test.d.ts.map +1 -0
  11. package/dist/__tests__/errors.test.js +113 -0
  12. package/dist/__tests__/errors.test.js.map +1 -0
  13. package/dist/__tests__/isolation.test.d.ts +2 -0
  14. package/dist/__tests__/isolation.test.d.ts.map +1 -0
  15. package/dist/__tests__/isolation.test.js +34 -0
  16. package/dist/__tests__/isolation.test.js.map +1 -0
  17. package/dist/__tests__/validation.test.d.ts +2 -0
  18. package/dist/__tests__/validation.test.d.ts.map +1 -0
  19. package/dist/__tests__/validation.test.js +100 -0
  20. package/dist/__tests__/validation.test.js.map +1 -0
  21. package/dist/__tests__/webhook.test.d.ts +2 -0
  22. package/dist/__tests__/webhook.test.d.ts.map +1 -0
  23. package/dist/__tests__/webhook.test.js +165 -0
  24. package/dist/__tests__/webhook.test.js.map +1 -0
  25. package/dist/constants.d.ts +9 -0
  26. package/dist/constants.d.ts.map +1 -0
  27. package/dist/constants.js +12 -0
  28. package/dist/constants.js.map +1 -0
  29. package/dist/index.d.ts +14 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +102 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/types/api-key.d.ts +5 -0
  34. package/dist/types/api-key.d.ts.map +1 -0
  35. package/dist/types/api-key.js +7 -0
  36. package/dist/types/api-key.js.map +1 -0
  37. package/dist/types/audit.d.ts +81 -0
  38. package/dist/types/audit.d.ts.map +1 -0
  39. package/dist/types/audit.js +30 -0
  40. package/dist/types/audit.js.map +1 -0
  41. package/dist/types/config.d.ts +93 -0
  42. package/dist/types/config.d.ts.map +1 -0
  43. package/dist/types/config.js +22 -0
  44. package/dist/types/config.js.map +1 -0
  45. package/dist/types/consent.d.ts +63 -0
  46. package/dist/types/consent.d.ts.map +1 -0
  47. package/dist/types/consent.js +30 -0
  48. package/dist/types/consent.js.map +1 -0
  49. package/dist/types/isolation.d.ts +9 -0
  50. package/dist/types/isolation.d.ts.map +1 -0
  51. package/dist/types/isolation.js +20 -0
  52. package/dist/types/isolation.js.map +1 -0
  53. package/dist/types/permission.d.ts +101 -0
  54. package/dist/types/permission.d.ts.map +1 -0
  55. package/dist/types/permission.js +41 -0
  56. package/dist/types/permission.js.map +1 -0
  57. package/dist/types/region.d.ts +90 -0
  58. package/dist/types/region.d.ts.map +1 -0
  59. package/dist/types/region.js +39 -0
  60. package/dist/types/region.js.map +1 -0
  61. package/dist/types/tenant.d.ts +148 -0
  62. package/dist/types/tenant.d.ts.map +1 -0
  63. package/dist/types/tenant.js +55 -0
  64. package/dist/types/tenant.js.map +1 -0
  65. package/dist/types/webhook.d.ts +181 -0
  66. package/dist/types/webhook.d.ts.map +1 -0
  67. package/dist/types/webhook.js +65 -0
  68. package/dist/types/webhook.js.map +1 -0
  69. package/dist/utils/ancestry.d.ts +53 -0
  70. package/dist/utils/ancestry.d.ts.map +1 -0
  71. package/dist/utils/ancestry.js +100 -0
  72. package/dist/utils/ancestry.js.map +1 -0
  73. package/dist/utils/errors.d.ts +88 -0
  74. package/dist/utils/errors.d.ts.map +1 -0
  75. package/dist/utils/errors.js +173 -0
  76. package/dist/utils/errors.js.map +1 -0
  77. package/dist/utils/validation.d.ts +21 -0
  78. package/dist/utils/validation.d.ts.map +1 -0
  79. package/dist/utils/validation.js +19 -0
  80. package/dist/utils/validation.js.map +1 -0
  81. package/package.json +35 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ancestry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ancestry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ancestry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const ancestry_js_1 = require("../utils/ancestry.js");
5
+ (0, vitest_1.describe)("ancestry utilities", () => {
6
+ const rootId = "aaaa-bbbb-cccc-dddd";
7
+ const childId = "eeee-ffff-gggg-hhhh";
8
+ const grandchildId = "iiii-jjjj-kkkk-llll";
9
+ // Paths use leading slash: "/id", "/id/id", "/id/id/id"
10
+ const rootPath = `/${rootId}`;
11
+ const childPath = `/${rootId}/${childId}`;
12
+ const grandchildPath = `/${rootId}/${childId}/${grandchildId}`;
13
+ (0, vitest_1.describe)("parseAncestryPath", () => {
14
+ (0, vitest_1.it)("parses root path", () => {
15
+ (0, vitest_1.expect)((0, ancestry_js_1.parseAncestryPath)(rootPath)).toEqual([rootId]);
16
+ });
17
+ (0, vitest_1.it)("parses nested path", () => {
18
+ (0, vitest_1.expect)((0, ancestry_js_1.parseAncestryPath)(grandchildPath)).toEqual([
19
+ rootId,
20
+ childId,
21
+ grandchildId,
22
+ ]);
23
+ });
24
+ (0, vitest_1.it)("parses empty / root as empty array", () => {
25
+ (0, vitest_1.expect)((0, ancestry_js_1.parseAncestryPath)("/")).toEqual([]);
26
+ });
27
+ });
28
+ (0, vitest_1.describe)("buildAncestryPath", () => {
29
+ (0, vitest_1.it)("builds path from array", () => {
30
+ (0, vitest_1.expect)((0, ancestry_js_1.buildAncestryPath)([rootId, childId])).toBe(childPath);
31
+ });
32
+ (0, vitest_1.it)("builds root path from single id", () => {
33
+ (0, vitest_1.expect)((0, ancestry_js_1.buildAncestryPath)([rootId])).toBe(rootPath);
34
+ });
35
+ (0, vitest_1.it)("builds / from empty array", () => {
36
+ (0, vitest_1.expect)((0, ancestry_js_1.buildAncestryPath)([])).toBe("/");
37
+ });
38
+ });
39
+ (0, vitest_1.describe)("getDepth", () => {
40
+ (0, vitest_1.it)("root is depth 1 (one segment)", () => {
41
+ (0, vitest_1.expect)((0, ancestry_js_1.getDepth)(rootPath)).toBe(1);
42
+ });
43
+ (0, vitest_1.it)("child is depth 2", () => {
44
+ (0, vitest_1.expect)((0, ancestry_js_1.getDepth)(childPath)).toBe(2);
45
+ });
46
+ (0, vitest_1.it)("grandchild is depth 3", () => {
47
+ (0, vitest_1.expect)((0, ancestry_js_1.getDepth)(grandchildPath)).toBe(3);
48
+ });
49
+ (0, vitest_1.it)("bare / is depth 0", () => {
50
+ (0, vitest_1.expect)((0, ancestry_js_1.getDepth)("/")).toBe(0);
51
+ });
52
+ });
53
+ (0, vitest_1.describe)("isAncestorOf", () => {
54
+ (0, vitest_1.it)("root is ancestor of child", () => {
55
+ (0, vitest_1.expect)((0, ancestry_js_1.isAncestorOf)(rootPath, childPath)).toBe(true);
56
+ });
57
+ (0, vitest_1.it)("root is ancestor of grandchild", () => {
58
+ (0, vitest_1.expect)((0, ancestry_js_1.isAncestorOf)(rootPath, grandchildPath)).toBe(true);
59
+ });
60
+ (0, vitest_1.it)("child is ancestor of grandchild", () => {
61
+ (0, vitest_1.expect)((0, ancestry_js_1.isAncestorOf)(childPath, grandchildPath)).toBe(true);
62
+ });
63
+ (0, vitest_1.it)("child is not ancestor of root", () => {
64
+ (0, vitest_1.expect)((0, ancestry_js_1.isAncestorOf)(childPath, rootPath)).toBe(false);
65
+ });
66
+ (0, vitest_1.it)("node is not ancestor of itself", () => {
67
+ (0, vitest_1.expect)((0, ancestry_js_1.isAncestorOf)(childPath, childPath)).toBe(false);
68
+ });
69
+ });
70
+ (0, vitest_1.describe)("isDescendantOf", () => {
71
+ (0, vitest_1.it)("child is descendant of root", () => {
72
+ (0, vitest_1.expect)((0, ancestry_js_1.isDescendantOf)(childPath, rootPath)).toBe(true);
73
+ });
74
+ (0, vitest_1.it)("grandchild is descendant of root", () => {
75
+ (0, vitest_1.expect)((0, ancestry_js_1.isDescendantOf)(grandchildPath, rootPath)).toBe(true);
76
+ });
77
+ (0, vitest_1.it)("root is not descendant of child", () => {
78
+ (0, vitest_1.expect)((0, ancestry_js_1.isDescendantOf)(rootPath, childPath)).toBe(false);
79
+ });
80
+ (0, vitest_1.it)("node is not descendant of itself", () => {
81
+ (0, vitest_1.expect)((0, ancestry_js_1.isDescendantOf)(childPath, childPath)).toBe(false);
82
+ });
83
+ });
84
+ (0, vitest_1.describe)("getParentPath", () => {
85
+ (0, vitest_1.it)("root node parent is /", () => {
86
+ (0, vitest_1.expect)((0, ancestry_js_1.getParentPath)(rootPath)).toBe("/");
87
+ });
88
+ (0, vitest_1.it)("bare / has no parent (null)", () => {
89
+ (0, vitest_1.expect)((0, ancestry_js_1.getParentPath)("/")).toBeNull();
90
+ });
91
+ (0, vitest_1.it)("child parent is root path", () => {
92
+ (0, vitest_1.expect)((0, ancestry_js_1.getParentPath)(childPath)).toBe(rootPath);
93
+ });
94
+ (0, vitest_1.it)("grandchild parent is child path", () => {
95
+ (0, vitest_1.expect)((0, ancestry_js_1.getParentPath)(grandchildPath)).toBe(childPath);
96
+ });
97
+ });
98
+ (0, vitest_1.describe)("appendToPath", () => {
99
+ (0, vitest_1.it)("appends child id to root path", () => {
100
+ (0, vitest_1.expect)((0, ancestry_js_1.appendToPath)(rootPath, childId)).toBe(childPath);
101
+ });
102
+ (0, vitest_1.it)("appends grandchild id to child path", () => {
103
+ (0, vitest_1.expect)((0, ancestry_js_1.appendToPath)(childPath, grandchildId)).toBe(grandchildPath);
104
+ });
105
+ });
106
+ (0, vitest_1.describe)("getAncestorIds", () => {
107
+ (0, vitest_1.it)("root path has no ancestors (empty array)", () => {
108
+ (0, vitest_1.expect)((0, ancestry_js_1.getAncestorIds)(rootPath)).toEqual([]);
109
+ });
110
+ (0, vitest_1.it)("child path ancestors are [rootId]", () => {
111
+ (0, vitest_1.expect)((0, ancestry_js_1.getAncestorIds)(childPath)).toEqual([rootId]);
112
+ });
113
+ (0, vitest_1.it)("grandchild path ancestors are [rootId, childId]", () => {
114
+ (0, vitest_1.expect)((0, ancestry_js_1.getAncestorIds)(grandchildPath)).toEqual([rootId, childId]);
115
+ });
116
+ });
117
+ (0, vitest_1.describe)("getSelfId", () => {
118
+ (0, vitest_1.it)("gets root id from root path", () => {
119
+ (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)(rootPath)).toBe(rootId);
120
+ });
121
+ (0, vitest_1.it)("gets child id from child path", () => {
122
+ (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)(childPath)).toBe(childId);
123
+ });
124
+ (0, vitest_1.it)("gets grandchild id from grandchild path", () => {
125
+ (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)(grandchildPath)).toBe(grandchildId);
126
+ });
127
+ (0, vitest_1.it)("returns null for bare / path", () => {
128
+ (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)("/")).toBeNull();
129
+ });
130
+ });
131
+ });
132
+ //# sourceMappingURL=ancestry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ancestry.test.js","sourceRoot":"","sources":["../../src/__tests__/ancestry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ (0, vitest_1.describe)("BatchSetConfigResult shape validation", () => {
5
+ (0, vitest_1.it)("has results array, succeeded count, and failed count", () => {
6
+ const result = {
7
+ results: [],
8
+ succeeded: 0,
9
+ failed: 0,
10
+ };
11
+ (0, vitest_1.expect)(result.results).toBeInstanceOf(Array);
12
+ (0, vitest_1.expect)(typeof result.succeeded).toBe("number");
13
+ (0, vitest_1.expect)(typeof result.failed).toBe("number");
14
+ });
15
+ (0, vitest_1.it)("results array contains BatchSetConfigKeyResult items", () => {
16
+ const okResult = {
17
+ key: "my_key",
18
+ status: "ok",
19
+ entry: {
20
+ id: "550e8400-e29b-41d4-a716-446655440000",
21
+ tenant_id: "660e8400-e29b-41d4-a716-446655440000",
22
+ key: "my_key",
23
+ value: "some_value",
24
+ inherited: false,
25
+ source_tenant_id: "660e8400-e29b-41d4-a716-446655440000",
26
+ locked: false,
27
+ sensitive: false,
28
+ created_at: "2024-01-01T00:00:00.000Z",
29
+ updated_at: "2024-01-01T00:00:00.000Z",
30
+ },
31
+ };
32
+ const errResult = {
33
+ key: "locked_key",
34
+ status: "error",
35
+ error: "Config 'locked_key' is locked by tenant xyz",
36
+ };
37
+ const batchResult = {
38
+ results: [okResult, errResult],
39
+ succeeded: 1,
40
+ failed: 1,
41
+ };
42
+ (0, vitest_1.expect)(batchResult.results).toHaveLength(2);
43
+ (0, vitest_1.expect)(batchResult.succeeded).toBe(1);
44
+ (0, vitest_1.expect)(batchResult.failed).toBe(1);
45
+ });
46
+ (0, vitest_1.it)("succeeded + failed equals results length", () => {
47
+ const results = [
48
+ { key: "a", status: "ok", entry: makeMinimalEntry("a") },
49
+ { key: "b", status: "error", error: "locked" },
50
+ { key: "c", status: "ok", entry: makeMinimalEntry("c") },
51
+ ];
52
+ const batch = {
53
+ results,
54
+ succeeded: 2,
55
+ failed: 1,
56
+ };
57
+ (0, vitest_1.expect)(batch.succeeded + batch.failed).toBe(batch.results.length);
58
+ });
59
+ });
60
+ (0, vitest_1.describe)("BatchSetConfigKeyResult with ok status", () => {
61
+ (0, vitest_1.it)("has key, status ok, and an entry", () => {
62
+ const result = {
63
+ key: "feature_flag",
64
+ status: "ok",
65
+ entry: makeMinimalEntry("feature_flag"),
66
+ };
67
+ (0, vitest_1.expect)(result.key).toBe("feature_flag");
68
+ (0, vitest_1.expect)(result.status).toBe("ok");
69
+ (0, vitest_1.expect)(result.entry).toBeDefined();
70
+ (0, vitest_1.expect)(result.entry.key).toBe("feature_flag");
71
+ (0, vitest_1.expect)(result.error).toBeUndefined();
72
+ });
73
+ (0, vitest_1.it)("entry contains all required ConfigEntry fields", () => {
74
+ const entry = makeMinimalEntry("test_key");
75
+ const result = {
76
+ key: "test_key",
77
+ status: "ok",
78
+ entry,
79
+ };
80
+ (0, vitest_1.expect)(result.entry.id).toBeDefined();
81
+ (0, vitest_1.expect)(result.entry.tenant_id).toBeDefined();
82
+ (0, vitest_1.expect)(result.entry.key).toBe("test_key");
83
+ (0, vitest_1.expect)(result.entry.value).toBeDefined();
84
+ (0, vitest_1.expect)(typeof result.entry.inherited).toBe("boolean");
85
+ (0, vitest_1.expect)(result.entry.source_tenant_id).toBeDefined();
86
+ (0, vitest_1.expect)(typeof result.entry.locked).toBe("boolean");
87
+ (0, vitest_1.expect)(typeof result.entry.sensitive).toBe("boolean");
88
+ (0, vitest_1.expect)(result.entry.created_at).toBeDefined();
89
+ (0, vitest_1.expect)(result.entry.updated_at).toBeDefined();
90
+ });
91
+ });
92
+ (0, vitest_1.describe)("BatchSetConfigKeyResult with error status", () => {
93
+ (0, vitest_1.it)("has key, status error, and an error message", () => {
94
+ const result = {
95
+ key: "restricted_key",
96
+ status: "error",
97
+ error: "Config 'restricted_key' is locked by tenant parent-123 and cannot be overridden",
98
+ };
99
+ (0, vitest_1.expect)(result.key).toBe("restricted_key");
100
+ (0, vitest_1.expect)(result.status).toBe("error");
101
+ (0, vitest_1.expect)(result.error).toContain("locked");
102
+ (0, vitest_1.expect)(result.entry).toBeUndefined();
103
+ });
104
+ (0, vitest_1.it)("error field is a descriptive string", () => {
105
+ const result = {
106
+ key: "my_key",
107
+ status: "error",
108
+ error: "Some meaningful error description",
109
+ };
110
+ (0, vitest_1.expect)(typeof result.error).toBe("string");
111
+ (0, vitest_1.expect)(result.error.length).toBeGreaterThan(0);
112
+ });
113
+ (0, vitest_1.it)("status is strictly 'ok' or 'error'", () => {
114
+ const ok = {
115
+ key: "k",
116
+ status: "ok",
117
+ entry: makeMinimalEntry("k"),
118
+ };
119
+ const err = {
120
+ key: "k",
121
+ status: "error",
122
+ error: "fail",
123
+ };
124
+ (0, vitest_1.expect)(["ok", "error"]).toContain(ok.status);
125
+ (0, vitest_1.expect)(["ok", "error"]).toContain(err.status);
126
+ });
127
+ });
128
+ // Helper to construct a minimal ConfigEntry
129
+ function makeMinimalEntry(key) {
130
+ return {
131
+ id: "550e8400-e29b-41d4-a716-446655440000",
132
+ tenant_id: "660e8400-e29b-41d4-a716-446655440000",
133
+ key,
134
+ value: "test_value",
135
+ inherited: false,
136
+ source_tenant_id: "660e8400-e29b-41d4-a716-446655440000",
137
+ locked: false,
138
+ sensitive: false,
139
+ created_at: "2024-01-01T00:00:00.000Z",
140
+ updated_at: "2024-01-01T00:00:00.000Z",
141
+ };
142
+ }
143
+ //# sourceMappingURL=config-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.test.js","sourceRoot":"","sources":["../../src/__tests__/config-types.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const errors_js_1 = require("../utils/errors.js");
5
+ (0, vitest_1.describe)("error hierarchy", () => {
6
+ (0, vitest_1.it)("StratumError is an Error", () => {
7
+ const err = new errors_js_1.TenantNotFoundError("test-id");
8
+ (0, vitest_1.expect)(err).toBeInstanceOf(Error);
9
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_js_1.StratumError);
10
+ });
11
+ (0, vitest_1.it)("TenantNotFoundError has correct code and status", () => {
12
+ const err = new errors_js_1.TenantNotFoundError("abc-123");
13
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.TENANT_NOT_FOUND);
14
+ (0, vitest_1.expect)(err.statusCode).toBe(404);
15
+ (0, vitest_1.expect)(err.message).toContain("abc-123");
16
+ });
17
+ (0, vitest_1.it)("TenantAlreadyExistsError has 409 status", () => {
18
+ const err = new errors_js_1.TenantAlreadyExistsError("my-slug");
19
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.TENANT_ALREADY_EXISTS);
20
+ (0, vitest_1.expect)(err.statusCode).toBe(409);
21
+ (0, vitest_1.expect)(err.message).toContain("my-slug");
22
+ });
23
+ (0, vitest_1.it)("TenantHasChildrenError has 409 status", () => {
24
+ const err = new errors_js_1.TenantHasChildrenError("parent-id");
25
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.TENANT_HAS_CHILDREN);
26
+ (0, vitest_1.expect)(err.statusCode).toBe(409);
27
+ (0, vitest_1.expect)(err.message).toContain("parent-id");
28
+ });
29
+ (0, vitest_1.it)("TenantCycleDetectedError has 409 status", () => {
30
+ const err = new errors_js_1.TenantCycleDetectedError("tenant-a", "tenant-b");
31
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.TENANT_CYCLE_DETECTED);
32
+ (0, vitest_1.expect)(err.statusCode).toBe(409);
33
+ (0, vitest_1.expect)(err.message).toContain("tenant-a");
34
+ (0, vitest_1.expect)(err.message).toContain("tenant-b");
35
+ });
36
+ (0, vitest_1.it)("TenantArchivedError has 410 status", () => {
37
+ const err = new errors_js_1.TenantArchivedError("arc-id");
38
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.TENANT_ARCHIVED);
39
+ (0, vitest_1.expect)(err.statusCode).toBe(410);
40
+ (0, vitest_1.expect)(err.message).toContain("arc-id");
41
+ });
42
+ (0, vitest_1.it)("IsolationViolationError has 403 status", () => {
43
+ const err = new errors_js_1.IsolationViolationError("cross-tenant access");
44
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.ISOLATION_VIOLATION);
45
+ (0, vitest_1.expect)(err.statusCode).toBe(403);
46
+ (0, vitest_1.expect)(err.message).toContain("cross-tenant access");
47
+ });
48
+ (0, vitest_1.it)("PermissionLockedError has 403 status and includes key/sourceTenantId", () => {
49
+ // Constructor: (key: string, sourceTenantId: string)
50
+ const err = new errors_js_1.PermissionLockedError("manage_users", "source-tenant-id");
51
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.PERMISSION_LOCKED);
52
+ (0, vitest_1.expect)(err.statusCode).toBe(403);
53
+ (0, vitest_1.expect)(err.message).toContain("manage_users");
54
+ (0, vitest_1.expect)(err.message).toContain("source-tenant-id");
55
+ (0, vitest_1.expect)(err.details).toMatchObject({
56
+ key: "manage_users",
57
+ source_tenant_id: "source-tenant-id",
58
+ });
59
+ });
60
+ (0, vitest_1.it)("ConfigLockedError has 403 status and includes key/sourceTenantId", () => {
61
+ // Constructor: (key: string, sourceTenantId: string)
62
+ const err = new errors_js_1.ConfigLockedError("max_users", "source-tenant-id");
63
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.CONFIG_LOCKED);
64
+ (0, vitest_1.expect)(err.statusCode).toBe(403);
65
+ (0, vitest_1.expect)(err.message).toContain("max_users");
66
+ (0, vitest_1.expect)(err.details).toMatchObject({
67
+ key: "max_users",
68
+ source_tenant_id: "source-tenant-id",
69
+ });
70
+ });
71
+ (0, vitest_1.it)("ValidationError has 400 status", () => {
72
+ const err = new errors_js_1.ValidationError("bad input");
73
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.VALIDATION_ERROR);
74
+ (0, vitest_1.expect)(err.statusCode).toBe(400);
75
+ (0, vitest_1.expect)(err.message).toBe("bad input");
76
+ });
77
+ (0, vitest_1.it)("UnauthorizedError has 401 status", () => {
78
+ const err = new errors_js_1.UnauthorizedError();
79
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.UNAUTHORIZED);
80
+ (0, vitest_1.expect)(err.statusCode).toBe(401);
81
+ });
82
+ (0, vitest_1.it)("UnauthorizedError accepts custom message", () => {
83
+ const err = new errors_js_1.UnauthorizedError("token expired");
84
+ (0, vitest_1.expect)(err.message).toBe("token expired");
85
+ });
86
+ (0, vitest_1.it)("ForbiddenError has 403 status", () => {
87
+ const err = new errors_js_1.ForbiddenError();
88
+ (0, vitest_1.expect)(err.code).toBe(errors_js_1.ErrorCode.FORBIDDEN);
89
+ (0, vitest_1.expect)(err.statusCode).toBe(403);
90
+ });
91
+ (0, vitest_1.it)("ForbiddenError accepts custom message", () => {
92
+ const err = new errors_js_1.ForbiddenError("insufficient permissions");
93
+ (0, vitest_1.expect)(err.message).toBe("insufficient permissions");
94
+ });
95
+ (0, vitest_1.it)("errors serialize to JSON with nested error envelope", () => {
96
+ // toJSON() returns { error: { code, message, ...details } }
97
+ const err = new errors_js_1.TenantNotFoundError("xyz");
98
+ const json = err.toJSON();
99
+ (0, vitest_1.expect)(json.error.code).toBe(errors_js_1.ErrorCode.TENANT_NOT_FOUND);
100
+ (0, vitest_1.expect)(json.error.message).toContain("xyz");
101
+ });
102
+ (0, vitest_1.it)("StratumError toJSON omits details when not provided", () => {
103
+ const err = new errors_js_1.TenantNotFoundError("xyz");
104
+ const json = err.toJSON();
105
+ (0, vitest_1.expect)(json.error).not.toHaveProperty("details");
106
+ });
107
+ (0, vitest_1.it)("StratumError toJSON includes details when provided", () => {
108
+ const err = new errors_js_1.PermissionLockedError("some_key", "some-tenant");
109
+ const json = err.toJSON();
110
+ (0, vitest_1.expect)(json.error).toHaveProperty("details");
111
+ });
112
+ });
113
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=isolation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/isolation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const isolation_js_1 = require("../types/isolation.js");
5
+ (0, vitest_1.describe)("SUPPORTED_ISOLATION_STRATEGIES", () => {
6
+ (0, vitest_1.it)("includes SHARED_RLS", () => {
7
+ (0, vitest_1.expect)(isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES).toContain("SHARED_RLS");
8
+ });
9
+ (0, vitest_1.it)("includes SCHEMA_PER_TENANT", () => {
10
+ (0, vitest_1.expect)(isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES).toContain("SCHEMA_PER_TENANT");
11
+ });
12
+ (0, vitest_1.it)("includes DB_PER_TENANT", () => {
13
+ (0, vitest_1.expect)(isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES).toContain("DB_PER_TENANT");
14
+ });
15
+ (0, vitest_1.it)("SUPPORTED_ISOLATION_STRATEGIES_V1 is an alias for backward compat", () => {
16
+ (0, vitest_1.expect)(isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES_V1).toBe(isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES);
17
+ });
18
+ });
19
+ (0, vitest_1.describe)("isSupportedIsolationStrategy", () => {
20
+ (0, vitest_1.it)("returns true for SHARED_RLS", () => {
21
+ (0, vitest_1.expect)((0, isolation_js_1.isSupportedIsolationStrategy)("SHARED_RLS")).toBe(true);
22
+ });
23
+ (0, vitest_1.it)("returns true for SCHEMA_PER_TENANT", () => {
24
+ (0, vitest_1.expect)((0, isolation_js_1.isSupportedIsolationStrategy)("SCHEMA_PER_TENANT")).toBe(true);
25
+ });
26
+ (0, vitest_1.it)("returns true for DB_PER_TENANT", () => {
27
+ (0, vitest_1.expect)((0, isolation_js_1.isSupportedIsolationStrategy)("DB_PER_TENANT")).toBe(true);
28
+ });
29
+ (0, vitest_1.it)("returns false for unknown strategies", () => {
30
+ (0, vitest_1.expect)((0, isolation_js_1.isSupportedIsolationStrategy)("UNKNOWN")).toBe(false);
31
+ (0, vitest_1.expect)((0, isolation_js_1.isSupportedIsolationStrategy)("")).toBe(false);
32
+ });
33
+ });
34
+ //# sourceMappingURL=isolation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.test.js","sourceRoot":"","sources":["../../src/__tests__/isolation.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,wDAI+B;AAE/B,IAAA,iBAAQ,EAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAA,WAAE,EAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,IAAA,eAAM,EAAC,6CAA8B,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,IAAA,eAAM,EAAC,6CAA8B,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,eAAM,EAAC,6CAA8B,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,IAAA,eAAM,EAAC,gDAAiC,CAAC,CAAC,IAAI,CAAC,6CAA8B,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAA,eAAM,EAAC,IAAA,2CAA4B,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,IAAA,eAAM,EAAC,IAAA,2CAA4B,EAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,eAAM,EAAC,IAAA,2CAA4B,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,IAAA,eAAM,EAAC,IAAA,2CAA4B,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,IAAA,2CAA4B,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const validation_js_1 = require("../utils/validation.js");
5
+ (0, vitest_1.describe)("validation schemas", () => {
6
+ (0, vitest_1.describe)("SlugSchema", () => {
7
+ (0, vitest_1.it)("accepts valid slugs", () => {
8
+ // Must start with lowercase letter, only lowercase letters/numbers/underscores
9
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("acmesec").success).toBe(true);
10
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("northstar_msp").success).toBe(true);
11
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("client_alpha").success).toBe(true);
12
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("a").success).toBe(true); // single char minimum
13
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("a1").success).toBe(true);
14
+ });
15
+ (0, vitest_1.it)("rejects slugs that start with a number", () => {
16
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("1client").success).toBe(false);
17
+ });
18
+ (0, vitest_1.it)("rejects empty string", () => {
19
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("").success).toBe(false);
20
+ });
21
+ (0, vitest_1.it)("rejects slugs with spaces", () => {
22
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("has spaces").success).toBe(false);
23
+ });
24
+ (0, vitest_1.it)("rejects slugs with hyphens (ltree incompatible)", () => {
25
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("has-hyphens").success).toBe(false);
26
+ });
27
+ (0, vitest_1.it)("rejects uppercase letters", () => {
28
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("UPPERCASE").success).toBe(false);
29
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse("MixedCase").success).toBe(false);
30
+ });
31
+ (0, vitest_1.it)("rejects slugs exceeding 63 characters", () => {
32
+ // 64 chars: starts with 'a', followed by 63 more chars
33
+ const tooLong = "a" + "b".repeat(63);
34
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse(tooLong).success).toBe(false);
35
+ });
36
+ (0, vitest_1.it)("accepts slug at exactly 63 characters", () => {
37
+ const maxLength = "a" + "b".repeat(62);
38
+ (0, vitest_1.expect)(maxLength.length).toBe(63);
39
+ (0, vitest_1.expect)(validation_js_1.SlugSchema.safeParse(maxLength).success).toBe(true);
40
+ });
41
+ });
42
+ (0, vitest_1.describe)("UUIDSchema", () => {
43
+ (0, vitest_1.it)("accepts valid UUIDs", () => {
44
+ (0, vitest_1.expect)(validation_js_1.UUIDSchema.safeParse("550e8400-e29b-41d4-a716-446655440000").success).toBe(true);
45
+ });
46
+ (0, vitest_1.it)("rejects non-UUID strings", () => {
47
+ (0, vitest_1.expect)(validation_js_1.UUIDSchema.safeParse("not-a-uuid").success).toBe(false);
48
+ });
49
+ (0, vitest_1.it)("rejects empty string", () => {
50
+ (0, vitest_1.expect)(validation_js_1.UUIDSchema.safeParse("").success).toBe(false);
51
+ });
52
+ (0, vitest_1.it)("rejects UUID without hyphens", () => {
53
+ (0, vitest_1.expect)(validation_js_1.UUIDSchema.safeParse("550e8400e29b41d4a716446655440000").success).toBe(false);
54
+ });
55
+ });
56
+ (0, vitest_1.describe)("PaginationSchema", () => {
57
+ (0, vitest_1.it)("accepts valid pagination with limit", () => {
58
+ const result = validation_js_1.PaginationSchema.safeParse({ limit: 20 });
59
+ (0, vitest_1.expect)(result.success).toBe(true);
60
+ });
61
+ (0, vitest_1.it)("provides default limit of 50 when not specified", () => {
62
+ const result = validation_js_1.PaginationSchema.parse({});
63
+ (0, vitest_1.expect)(result.limit).toBe(50);
64
+ });
65
+ (0, vitest_1.it)("accepts optional cursor as UUID", () => {
66
+ const result = validation_js_1.PaginationSchema.safeParse({
67
+ cursor: "550e8400-e29b-41d4-a716-446655440000",
68
+ limit: 10,
69
+ });
70
+ (0, vitest_1.expect)(result.success).toBe(true);
71
+ });
72
+ (0, vitest_1.it)("rejects non-UUID cursor", () => {
73
+ const result = validation_js_1.PaginationSchema.safeParse({ cursor: "not-a-uuid" });
74
+ (0, vitest_1.expect)(result.success).toBe(false);
75
+ });
76
+ (0, vitest_1.it)("rejects limit below 1", () => {
77
+ (0, vitest_1.expect)(validation_js_1.PaginationSchema.safeParse({ limit: 0 }).success).toBe(false);
78
+ });
79
+ (0, vitest_1.it)("rejects limit above 100", () => {
80
+ (0, vitest_1.expect)(validation_js_1.PaginationSchema.safeParse({ limit: 101 }).success).toBe(false);
81
+ });
82
+ (0, vitest_1.it)("coerces string limit to number", () => {
83
+ const result = validation_js_1.PaginationSchema.safeParse({ limit: "25" });
84
+ (0, vitest_1.expect)(result.success).toBe(true);
85
+ if (result.success) {
86
+ (0, vitest_1.expect)(result.data.limit).toBe(25);
87
+ }
88
+ });
89
+ });
90
+ (0, vitest_1.describe)("validateSlug helper", () => {
91
+ (0, vitest_1.it)("returns true for valid slug", () => {
92
+ (0, vitest_1.expect)((0, validation_js_1.validateSlug)("acme")).toBe(true);
93
+ });
94
+ (0, vitest_1.it)("returns false for invalid slug", () => {
95
+ (0, vitest_1.expect)((0, validation_js_1.validateSlug)("INVALID")).toBe(false);
96
+ (0, vitest_1.expect)((0, validation_js_1.validateSlug)("has-hyphens")).toBe(false);
97
+ });
98
+ });
99
+ });
100
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webhook.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/webhook.test.ts"],"names":[],"mappings":""}