@stratum-hq/core 0.3.1 → 1.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/constants.d.ts +0 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/types/audit.d.ts +44 -0
- package/dist/types/audit.d.ts.map +1 -1
- package/dist/types/audit.js +22 -1
- package/dist/types/audit.js.map +1 -1
- package/dist/types/tenant.d.ts +10 -4
- package/dist/types/tenant.d.ts.map +1 -1
- package/dist/types/tenant.js +1 -0
- package/dist/types/tenant.js.map +1 -1
- package/dist/types/usage.d.ts +91 -0
- package/dist/types/usage.d.ts.map +1 -0
- package/dist/types/usage.js +46 -0
- package/dist/types/usage.js.map +1 -0
- package/dist/types/webhook.d.ts +37 -6
- package/dist/types/webhook.d.ts.map +1 -1
- package/dist/types/webhook.js +4 -0
- package/dist/types/webhook.js.map +1 -1
- package/dist/utils/errors.d.ts +26 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +38 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/scopes.d.ts +12 -0
- package/dist/utils/scopes.d.ts.map +1 -0
- package/dist/utils/scopes.js +33 -0
- package/dist/utils/scopes.js.map +1 -0
- package/package.json +10 -2
- package/dist/__tests__/ancestry.test.d.ts +0 -2
- package/dist/__tests__/ancestry.test.d.ts.map +0 -1
- package/dist/__tests__/ancestry.test.js +0 -132
- package/dist/__tests__/ancestry.test.js.map +0 -1
- package/dist/__tests__/config-types.test.d.ts +0 -2
- package/dist/__tests__/config-types.test.d.ts.map +0 -1
- package/dist/__tests__/config-types.test.js +0 -143
- package/dist/__tests__/config-types.test.js.map +0 -1
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -113
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/isolation.test.d.ts +0 -2
- package/dist/__tests__/isolation.test.d.ts.map +0 -1
- package/dist/__tests__/isolation.test.js +0 -34
- package/dist/__tests__/isolation.test.js.map +0 -1
- package/dist/__tests__/validation.test.d.ts +0 -2
- package/dist/__tests__/validation.test.d.ts.map +0 -1
- package/dist/__tests__/validation.test.js +0 -122
- package/dist/__tests__/validation.test.js.map +0 -1
- package/dist/__tests__/webhook.test.d.ts +0 -2
- package/dist/__tests__/webhook.test.d.ts.map +0 -1
- package/dist/__tests__/webhook.test.js +0 -165
- package/dist/__tests__/webhook.test.js.map +0 -1
|
@@ -1,113 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isolation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/isolation.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,34 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,122 +0,0 @@
|
|
|
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)("SLUG_REGEX", () => {
|
|
91
|
-
(0, vitest_1.it)("matches valid slugs", () => {
|
|
92
|
-
(0, vitest_1.expect)(validation_js_1.SLUG_REGEX.test("acme")).toBe(true);
|
|
93
|
-
(0, vitest_1.expect)(validation_js_1.SLUG_REGEX.test("a1_test")).toBe(true);
|
|
94
|
-
});
|
|
95
|
-
(0, vitest_1.it)("rejects invalid slugs", () => {
|
|
96
|
-
(0, vitest_1.expect)(validation_js_1.SLUG_REGEX.test("UPPER")).toBe(false);
|
|
97
|
-
(0, vitest_1.expect)(validation_js_1.SLUG_REGEX.test("1start")).toBe(false);
|
|
98
|
-
(0, vitest_1.expect)(validation_js_1.SLUG_REGEX.test("")).toBe(false);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
(0, vitest_1.describe)("validateSlug helper", () => {
|
|
102
|
-
(0, vitest_1.it)("returns the slug for valid input", () => {
|
|
103
|
-
(0, vitest_1.expect)((0, validation_js_1.validateSlug)("acme")).toBe("acme");
|
|
104
|
-
(0, vitest_1.expect)((0, validation_js_1.validateSlug)("tenant_123")).toBe("tenant_123");
|
|
105
|
-
});
|
|
106
|
-
(0, vitest_1.it)("throws for invalid slug", () => {
|
|
107
|
-
(0, vitest_1.expect)(() => (0, validation_js_1.validateSlug)("INVALID")).toThrow("Invalid tenant slug");
|
|
108
|
-
(0, vitest_1.expect)(() => (0, validation_js_1.validateSlug)("has-hyphens")).toThrow("Invalid tenant slug");
|
|
109
|
-
(0, vitest_1.expect)(() => (0, validation_js_1.validateSlug)("")).toThrow("Invalid tenant slug");
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
(0, vitest_1.describe)("isValidSlug helper", () => {
|
|
113
|
-
(0, vitest_1.it)("returns true for valid slug", () => {
|
|
114
|
-
(0, vitest_1.expect)((0, validation_js_1.isValidSlug)("acme")).toBe(true);
|
|
115
|
-
});
|
|
116
|
-
(0, vitest_1.it)("returns false for invalid slug", () => {
|
|
117
|
-
(0, vitest_1.expect)((0, validation_js_1.isValidSlug)("INVALID")).toBe(false);
|
|
118
|
-
(0, vitest_1.expect)((0, validation_js_1.isValidSlug)("has-hyphens")).toBe(false);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
//# sourceMappingURL=validation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/webhook.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const webhook_js_1 = require("../types/webhook.js");
|
|
5
|
-
(0, vitest_1.describe)("TenantEvent", () => {
|
|
6
|
-
(0, vitest_1.it)("has correct string values", () => {
|
|
7
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.TENANT_CREATED).toBe("tenant.created");
|
|
8
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.TENANT_UPDATED).toBe("tenant.updated");
|
|
9
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.TENANT_DELETED).toBe("tenant.deleted");
|
|
10
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.TENANT_MOVED).toBe("tenant.moved");
|
|
11
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.CONFIG_UPDATED).toBe("config.updated");
|
|
12
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.CONFIG_DELETED).toBe("config.deleted");
|
|
13
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.PERMISSION_CREATED).toBe("permission.created");
|
|
14
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.PERMISSION_UPDATED).toBe("permission.updated");
|
|
15
|
-
(0, vitest_1.expect)(webhook_js_1.TenantEvent.PERMISSION_DELETED).toBe("permission.deleted");
|
|
16
|
-
});
|
|
17
|
-
(0, vitest_1.it)("has 9 event types", () => {
|
|
18
|
-
(0, vitest_1.expect)(Object.keys(webhook_js_1.TenantEvent)).toHaveLength(9);
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
(0, vitest_1.describe)("WebhookSchema", () => {
|
|
22
|
-
const validWebhook = {
|
|
23
|
-
id: "550e8400-e29b-41d4-a716-446655440000",
|
|
24
|
-
tenant_id: "550e8400-e29b-41d4-a716-446655440001",
|
|
25
|
-
url: "https://example.com/webhook",
|
|
26
|
-
secret_hash: "abc123def456",
|
|
27
|
-
events: ["tenant.created", "tenant.updated"],
|
|
28
|
-
active: true,
|
|
29
|
-
created_at: "2024-01-01T00:00:00.000Z",
|
|
30
|
-
updated_at: "2024-01-01T00:00:00.000Z",
|
|
31
|
-
};
|
|
32
|
-
(0, vitest_1.it)("parses a valid webhook", () => {
|
|
33
|
-
const result = webhook_js_1.WebhookSchema.safeParse(validWebhook);
|
|
34
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
35
|
-
});
|
|
36
|
-
(0, vitest_1.it)("accepts null tenant_id (global webhook)", () => {
|
|
37
|
-
const result = webhook_js_1.WebhookSchema.safeParse({ ...validWebhook, tenant_id: null });
|
|
38
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
39
|
-
});
|
|
40
|
-
(0, vitest_1.it)("accepts optional description", () => {
|
|
41
|
-
const result = webhook_js_1.WebhookSchema.safeParse({ ...validWebhook, description: "My webhook" });
|
|
42
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
43
|
-
if (result.success) {
|
|
44
|
-
(0, vitest_1.expect)(result.data.description).toBe("My webhook");
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
(0, vitest_1.it)("rejects description over 255 chars", () => {
|
|
48
|
-
const result = webhook_js_1.WebhookSchema.safeParse({ ...validWebhook, description: "x".repeat(256) });
|
|
49
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
(0, vitest_1.it)("rejects invalid URL", () => {
|
|
52
|
-
const result = webhook_js_1.WebhookSchema.safeParse({ ...validWebhook, url: "not-a-url" });
|
|
53
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
54
|
-
});
|
|
55
|
-
(0, vitest_1.it)("rejects invalid UUID for id", () => {
|
|
56
|
-
const result = webhook_js_1.WebhookSchema.safeParse({ ...validWebhook, id: "not-a-uuid" });
|
|
57
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
(0, vitest_1.describe)("CreateWebhookInputSchema", () => {
|
|
61
|
-
const validInput = {
|
|
62
|
-
tenant_id: null,
|
|
63
|
-
url: "https://example.com/webhook",
|
|
64
|
-
secret: "mysecretatleast16chars",
|
|
65
|
-
events: [webhook_js_1.TenantEvent.TENANT_CREATED],
|
|
66
|
-
};
|
|
67
|
-
(0, vitest_1.it)("parses valid input", () => {
|
|
68
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse(validInput);
|
|
69
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
(0, vitest_1.it)("rejects secret shorter than 16 chars", () => {
|
|
72
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse({ ...validInput, secret: "tooshort" });
|
|
73
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
74
|
-
});
|
|
75
|
-
(0, vitest_1.it)("rejects secret longer than 255 chars", () => {
|
|
76
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse({ ...validInput, secret: "x".repeat(256) });
|
|
77
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
78
|
-
});
|
|
79
|
-
(0, vitest_1.it)("rejects empty events array", () => {
|
|
80
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse({ ...validInput, events: [] });
|
|
81
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
82
|
-
});
|
|
83
|
-
(0, vitest_1.it)("rejects invalid event type", () => {
|
|
84
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse({ ...validInput, events: ["unknown.event"] });
|
|
85
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
86
|
-
});
|
|
87
|
-
(0, vitest_1.it)("rejects invalid URL", () => {
|
|
88
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse({ ...validInput, url: "not-a-url-at-all" });
|
|
89
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
(0, vitest_1.it)("defaults tenant_id to null", () => {
|
|
92
|
-
const { tenant_id: _t, ...withoutTenantId } = validInput;
|
|
93
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse(withoutTenantId);
|
|
94
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
95
|
-
if (result.success) {
|
|
96
|
-
(0, vitest_1.expect)(result.data.tenant_id).toBeNull();
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
(0, vitest_1.it)("accepts a description", () => {
|
|
100
|
-
const result = webhook_js_1.CreateWebhookInputSchema.safeParse({ ...validInput, description: "Test hook" });
|
|
101
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
(0, vitest_1.describe)("UpdateWebhookInputSchema", () => {
|
|
105
|
-
(0, vitest_1.it)("accepts empty object (no-op update)", () => {
|
|
106
|
-
const result = webhook_js_1.UpdateWebhookInputSchema.safeParse({});
|
|
107
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
108
|
-
});
|
|
109
|
-
(0, vitest_1.it)("accepts partial updates", () => {
|
|
110
|
-
const result = webhook_js_1.UpdateWebhookInputSchema.safeParse({ active: false });
|
|
111
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
112
|
-
});
|
|
113
|
-
(0, vitest_1.it)("rejects events with invalid event type", () => {
|
|
114
|
-
const result = webhook_js_1.UpdateWebhookInputSchema.safeParse({ events: ["bad.event"] });
|
|
115
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
116
|
-
});
|
|
117
|
-
(0, vitest_1.it)("rejects empty events array", () => {
|
|
118
|
-
const result = webhook_js_1.UpdateWebhookInputSchema.safeParse({ events: [] });
|
|
119
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
(0, vitest_1.describe)("WebhookDeliveryStatus", () => {
|
|
123
|
-
(0, vitest_1.it)("has correct values", () => {
|
|
124
|
-
(0, vitest_1.expect)(webhook_js_1.WebhookDeliveryStatus.PENDING).toBe("pending");
|
|
125
|
-
(0, vitest_1.expect)(webhook_js_1.WebhookDeliveryStatus.SUCCESS).toBe("success");
|
|
126
|
-
(0, vitest_1.expect)(webhook_js_1.WebhookDeliveryStatus.FAILED).toBe("failed");
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
(0, vitest_1.describe)("WebhookDeliverySchema", () => {
|
|
130
|
-
const validDelivery = {
|
|
131
|
-
id: "550e8400-e29b-41d4-a716-446655440000",
|
|
132
|
-
webhook_id: "550e8400-e29b-41d4-a716-446655440001",
|
|
133
|
-
event_id: "550e8400-e29b-41d4-a716-446655440002",
|
|
134
|
-
status: "pending",
|
|
135
|
-
attempts: 0,
|
|
136
|
-
next_retry_at: null,
|
|
137
|
-
last_error: null,
|
|
138
|
-
response_code: null,
|
|
139
|
-
created_at: "2024-01-01T00:00:00.000Z",
|
|
140
|
-
completed_at: null,
|
|
141
|
-
};
|
|
142
|
-
(0, vitest_1.it)("parses a valid pending delivery", () => {
|
|
143
|
-
const result = webhook_js_1.WebhookDeliverySchema.safeParse(validDelivery);
|
|
144
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
145
|
-
});
|
|
146
|
-
(0, vitest_1.it)("parses a successful delivery", () => {
|
|
147
|
-
const result = webhook_js_1.WebhookDeliverySchema.safeParse({
|
|
148
|
-
...validDelivery,
|
|
149
|
-
status: "success",
|
|
150
|
-
attempts: 1,
|
|
151
|
-
response_code: 200,
|
|
152
|
-
completed_at: "2024-01-01T00:00:01.000Z",
|
|
153
|
-
});
|
|
154
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
155
|
-
});
|
|
156
|
-
(0, vitest_1.it)("rejects invalid status", () => {
|
|
157
|
-
const result = webhook_js_1.WebhookDeliverySchema.safeParse({ ...validDelivery, status: "retrying" });
|
|
158
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
159
|
-
});
|
|
160
|
-
(0, vitest_1.it)("rejects negative attempts", () => {
|
|
161
|
-
const result = webhook_js_1.WebhookDeliverySchema.safeParse({ ...validDelivery, attempts: -1 });
|
|
162
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
//# sourceMappingURL=webhook.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.test.js","sourceRoot":"","sources":["../../src/__tests__/webhook.test.ts"],"names":[],"mappings":"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"}
|