@stratum-hq/core 0.3.1 → 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 (39) hide show
  1. package/dist/constants.d.ts +0 -1
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +1 -2
  4. package/dist/constants.js.map +1 -1
  5. package/dist/index.d.ts +4 -3
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +5 -3
  8. package/dist/index.js.map +1 -1
  9. package/dist/types/tenant.d.ts +6 -2
  10. package/dist/types/tenant.d.ts.map +1 -1
  11. package/dist/utils/scopes.d.ts +12 -0
  12. package/dist/utils/scopes.d.ts.map +1 -0
  13. package/dist/utils/scopes.js +33 -0
  14. package/dist/utils/scopes.js.map +1 -0
  15. package/package.json +10 -2
  16. package/dist/__tests__/ancestry.test.d.ts +0 -2
  17. package/dist/__tests__/ancestry.test.d.ts.map +0 -1
  18. package/dist/__tests__/ancestry.test.js +0 -132
  19. package/dist/__tests__/ancestry.test.js.map +0 -1
  20. package/dist/__tests__/config-types.test.d.ts +0 -2
  21. package/dist/__tests__/config-types.test.d.ts.map +0 -1
  22. package/dist/__tests__/config-types.test.js +0 -143
  23. package/dist/__tests__/config-types.test.js.map +0 -1
  24. package/dist/__tests__/errors.test.d.ts +0 -2
  25. package/dist/__tests__/errors.test.d.ts.map +0 -1
  26. package/dist/__tests__/errors.test.js +0 -113
  27. package/dist/__tests__/errors.test.js.map +0 -1
  28. package/dist/__tests__/isolation.test.d.ts +0 -2
  29. package/dist/__tests__/isolation.test.d.ts.map +0 -1
  30. package/dist/__tests__/isolation.test.js +0 -34
  31. package/dist/__tests__/isolation.test.js.map +0 -1
  32. package/dist/__tests__/validation.test.d.ts +0 -2
  33. package/dist/__tests__/validation.test.d.ts.map +0 -1
  34. package/dist/__tests__/validation.test.js +0 -122
  35. package/dist/__tests__/validation.test.js.map +0 -1
  36. package/dist/__tests__/webhook.test.d.ts +0 -2
  37. package/dist/__tests__/webhook.test.d.ts.map +0 -1
  38. package/dist/__tests__/webhook.test.js +0 -165
  39. package/dist/__tests__/webhook.test.js.map +0 -1
@@ -1,4 +1,3 @@
1
- export declare const MAX_TREE_DEPTH = 20;
2
1
  export declare const MAX_SLUG_LENGTH = 63;
3
2
  export declare const DEFAULT_CACHE_TTL_MS = 60000;
4
3
  export declare const DEFAULT_PAGE_SIZE = 50;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,aAAa,gBAAgB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,aAAa,gBAAgB,CAAC"}
package/dist/constants.js CHANGED
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TENANT_HEADER = exports.API_KEY_BYTES = exports.API_KEY_PREFIX = exports.MAX_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_CACHE_TTL_MS = exports.MAX_SLUG_LENGTH = exports.MAX_TREE_DEPTH = void 0;
4
- exports.MAX_TREE_DEPTH = 20;
3
+ exports.TENANT_HEADER = exports.API_KEY_BYTES = exports.API_KEY_PREFIX = exports.MAX_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_CACHE_TTL_MS = exports.MAX_SLUG_LENGTH = void 0;
5
4
  exports.MAX_SLUG_LENGTH = 63;
6
5
  exports.DEFAULT_CACHE_TTL_MS = 60_000;
7
6
  exports.DEFAULT_PAGE_SIZE = 50;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,EAAE,CAAC;AACpB,QAAA,eAAe,GAAG,EAAE,CAAC;AACrB,QAAA,oBAAoB,GAAG,MAAM,CAAC;AAC9B,QAAA,iBAAiB,GAAG,EAAE,CAAC;AACvB,QAAA,aAAa,GAAG,GAAG,CAAC;AACpB,QAAA,cAAc,GAAG,UAAU,CAAC;AAC5B,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,aAAa,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,EAAE,CAAC;AACrB,QAAA,oBAAoB,GAAG,MAAM,CAAC;AAC9B,QAAA,iBAAiB,GAAG,EAAE,CAAC;AACvB,QAAA,aAAa,GAAG,GAAG,CAAC;AACpB,QAAA,cAAc,GAAG,UAAU,CAAC;AAC5B,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,aAAa,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  export { ConsentPurpose, ConsentRecordSchema, GrantConsentInputSchema, type ConsentRecord, type GrantConsentInput, } from "./types/consent.js";
2
2
  export { API_KEY_SCOPES, ApiKeyScopeSchema, type ApiKeyScope, } from "./types/api-key.js";
3
+ export { scopeSatisfies } from "./utils/scopes.js";
3
4
  export { AuditEntrySchema, AuditLogQuerySchema, type AuditContext, type AuditEntry, type AuditLogQuery, } from "./types/audit.js";
4
5
  export { TenantEvent, WebhookSchema, CreateWebhookInputSchema, UpdateWebhookInputSchema, WebhookEventSchema, WebhookDeliveryStatus, WebhookDeliverySchema, type Webhook, type CreateWebhookInput, type UpdateWebhookInput, type WebhookEvent, type WebhookDelivery, } from "./types/webhook.js";
5
6
  export { RegionStatus, RegionSchema, CreateRegionInputSchema, UpdateRegionInputSchema, MigrateRegionInputSchema, type Region, type CreateRegionInput, type UpdateRegionInput, type MigrateRegionInput, } from "./types/region.js";
6
- export { IsolationStrategy, TenantStatus, TenantNodeSchema, CreateTenantInputSchema, UpdateTenantInputSchema, MoveTenantInputSchema, type TenantNode, type CreateTenantInput, type UpdateTenantInput, type MoveTenantInput, type TenantContext, type TenantContextLegacy, type ResolvedPermission, } from "./types/tenant.js";
7
+ export { IsolationStrategy, TenantStatus, TenantNodeSchema, CreateTenantInputSchema, UpdateTenantInputSchema, MoveTenantInputSchema, type TenantNode, type CreateTenantInput, type UpdateTenantInput, type MoveTenantInput, type TenantContext, type ResolvedTenantContext, type ResolvedPermission, } from "./types/tenant.js";
7
8
  export { PermissionMode, RevocationMode, PermissionPolicySchema, CreatePermissionInputSchema, UpdatePermissionInputSchema, type PermissionPolicy, type CreatePermissionInput, type UpdatePermissionInput, } from "./types/permission.js";
8
9
  export { ConfigEntrySchema, SetConfigInputSchema, type ConfigEntry, type SetConfigInput, type ResolvedConfigEntry, type ResolvedConfig, type BatchSetConfigKeyResult, type BatchSetConfigResult, type ConfigDiffEntry, type ConfigDiffItem, type ConfigDiffTenantInfo, type ConfigDiff, type DriftStatus, type DriftDetail, type DriftResult, type BatchDriftResult, } from "./types/config.js";
9
- export { SUPPORTED_ISOLATION_STRATEGIES_V1, isSupportedIsolationStrategy, } from "./types/isolation.js";
10
+ export { SUPPORTED_ISOLATION_STRATEGIES, SUPPORTED_ISOLATION_STRATEGIES_V1, isSupportedIsolationStrategy, } from "./types/isolation.js";
10
11
  export { parseAncestryPath, buildAncestryPath, getDepth, isAncestorOf, isDescendantOf, getParentPath, appendToPath, getAncestorIds, getSelfId, } from "./utils/ancestry.js";
11
12
  export { SLUG_REGEX, SlugSchema, UUIDSchema, PaginationSchema, validateSlug, isValidSlug, type PaginationInput, type PaginatedResult, } from "./utils/validation.js";
12
13
  export { CreateAbacPolicyInputSchema, AbacEvaluationRequestSchema, type AbacOperator, type AbacCondition, type AbacPolicy, type CreateAbacPolicyInput, type AbacEvaluationRequest, type AbacEvaluationResult, type ResolvedAbacPolicy, } from "./types/abac.js";
13
14
  export { ErrorCode, StratumError, TenantNotFoundError, TenantAlreadyExistsError, TenantHasChildrenError, TenantCycleDetectedError, TenantArchivedError, TenantContextNotFoundError, IsolationViolationError, IsolationStrategyUnsupportedError, PermissionLockedError, PermissionNotFoundError, PermissionRevocationDeniedError, ConfigLockedError, ConfigNotFoundError, ValidationError, UnauthorizedError, ForbiddenError, WebhookNotFoundError, WebhookDeliveryError, AbacPolicyNotFoundError, InvalidAbacOperatorError, AbacPolicyLockedError, } from "./utils/errors.js";
14
- export { MAX_TREE_DEPTH, MAX_SLUG_LENGTH, DEFAULT_CACHE_TTL_MS, DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE, API_KEY_PREFIX, API_KEY_BYTES, TENANT_HEADER, } from "./constants.js";
15
+ export { MAX_SLUG_LENGTH, DEFAULT_CACHE_TTL_MS, DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE, API_KEY_PREFIX, API_KEY_BYTES, TENANT_HEADER, } from "./constants.js";
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CreateAbacPolicyInputSchema = exports.isValidSlug = exports.validateSlug = exports.PaginationSchema = exports.UUIDSchema = exports.SlugSchema = exports.SLUG_REGEX = exports.getSelfId = exports.getAncestorIds = exports.appendToPath = exports.getParentPath = exports.isDescendantOf = exports.isAncestorOf = exports.getDepth = exports.buildAncestryPath = exports.parseAncestryPath = exports.isSupportedIsolationStrategy = exports.SUPPORTED_ISOLATION_STRATEGIES_V1 = exports.SetConfigInputSchema = exports.ConfigEntrySchema = exports.UpdatePermissionInputSchema = exports.CreatePermissionInputSchema = exports.PermissionPolicySchema = exports.RevocationMode = exports.PermissionMode = exports.MoveTenantInputSchema = exports.UpdateTenantInputSchema = exports.CreateTenantInputSchema = exports.TenantNodeSchema = exports.TenantStatus = exports.IsolationStrategy = exports.MigrateRegionInputSchema = exports.UpdateRegionInputSchema = exports.CreateRegionInputSchema = exports.RegionSchema = exports.RegionStatus = exports.WebhookDeliverySchema = exports.WebhookDeliveryStatus = exports.WebhookEventSchema = exports.UpdateWebhookInputSchema = exports.CreateWebhookInputSchema = exports.WebhookSchema = exports.TenantEvent = exports.AuditLogQuerySchema = exports.AuditEntrySchema = exports.ApiKeyScopeSchema = exports.API_KEY_SCOPES = exports.GrantConsentInputSchema = exports.ConsentRecordSchema = exports.ConsentPurpose = void 0;
4
- exports.TENANT_HEADER = exports.API_KEY_BYTES = exports.API_KEY_PREFIX = exports.MAX_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_CACHE_TTL_MS = exports.MAX_SLUG_LENGTH = exports.MAX_TREE_DEPTH = exports.AbacPolicyLockedError = exports.InvalidAbacOperatorError = exports.AbacPolicyNotFoundError = exports.WebhookDeliveryError = exports.WebhookNotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.ValidationError = exports.ConfigNotFoundError = exports.ConfigLockedError = exports.PermissionRevocationDeniedError = exports.PermissionNotFoundError = exports.PermissionLockedError = exports.IsolationStrategyUnsupportedError = exports.IsolationViolationError = exports.TenantContextNotFoundError = exports.TenantArchivedError = exports.TenantCycleDetectedError = exports.TenantHasChildrenError = exports.TenantAlreadyExistsError = exports.TenantNotFoundError = exports.StratumError = exports.ErrorCode = exports.AbacEvaluationRequestSchema = void 0;
3
+ exports.validateSlug = exports.PaginationSchema = exports.UUIDSchema = exports.SlugSchema = exports.SLUG_REGEX = exports.getSelfId = exports.getAncestorIds = exports.appendToPath = exports.getParentPath = exports.isDescendantOf = exports.isAncestorOf = exports.getDepth = exports.buildAncestryPath = exports.parseAncestryPath = exports.isSupportedIsolationStrategy = exports.SUPPORTED_ISOLATION_STRATEGIES_V1 = exports.SUPPORTED_ISOLATION_STRATEGIES = exports.SetConfigInputSchema = exports.ConfigEntrySchema = exports.UpdatePermissionInputSchema = exports.CreatePermissionInputSchema = exports.PermissionPolicySchema = exports.RevocationMode = exports.PermissionMode = exports.MoveTenantInputSchema = exports.UpdateTenantInputSchema = exports.CreateTenantInputSchema = exports.TenantNodeSchema = exports.TenantStatus = exports.IsolationStrategy = exports.MigrateRegionInputSchema = exports.UpdateRegionInputSchema = exports.CreateRegionInputSchema = exports.RegionSchema = exports.RegionStatus = exports.WebhookDeliverySchema = exports.WebhookDeliveryStatus = exports.WebhookEventSchema = exports.UpdateWebhookInputSchema = exports.CreateWebhookInputSchema = exports.WebhookSchema = exports.TenantEvent = exports.AuditLogQuerySchema = exports.AuditEntrySchema = exports.scopeSatisfies = exports.ApiKeyScopeSchema = exports.API_KEY_SCOPES = exports.GrantConsentInputSchema = exports.ConsentRecordSchema = exports.ConsentPurpose = void 0;
4
+ exports.TENANT_HEADER = exports.API_KEY_BYTES = exports.API_KEY_PREFIX = exports.MAX_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_CACHE_TTL_MS = exports.MAX_SLUG_LENGTH = exports.AbacPolicyLockedError = exports.InvalidAbacOperatorError = exports.AbacPolicyNotFoundError = exports.WebhookDeliveryError = exports.WebhookNotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.ValidationError = exports.ConfigNotFoundError = exports.ConfigLockedError = exports.PermissionRevocationDeniedError = exports.PermissionNotFoundError = exports.PermissionLockedError = exports.IsolationStrategyUnsupportedError = exports.IsolationViolationError = exports.TenantContextNotFoundError = exports.TenantArchivedError = exports.TenantCycleDetectedError = exports.TenantHasChildrenError = exports.TenantAlreadyExistsError = exports.TenantNotFoundError = exports.StratumError = exports.ErrorCode = exports.AbacEvaluationRequestSchema = exports.CreateAbacPolicyInputSchema = exports.isValidSlug = void 0;
5
5
  // Consent types
6
6
  var consent_js_1 = require("./types/consent.js");
7
7
  Object.defineProperty(exports, "ConsentPurpose", { enumerable: true, get: function () { return consent_js_1.ConsentPurpose; } });
@@ -11,6 +11,8 @@ Object.defineProperty(exports, "GrantConsentInputSchema", { enumerable: true, ge
11
11
  var api_key_js_1 = require("./types/api-key.js");
12
12
  Object.defineProperty(exports, "API_KEY_SCOPES", { enumerable: true, get: function () { return api_key_js_1.API_KEY_SCOPES; } });
13
13
  Object.defineProperty(exports, "ApiKeyScopeSchema", { enumerable: true, get: function () { return api_key_js_1.ApiKeyScopeSchema; } });
14
+ var scopes_js_1 = require("./utils/scopes.js");
15
+ Object.defineProperty(exports, "scopeSatisfies", { enumerable: true, get: function () { return scopes_js_1.scopeSatisfies; } });
14
16
  // Audit types
15
17
  var audit_js_1 = require("./types/audit.js");
16
18
  Object.defineProperty(exports, "AuditEntrySchema", { enumerable: true, get: function () { return audit_js_1.AuditEntrySchema; } });
@@ -49,6 +51,7 @@ var config_js_1 = require("./types/config.js");
49
51
  Object.defineProperty(exports, "ConfigEntrySchema", { enumerable: true, get: function () { return config_js_1.ConfigEntrySchema; } });
50
52
  Object.defineProperty(exports, "SetConfigInputSchema", { enumerable: true, get: function () { return config_js_1.SetConfigInputSchema; } });
51
53
  var isolation_js_1 = require("./types/isolation.js");
54
+ Object.defineProperty(exports, "SUPPORTED_ISOLATION_STRATEGIES", { enumerable: true, get: function () { return isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES; } });
52
55
  Object.defineProperty(exports, "SUPPORTED_ISOLATION_STRATEGIES_V1", { enumerable: true, get: function () { return isolation_js_1.SUPPORTED_ISOLATION_STRATEGIES_V1; } });
53
56
  Object.defineProperty(exports, "isSupportedIsolationStrategy", { enumerable: true, get: function () { return isolation_js_1.isSupportedIsolationStrategy; } });
54
57
  // Utilities
@@ -100,7 +103,6 @@ Object.defineProperty(exports, "InvalidAbacOperatorError", { enumerable: true, g
100
103
  Object.defineProperty(exports, "AbacPolicyLockedError", { enumerable: true, get: function () { return errors_js_1.AbacPolicyLockedError; } });
101
104
  // Constants
102
105
  var constants_js_1 = require("./constants.js");
103
- Object.defineProperty(exports, "MAX_TREE_DEPTH", { enumerable: true, get: function () { return constants_js_1.MAX_TREE_DEPTH; } });
104
106
  Object.defineProperty(exports, "MAX_SLUG_LENGTH", { enumerable: true, get: function () { return constants_js_1.MAX_SLUG_LENGTH; } });
105
107
  Object.defineProperty(exports, "DEFAULT_CACHE_TTL_MS", { enumerable: true, get: function () { return constants_js_1.DEFAULT_CACHE_TTL_MS; } });
106
108
  Object.defineProperty(exports, "DEFAULT_PAGE_SIZE", { enumerable: true, get: function () { return constants_js_1.DEFAULT_PAGE_SIZE; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -123,8 +123,12 @@ export declare const MoveTenantInputSchema: z.ZodObject<{
123
123
  new_parent_id: string;
124
124
  }>;
125
125
  export type MoveTenantInput = z.infer<typeof MoveTenantInputSchema>;
126
- /** Legacy shape used by the inline /:id/context endpoint. */
127
- export interface TenantContextLegacy {
126
+ /**
127
+ * Flat, resolved per-request tenant context: the shape served by the
128
+ * /:id/context endpoint and stored in the SDK's request-scoped context.
129
+ * Distinct from the richer object-graph {@link TenantContext}.
130
+ */
131
+ export interface ResolvedTenantContext {
128
132
  tenant_id: string;
129
133
  ancestry_path: string;
130
134
  depth: number;
@@ -1 +1 @@
1
- {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/types/tenant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7D,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgB3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAalC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAQlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACzD,kBAAkB,EAAE,iBAAiB,CAAC;CACvC;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/types/tenant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7D,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgB3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAalC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAQlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACzD,kBAAkB,EAAE,iBAAiB,CAAC;CACvC;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,12 @@
1
+ import { type ApiKeyScope } from "../types/api-key.js";
2
+ /**
3
+ * True when `granted` satisfies `required` under the read < write < admin
4
+ * hierarchy: the key holds at least one scope whose rank is >= the required
5
+ * scope's rank. This is the single scope-check primitive; use it everywhere a
6
+ * scope requirement is evaluated rather than a flat `includes`.
7
+ *
8
+ * Fails closed: an unrecognized `required` scope (rank 0) is satisfied by
9
+ * nothing, and unrecognized granted scopes contribute no rank.
10
+ */
11
+ export declare function scopeSatisfies(granted: readonly string[], required: ApiKeyScope): boolean;
12
+ //# sourceMappingURL=scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/utils/scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAkBvD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,QAAQ,EAAE,WAAW,GACpB,OAAO,CAIT"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scopeSatisfies = scopeSatisfies;
4
+ /**
5
+ * API-key scopes form a hierarchy: read < write < admin. A granted scope
6
+ * satisfies any required scope of equal-or-lower rank, so `admin` implies
7
+ * `write` implies `read`.
8
+ */
9
+ const SCOPE_RANK = {
10
+ read: 1,
11
+ write: 2,
12
+ admin: 3,
13
+ };
14
+ /** Rank of a scope string, or 0 for any unrecognized scope. */
15
+ function rankOf(scope) {
16
+ return SCOPE_RANK[scope] ?? 0;
17
+ }
18
+ /**
19
+ * True when `granted` satisfies `required` under the read < write < admin
20
+ * hierarchy: the key holds at least one scope whose rank is >= the required
21
+ * scope's rank. This is the single scope-check primitive; use it everywhere a
22
+ * scope requirement is evaluated rather than a flat `includes`.
23
+ *
24
+ * Fails closed: an unrecognized `required` scope (rank 0) is satisfied by
25
+ * nothing, and unrecognized granted scopes contribute no rank.
26
+ */
27
+ function scopeSatisfies(granted, required) {
28
+ const need = rankOf(required);
29
+ if (need === 0)
30
+ return false;
31
+ return granted.some((scope) => rankOf(scope) >= need);
32
+ }
33
+ //# sourceMappingURL=scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.js","sourceRoot":"","sources":["../../src/utils/scopes.ts"],"names":[],"mappings":";;AA2BA,wCAOC;AAhCD;;;;GAIG;AACH,MAAM,UAAU,GAAgC;IAC9C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,+DAA+D;AAC/D,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,KAAoB,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,OAA0B,EAC1B,QAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;AACxD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stratum-hq/core",
3
- "version": "0.3.1",
3
+ "version": "1.0.0",
4
4
  "description": "Stratum shared types, utilities, and validation schemas",
5
5
  "keywords": [
6
6
  "multi-tenancy",
@@ -28,7 +28,8 @@
28
28
  "scripts": {
29
29
  "build": "tsc",
30
30
  "test": "vitest run",
31
- "lint": "tsc --noEmit",
31
+ "typecheck": "tsc --noEmit",
32
+ "lint": "eslint .",
32
33
  "clean": "rm -rf dist"
33
34
  },
34
35
  "publishConfig": {
@@ -42,6 +43,13 @@
42
43
  "typescript": "^5.4.0",
43
44
  "vitest": "^1.6.0"
44
45
  },
46
+ "license": "MIT",
47
+ "author": "Christian Crank",
48
+ "homepage": "https://github.com/stratum-hq/Stratum/tree/main/packages/core#readme",
49
+ "bugs": "https://github.com/stratum-hq/Stratum/issues",
50
+ "engines": {
51
+ "node": ">=20.0.0"
52
+ },
45
53
  "repository": {
46
54
  "type": "git",
47
55
  "url": "https://github.com/stratum-hq/Stratum.git",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ancestry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ancestry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ancestry.test.ts"],"names":[],"mappings":""}
@@ -1,132 +0,0 @@
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
- // Ancestry paths as stored by tenant-service EXCLUDE the tenant's own id:
107
- // a root tenant has "/", its child has "/rootId", a grandchild has
108
- // "/rootId/childId" (see createTenant: appendToPath(parent.path, parent.id)).
109
- (0, vitest_1.describe)("getAncestorIds", () => {
110
- (0, vitest_1.it)("root tenant (path '/') has no ancestors", () => {
111
- (0, vitest_1.expect)((0, ancestry_js_1.getAncestorIds)("/")).toEqual([]);
112
- });
113
- (0, vitest_1.it)("child of root (path '/rootId') has ancestors [rootId]", () => {
114
- (0, vitest_1.expect)((0, ancestry_js_1.getAncestorIds)(`/${rootId}`)).toEqual([rootId]);
115
- });
116
- (0, vitest_1.it)("grandchild (path '/rootId/childId') has ancestors [rootId, childId]", () => {
117
- (0, vitest_1.expect)((0, ancestry_js_1.getAncestorIds)(`/${rootId}/${childId}`)).toEqual([rootId, childId]);
118
- });
119
- });
120
- (0, vitest_1.describe)("getSelfId", () => {
121
- (0, vitest_1.it)("returns the direct parent id for a child of root", () => {
122
- (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)(`/${rootId}`)).toBe(rootId);
123
- });
124
- (0, vitest_1.it)("returns the direct parent id for a grandchild", () => {
125
- (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)(`/${rootId}/${childId}`)).toBe(childId);
126
- });
127
- (0, vitest_1.it)("returns null for a root tenant path", () => {
128
- (0, vitest_1.expect)((0, ancestry_js_1.getSelfId)("/")).toBeNull();
129
- });
130
- });
131
- });
132
- //# sourceMappingURL=ancestry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ancestry.test.js","sourceRoot":"","sources":["../../src/__tests__/ancestry.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config-types.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config-types.test.ts"],"names":[],"mappings":""}
@@ -1,143 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-types.test.js","sourceRoot":"","sources":["../../src/__tests__/config-types.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=errors.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=isolation.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=validation.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=webhook.test.d.ts.map
@@ -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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"}