@stratum-hq/control-plane 0.3.0 → 1.0.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 (62) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +3 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/middleware/authorize.d.ts.map +1 -1
  5. package/dist/middleware/authorize.js +7 -2
  6. package/dist/middleware/authorize.js.map +1 -1
  7. package/dist/middleware/tenant-scope.d.ts +70 -6
  8. package/dist/middleware/tenant-scope.d.ts.map +1 -1
  9. package/dist/middleware/tenant-scope.js +160 -30
  10. package/dist/middleware/tenant-scope.js.map +1 -1
  11. package/dist/routes/abac.js +1 -1
  12. package/dist/routes/abac.js.map +1 -1
  13. package/dist/routes/api-keys.d.ts.map +1 -1
  14. package/dist/routes/api-keys.js +5 -1
  15. package/dist/routes/api-keys.js.map +1 -1
  16. package/dist/routes/audit-logs.d.ts.map +1 -1
  17. package/dist/routes/audit-logs.js +3 -0
  18. package/dist/routes/audit-logs.js.map +1 -1
  19. package/dist/routes/config-diff.d.ts.map +1 -1
  20. package/dist/routes/config-diff.js +8 -1
  21. package/dist/routes/config-diff.js.map +1 -1
  22. package/dist/routes/config.js +1 -1
  23. package/dist/routes/config.js.map +1 -1
  24. package/dist/routes/consent.js +1 -1
  25. package/dist/routes/consent.js.map +1 -1
  26. package/dist/routes/maintenance.d.ts.map +1 -1
  27. package/dist/routes/maintenance.js +3 -0
  28. package/dist/routes/maintenance.js.map +1 -1
  29. package/dist/routes/permissions.js +1 -1
  30. package/dist/routes/permissions.js.map +1 -1
  31. package/dist/routes/regions.d.ts.map +1 -1
  32. package/dist/routes/regions.js +3 -0
  33. package/dist/routes/regions.js.map +1 -1
  34. package/dist/routes/roles.d.ts.map +1 -1
  35. package/dist/routes/roles.js +49 -6
  36. package/dist/routes/roles.js.map +1 -1
  37. package/dist/routes/tenants.d.ts.map +1 -1
  38. package/dist/routes/tenants.js +14 -4
  39. package/dist/routes/tenants.js.map +1 -1
  40. package/dist/routes/webhooks.js +1 -1
  41. package/dist/routes/webhooks.js.map +1 -1
  42. package/package.json +16 -2
  43. package/dist/__tests__/api-keys.test.d.ts +0 -2
  44. package/dist/__tests__/api-keys.test.d.ts.map +0 -1
  45. package/dist/__tests__/api-keys.test.js +0 -240
  46. package/dist/__tests__/api-keys.test.js.map +0 -1
  47. package/dist/__tests__/auth.test.d.ts +0 -2
  48. package/dist/__tests__/auth.test.d.ts.map +0 -1
  49. package/dist/__tests__/auth.test.js +0 -229
  50. package/dist/__tests__/auth.test.js.map +0 -1
  51. package/dist/__tests__/config.test.d.ts +0 -2
  52. package/dist/__tests__/config.test.d.ts.map +0 -1
  53. package/dist/__tests__/config.test.js +0 -256
  54. package/dist/__tests__/config.test.js.map +0 -1
  55. package/dist/__tests__/tenants.test.d.ts +0 -2
  56. package/dist/__tests__/tenants.test.d.ts.map +0 -1
  57. package/dist/__tests__/tenants.test.js +0 -214
  58. package/dist/__tests__/tenants.test.js.map +0 -1
  59. package/dist/__tests__/test-helpers.d.ts +0 -71
  60. package/dist/__tests__/test-helpers.d.ts.map +0 -1
  61. package/dist/__tests__/test-helpers.js +0 -176
  62. package/dist/__tests__/test-helpers.js.map +0 -1
@@ -1,176 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SAMPLE_CHILD_TENANT = exports.SAMPLE_TENANT = exports.TEST_JWT_SECRET = void 0;
7
- exports.createMockStratum = createMockStratum;
8
- exports.buildTestApp = buildTestApp;
9
- exports.authHeaders = authHeaders;
10
- exports.jwtHeaders = jwtHeaders;
11
- exports.setupAdminApiKey = setupAdminApiKey;
12
- exports.setupReadOnlyApiKey = setupReadOnlyApiKey;
13
- exports.setupWriteApiKey = setupWriteApiKey;
14
- const fastify_1 = __importDefault(require("fastify"));
15
- const vitest_1 = require("vitest");
16
- const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
17
- const error_handler_js_1 = require("../middleware/error-handler.js");
18
- const auth_js_1 = require("../middleware/auth.js");
19
- const authorize_js_1 = require("../middleware/authorize.js");
20
- const health_js_1 = require("../routes/health.js");
21
- const tenants_js_1 = require("../routes/tenants.js");
22
- const config_js_1 = require("../routes/config.js");
23
- const api_keys_js_1 = require("../routes/api-keys.js");
24
- const config_diff_js_1 = require("../routes/config-diff.js");
25
- // Must match the JWT_SECRET env var set in vitest.config.ts
26
- exports.TEST_JWT_SECRET = "test-jwt-secret-for-unit-tests";
27
- /**
28
- * Create a mock Stratum instance with all methods stubbed via vi.fn().
29
- * Tests override individual method implementations as needed.
30
- */
31
- function createMockStratum() {
32
- return {
33
- // Tenant methods
34
- createTenant: vitest_1.vi.fn(),
35
- getTenant: vitest_1.vi.fn(),
36
- listTenants: vitest_1.vi.fn(),
37
- updateTenant: vitest_1.vi.fn(),
38
- deleteTenant: vitest_1.vi.fn(),
39
- batchCreateTenants: vitest_1.vi.fn(),
40
- moveTenant: vitest_1.vi.fn(),
41
- getAncestors: vitest_1.vi.fn(),
42
- getDescendants: vitest_1.vi.fn(),
43
- getChildren: vitest_1.vi.fn(),
44
- purgeTenant: vitest_1.vi.fn(),
45
- exportTenantData: vitest_1.vi.fn(),
46
- migrateRegion: vitest_1.vi.fn(),
47
- // Config methods
48
- resolveConfig: vitest_1.vi.fn(),
49
- setConfig: vitest_1.vi.fn(),
50
- deleteConfig: vitest_1.vi.fn(),
51
- batchSetConfig: vitest_1.vi.fn(),
52
- getConfigWithInheritance: vitest_1.vi.fn(),
53
- diffConfig: vitest_1.vi.fn(),
54
- // Permission methods
55
- resolvePermissions: vitest_1.vi.fn(),
56
- // API key methods
57
- createApiKey: vitest_1.vi.fn(),
58
- validateApiKey: vitest_1.vi.fn(),
59
- revokeApiKey: vitest_1.vi.fn(),
60
- rotateApiKey: vitest_1.vi.fn(),
61
- listApiKeys: vitest_1.vi.fn(),
62
- listDormantKeys: vitest_1.vi.fn(),
63
- };
64
- }
65
- /**
66
- * Build a test Fastify app with routes registered and middleware wired up.
67
- * Uses the provided mock Stratum instance.
68
- *
69
- * We skip OpenAPI/swagger, helmet, cors, and rate-limit plugins to keep tests fast
70
- * and focused on the HTTP/route/middleware layer.
71
- */
72
- async function buildTestApp(stratum) {
73
- const app = (0, fastify_1.default)({ logger: false });
74
- // Wire up the same middleware chain as the real app
75
- app.addHook("preHandler", (0, auth_js_1.createAuthMiddleware)(stratum));
76
- app.addHook("preHandler", (0, authorize_js_1.createAuthorizeMiddleware)());
77
- app.setErrorHandler(error_handler_js_1.errorHandler);
78
- // Register routes (pass a stub Redis health checker — Redis is not used in tests)
79
- const noopRedisHealth = async () => "not_configured";
80
- await app.register((0, health_js_1.healthRoutes)(noopRedisHealth));
81
- await app.register((0, tenants_js_1.createTenantRoutes)(stratum), { prefix: "/api/v1/tenants" });
82
- await app.register((0, config_js_1.createConfigRoutes)(stratum), { prefix: "/api/v1/tenants/:id/config" });
83
- await app.register((0, api_keys_js_1.createApiKeyRoutes)(stratum), { prefix: "/api/v1/api-keys" });
84
- await app.register((0, config_diff_js_1.createConfigDiffRoutes)(stratum), { prefix: "/api/v1/config" });
85
- await app.ready();
86
- return app;
87
- }
88
- /**
89
- * Helper: returns headers object with a valid API key authentication.
90
- * The mock stratum.validateApiKey must be configured to accept this key.
91
- */
92
- function authHeaders(apiKey = "sk_test_valid_key") {
93
- return { "x-api-key": apiKey };
94
- }
95
- /**
96
- * Helper: returns headers object with a valid JWT Bearer token.
97
- */
98
- function jwtHeaders(payload = {}, secret = exports.TEST_JWT_SECRET) {
99
- const token = jsonwebtoken_1.default.sign({
100
- sub: "test-user-id",
101
- tenant_id: exports.SAMPLE_TENANT.id,
102
- scopes: ["read", "write", "admin"],
103
- ...payload,
104
- }, secret, { algorithm: "HS256", expiresIn: "1h" });
105
- return { authorization: `Bearer ${token}` };
106
- }
107
- /**
108
- * Configure the mock stratum to accept the default test API key
109
- * with admin scopes (read + write + admin). This is the common case.
110
- */
111
- function setupAdminApiKey(stratum) {
112
- stratum.validateApiKey.mockResolvedValue({
113
- key_id: "test-key-id",
114
- tenant_id: null,
115
- scopes: ["read", "write", "admin"],
116
- rate_limit_max: null,
117
- rate_limit_window: null,
118
- });
119
- }
120
- /**
121
- * Configure the mock stratum to accept the default test API key
122
- * with read-only scope.
123
- */
124
- function setupReadOnlyApiKey(stratum) {
125
- stratum.validateApiKey.mockResolvedValue({
126
- key_id: "test-key-id-readonly",
127
- tenant_id: null,
128
- scopes: ["read"],
129
- rate_limit_max: null,
130
- rate_limit_window: null,
131
- });
132
- }
133
- /**
134
- * Configure the mock stratum to accept the default test API key
135
- * with write scope (read + write but not admin).
136
- */
137
- function setupWriteApiKey(stratum) {
138
- stratum.validateApiKey.mockResolvedValue({
139
- key_id: "test-key-id-write",
140
- tenant_id: null,
141
- scopes: ["read", "write"],
142
- rate_limit_max: null,
143
- rate_limit_window: null,
144
- });
145
- }
146
- /** A sample tenant object for test assertions */
147
- exports.SAMPLE_TENANT = {
148
- id: "550e8400-e29b-41d4-a716-446655440000",
149
- slug: "acme_corp",
150
- name: "Acme Corp",
151
- parent_id: null,
152
- ancestry_path: "/550e8400-e29b-41d4-a716-446655440000",
153
- depth: 0,
154
- metadata: {},
155
- isolation_strategy: "SHARED_RLS",
156
- region_id: null,
157
- created_at: new Date("2025-01-01").toISOString(),
158
- updated_at: new Date("2025-01-01").toISOString(),
159
- deleted_at: null,
160
- };
161
- /** A second sample tenant (child) */
162
- exports.SAMPLE_CHILD_TENANT = {
163
- id: "550e8400-e29b-41d4-a716-446655440001",
164
- slug: "acme_division",
165
- name: "Acme Division",
166
- parent_id: "550e8400-e29b-41d4-a716-446655440000",
167
- ancestry_path: "/550e8400-e29b-41d4-a716-446655440000/550e8400-e29b-41d4-a716-446655440001",
168
- depth: 1,
169
- metadata: {},
170
- isolation_strategy: "SHARED_RLS",
171
- region_id: null,
172
- created_at: new Date("2025-01-02").toISOString(),
173
- updated_at: new Date("2025-01-02").toISOString(),
174
- deleted_at: null,
175
- };
176
- //# sourceMappingURL=test-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}