@unispechq/unispec-core 0.3.0 → 0.3.2
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/cjs/diff/annotators.js +36 -9
- package/dist/cjs/src/cache/cache-factory.js +72 -0
- package/dist/cjs/src/cache/cache-manager.js +128 -0
- package/dist/cjs/src/cache/constants.js +25 -0
- package/dist/cjs/src/cache/hash-utils.js +19 -0
- package/dist/cjs/src/cache/hashing.js +230 -0
- package/dist/cjs/src/cache/index.js +24 -0
- package/dist/cjs/src/cache/lru-cache.js +144 -0
- package/dist/cjs/src/cache/types.js +5 -0
- package/dist/cjs/src/diff/annotators.js +160 -0
- package/dist/cjs/src/diff/change-reports.js +369 -0
- package/dist/cjs/src/diff/core.js +158 -0
- package/dist/cjs/src/diff/enhanced-diff.js +65 -0
- package/dist/cjs/src/diff/impact-strategies-refactored.js +230 -0
- package/dist/cjs/src/diff/impact-strategies.js +219 -0
- package/dist/cjs/src/diff/index.js +27 -0
- package/dist/cjs/src/diff/metrics-calculator.js +69 -0
- package/dist/cjs/src/diff/risk-calculator.js +58 -0
- package/dist/cjs/src/diff/suggestion-generator.js +78 -0
- package/dist/cjs/src/diff/types.js +11 -0
- package/dist/cjs/src/errors/base-error.js +33 -0
- package/dist/cjs/src/errors/config-error.js +11 -0
- package/dist/cjs/src/errors/error-factory.js +48 -0
- package/dist/cjs/src/errors/index.js +19 -0
- package/dist/cjs/src/errors/loader-error.js +11 -0
- package/dist/cjs/src/errors/reference-error.js +11 -0
- package/dist/cjs/src/errors/schema-error.js +11 -0
- package/dist/cjs/src/errors/security-error.js +11 -0
- package/dist/cjs/src/errors/semantic-error.js +11 -0
- package/dist/cjs/src/generated-schemas.js +2100 -0
- package/dist/cjs/src/index.js +59 -0
- package/dist/cjs/src/loader/index.js +13 -0
- package/dist/cjs/src/loader/security-validator.js +53 -0
- package/dist/cjs/src/loader/types.js +11 -0
- package/dist/cjs/src/loader/unispec-loader.js +84 -0
- package/dist/cjs/src/loader/yaml-loader.js +76 -0
- package/dist/cjs/src/normalizer/core.js +37 -0
- package/dist/cjs/src/normalizer/graphql-normalizer.js +67 -0
- package/dist/cjs/src/normalizer/index.js +7 -0
- package/dist/cjs/src/normalizer/rest-normalizer.js +51 -0
- package/dist/cjs/src/normalizer/types.js +2 -0
- package/dist/cjs/src/normalizer/utils.js +49 -0
- package/dist/cjs/src/normalizer/websocket-normalizer.js +81 -0
- package/dist/cjs/src/optimizer/core.js +140 -0
- package/dist/cjs/src/optimizer/index.js +17 -0
- package/dist/cjs/src/optimizer/optimization-functions.js +185 -0
- package/dist/cjs/src/optimizer/types.js +2 -0
- package/dist/cjs/src/optimizer/utils.js +32 -0
- package/dist/cjs/src/schemas/dedupe.js +113 -0
- package/dist/cjs/src/schemas/index.js +14 -0
- package/dist/cjs/src/schemas/resolver.js +42 -0
- package/dist/cjs/src/schemas/utils.js +53 -0
- package/dist/cjs/src/types/index.js +2 -0
- package/dist/cjs/src/validator/ajv-validator.js +82 -0
- package/dist/cjs/src/validator/config-validator-main.js +34 -0
- package/dist/cjs/src/validator/config-validator.js +17 -0
- package/dist/cjs/src/validator/index.js +23 -0
- package/dist/cjs/src/validator/object-traversal.js +112 -0
- package/dist/cjs/src/validator/reference-validator.js +233 -0
- package/dist/cjs/src/validator/schema-references.js +116 -0
- package/dist/cjs/src/validator/semantic-validator.js +328 -0
- package/dist/cjs/src/validator/tests-validator.js +16 -0
- package/dist/cjs/src/validator/types.js +2 -0
- package/dist/cjs/src/validator/unispec-validator.js +80 -0
- package/dist/cjs/src/validator/validator-factory.js +77 -0
- package/dist/cjs/src/versions.js +147 -0
- package/dist/cjs/tests/cache/cache.test.js +274 -0
- package/dist/cjs/tests/cache/utils.js +32 -0
- package/dist/cjs/tests/concurrency-normalizer-optimizer.test.js +1 -0
- package/dist/cjs/tests/diff/diff-annotators.test.js +280 -0
- package/dist/cjs/tests/diff/diff-comprehensive.test.js +262 -0
- package/dist/cjs/tests/diff/diff-extended.test.js +235 -0
- package/dist/cjs/tests/diff/diff.test.js +189 -0
- package/dist/cjs/tests/diff/utils.js +8 -0
- package/dist/cjs/tests/errors/errors-integration.test.js +173 -0
- package/dist/cjs/tests/errors/errors.test.js +280 -0
- package/dist/cjs/tests/errors/utils.js +7 -0
- package/dist/cjs/tests/loader/integration.test.js +216 -0
- package/dist/cjs/tests/loader/loader.test.js +341 -0
- package/dist/cjs/tests/normalizer/normalizer-comprehensive.test.js +648 -0
- package/dist/cjs/tests/normalizer/normalizer-invalid.test.js +258 -0
- package/dist/cjs/tests/normalizer/normalizer-valid.test.js +238 -0
- package/dist/cjs/tests/normalizer/utils.js +47 -0
- package/dist/cjs/tests/optimizer/compress-references.test.js +304 -0
- package/dist/cjs/tests/optimizer/deduplication.test.js +132 -0
- package/dist/cjs/tests/optimizer/integration.test.js +131 -0
- package/dist/cjs/tests/optimizer/optimization-report.test.js +222 -0
- package/dist/cjs/tests/optimizer/optimize-document.test.js +187 -0
- package/dist/cjs/tests/optimizer/orphaned-schemas.test.js +194 -0
- package/dist/cjs/tests/optimizer/sort-schemas.test.js +131 -0
- package/dist/cjs/tests/optimizer/utils.js +209 -0
- package/dist/cjs/tests/schemas/schemas-edge-cases.test.js +223 -0
- package/dist/cjs/tests/schemas/schemas.test.js +400 -0
- package/dist/cjs/tests/schemas/utils.js +7 -0
- package/dist/cjs/tests/utils.js +131 -0
- package/dist/cjs/tests/validator/config-validator.test.js +78 -0
- package/dist/cjs/tests/validator/debug-config.js +1 -0
- package/dist/cjs/tests/validator/debug-missing-service.js +1 -0
- package/dist/cjs/tests/validator/debug-other-configs.js +1 -0
- package/dist/cjs/tests/validator/debug-references.js +1 -0
- package/dist/cjs/tests/validator/unispec-validator.test.js +103 -0
- package/dist/cjs/tests/validator/utils.js +25 -0
- package/dist/diff/annotators.js +36 -9
- package/dist/src/cache/cache-factory.d.ts +31 -0
- package/dist/src/cache/cache-factory.js +65 -0
- package/dist/src/cache/cache-manager.d.ts +62 -0
- package/dist/src/cache/cache-manager.js +124 -0
- package/dist/src/cache/constants.d.ts +21 -0
- package/dist/src/cache/constants.js +22 -0
- package/dist/src/cache/hash-utils.d.ts +11 -0
- package/dist/src/cache/hash-utils.js +15 -0
- package/dist/src/cache/hashing.d.ts +28 -0
- package/dist/src/cache/hashing.js +193 -0
- package/dist/src/cache/index.d.ts +6 -0
- package/dist/src/cache/index.js +10 -0
- package/dist/src/cache/lru-cache.d.ts +44 -0
- package/dist/src/cache/lru-cache.js +140 -0
- package/dist/src/cache/types.d.ts +24 -0
- package/dist/src/cache/types.js +4 -0
- package/dist/src/diff/annotators.d.ts +4 -0
- package/dist/src/diff/annotators.js +155 -0
- package/dist/src/diff/change-reports.d.ts +37 -0
- package/dist/src/diff/change-reports.js +366 -0
- package/dist/src/diff/core.d.ts +26 -0
- package/dist/src/diff/core.js +155 -0
- package/dist/src/diff/enhanced-diff.d.ts +51 -0
- package/dist/src/diff/enhanced-diff.js +62 -0
- package/dist/src/diff/impact-strategies-refactored.d.ts +69 -0
- package/dist/src/diff/impact-strategies-refactored.js +223 -0
- package/dist/src/diff/impact-strategies.d.ts +41 -0
- package/dist/src/diff/impact-strategies.js +212 -0
- package/dist/src/diff/index.d.ts +8 -0
- package/dist/src/diff/index.js +11 -0
- package/dist/src/diff/metrics-calculator.d.ts +23 -0
- package/dist/src/diff/metrics-calculator.js +65 -0
- package/dist/src/diff/risk-calculator.d.ts +23 -0
- package/dist/src/diff/risk-calculator.js +55 -0
- package/dist/src/diff/suggestion-generator.d.ts +18 -0
- package/dist/src/diff/suggestion-generator.js +74 -0
- package/dist/src/diff/types.d.ts +24 -0
- package/dist/src/diff/types.js +8 -0
- package/dist/src/errors/base-error.d.ts +20 -0
- package/dist/src/errors/base-error.js +29 -0
- package/dist/src/errors/config-error.d.ts +4 -0
- package/dist/src/errors/config-error.js +7 -0
- package/dist/src/errors/error-factory.d.ts +22 -0
- package/dist/src/errors/error-factory.js +45 -0
- package/dist/src/errors/index.d.ts +8 -0
- package/dist/src/errors/index.js +8 -0
- package/dist/src/errors/loader-error.d.ts +4 -0
- package/dist/src/errors/loader-error.js +7 -0
- package/dist/src/errors/reference-error.d.ts +4 -0
- package/dist/src/errors/reference-error.js +7 -0
- package/dist/src/errors/schema-error.d.ts +4 -0
- package/dist/src/errors/schema-error.js +7 -0
- package/dist/src/errors/security-error.d.ts +4 -0
- package/dist/src/errors/security-error.js +7 -0
- package/dist/src/errors/semantic-error.d.ts +4 -0
- package/dist/src/errors/semantic-error.js +7 -0
- package/dist/src/generated-schemas.d.ts +2073 -0
- package/dist/src/generated-schemas.js +2097 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.js +43 -0
- package/dist/src/loader/index.d.ts +5 -0
- package/dist/src/loader/index.js +5 -0
- package/dist/src/loader/security-validator.d.ts +5 -0
- package/dist/src/loader/security-validator.js +50 -0
- package/dist/src/loader/types.d.ts +30 -0
- package/dist/src/loader/types.js +8 -0
- package/dist/src/loader/unispec-loader.d.ts +10 -0
- package/dist/src/loader/unispec-loader.js +81 -0
- package/dist/src/loader/yaml-loader.d.ts +10 -0
- package/dist/src/loader/yaml-loader.js +39 -0
- package/dist/src/normalizer/core.d.ts +24 -0
- package/dist/src/normalizer/core.js +34 -0
- package/dist/src/normalizer/graphql-normalizer.d.ts +8 -0
- package/dist/src/normalizer/graphql-normalizer.js +64 -0
- package/dist/src/normalizer/index.d.ts +2 -0
- package/dist/src/normalizer/index.js +3 -0
- package/dist/src/normalizer/rest-normalizer.d.ts +8 -0
- package/dist/src/normalizer/rest-normalizer.js +48 -0
- package/dist/src/normalizer/types.d.ts +7 -0
- package/dist/src/normalizer/types.js +1 -0
- package/dist/src/normalizer/utils.d.ts +17 -0
- package/dist/src/normalizer/utils.js +45 -0
- package/dist/src/normalizer/websocket-normalizer.d.ts +8 -0
- package/dist/src/normalizer/websocket-normalizer.js +78 -0
- package/dist/src/optimizer/core.d.ts +17 -0
- package/dist/src/optimizer/core.js +136 -0
- package/dist/src/optimizer/index.d.ts +4 -0
- package/dist/src/optimizer/index.js +7 -0
- package/dist/src/optimizer/optimization-functions.d.ts +32 -0
- package/dist/src/optimizer/optimization-functions.js +179 -0
- package/dist/src/optimizer/types.d.ts +28 -0
- package/dist/src/optimizer/types.js +1 -0
- package/dist/src/optimizer/utils.d.ts +7 -0
- package/dist/src/optimizer/utils.js +29 -0
- package/dist/src/schemas/dedupe.d.ts +9 -0
- package/dist/src/schemas/dedupe.js +110 -0
- package/dist/src/schemas/index.d.ts +3 -0
- package/dist/src/schemas/index.js +6 -0
- package/dist/src/schemas/resolver.d.ts +19 -0
- package/dist/src/schemas/resolver.js +38 -0
- package/dist/src/schemas/utils.d.ts +20 -0
- package/dist/src/schemas/utils.js +49 -0
- package/dist/src/types/index.d.ts +434 -0
- package/dist/src/types/index.js +1 -0
- package/dist/src/validator/ajv-validator.d.ts +15 -0
- package/dist/src/validator/ajv-validator.js +75 -0
- package/dist/src/validator/config-validator-main.d.ts +10 -0
- package/dist/src/validator/config-validator-main.js +31 -0
- package/dist/src/validator/config-validator.d.ts +5 -0
- package/dist/src/validator/config-validator.js +14 -0
- package/dist/src/validator/index.d.ts +10 -0
- package/dist/src/validator/index.js +11 -0
- package/dist/src/validator/object-traversal.d.ts +52 -0
- package/dist/src/validator/object-traversal.js +104 -0
- package/dist/src/validator/reference-validator.d.ts +31 -0
- package/dist/src/validator/reference-validator.js +230 -0
- package/dist/src/validator/schema-references.d.ts +23 -0
- package/dist/src/validator/schema-references.js +111 -0
- package/dist/src/validator/semantic-validator.d.ts +26 -0
- package/dist/src/validator/semantic-validator.js +325 -0
- package/dist/src/validator/tests-validator.d.ts +9 -0
- package/dist/src/validator/tests-validator.js +13 -0
- package/dist/src/validator/types.d.ts +29 -0
- package/dist/src/validator/types.js +1 -0
- package/dist/src/validator/unispec-validator.d.ts +15 -0
- package/dist/src/validator/unispec-validator.js +77 -0
- package/dist/src/validator/validator-factory.d.ts +10 -0
- package/dist/src/validator/validator-factory.js +73 -0
- package/dist/src/versions.d.ts +10 -0
- package/dist/src/versions.js +143 -0
- package/dist/tests/cache/cache.test.d.ts +1 -0
- package/dist/tests/cache/cache.test.js +269 -0
- package/dist/tests/cache/utils.d.ts +4 -0
- package/dist/tests/cache/utils.js +24 -0
- package/dist/tests/concurrency-normalizer-optimizer.test.d.ts +0 -0
- package/dist/tests/concurrency-normalizer-optimizer.test.js +1 -0
- package/dist/tests/diff/diff-annotators.test.d.ts +1 -0
- package/dist/tests/diff/diff-annotators.test.js +275 -0
- package/dist/tests/diff/diff-comprehensive.test.d.ts +1 -0
- package/dist/tests/diff/diff-comprehensive.test.js +257 -0
- package/dist/tests/diff/diff-extended.test.d.ts +1 -0
- package/dist/tests/diff/diff-extended.test.js +230 -0
- package/dist/tests/diff/diff.test.d.ts +1 -0
- package/dist/tests/diff/diff.test.js +184 -0
- package/dist/tests/diff/utils.d.ts +2 -0
- package/dist/tests/diff/utils.js +3 -0
- package/dist/tests/errors/errors-integration.test.d.ts +1 -0
- package/dist/tests/errors/errors-integration.test.js +168 -0
- package/dist/tests/errors/errors.test.d.ts +1 -0
- package/dist/tests/errors/errors.test.js +275 -0
- package/dist/tests/errors/utils.d.ts +2 -0
- package/dist/tests/errors/utils.js +3 -0
- package/dist/tests/loader/integration.test.d.ts +1 -0
- package/dist/tests/loader/integration.test.js +211 -0
- package/dist/tests/loader/loader.test.d.ts +1 -0
- package/dist/tests/loader/loader.test.js +336 -0
- package/dist/tests/normalizer/normalizer-comprehensive.test.d.ts +1 -0
- package/dist/tests/normalizer/normalizer-comprehensive.test.js +643 -0
- package/dist/tests/normalizer/normalizer-invalid.test.d.ts +1 -0
- package/dist/tests/normalizer/normalizer-invalid.test.js +253 -0
- package/dist/tests/normalizer/normalizer-valid.test.d.ts +1 -0
- package/dist/tests/normalizer/normalizer-valid.test.js +233 -0
- package/dist/tests/normalizer/utils.d.ts +18 -0
- package/dist/tests/normalizer/utils.js +36 -0
- package/dist/tests/optimizer/compress-references.test.d.ts +1 -0
- package/dist/tests/optimizer/compress-references.test.js +299 -0
- package/dist/tests/optimizer/deduplication.test.d.ts +1 -0
- package/dist/tests/optimizer/deduplication.test.js +127 -0
- package/dist/tests/optimizer/integration.test.d.ts +1 -0
- package/dist/tests/optimizer/integration.test.js +126 -0
- package/dist/tests/optimizer/optimization-report.test.d.ts +1 -0
- package/dist/tests/optimizer/optimization-report.test.js +217 -0
- package/dist/tests/optimizer/optimize-document.test.d.ts +1 -0
- package/dist/tests/optimizer/optimize-document.test.js +182 -0
- package/dist/tests/optimizer/orphaned-schemas.test.d.ts +1 -0
- package/dist/tests/optimizer/orphaned-schemas.test.js +189 -0
- package/dist/tests/optimizer/sort-schemas.test.d.ts +1 -0
- package/dist/tests/optimizer/sort-schemas.test.js +126 -0
- package/dist/tests/optimizer/utils.d.ts +8 -0
- package/dist/tests/optimizer/utils.js +199 -0
- package/dist/tests/schemas/schemas-edge-cases.test.d.ts +1 -0
- package/dist/tests/schemas/schemas-edge-cases.test.js +218 -0
- package/dist/tests/schemas/schemas.test.d.ts +1 -0
- package/dist/tests/schemas/schemas.test.js +395 -0
- package/dist/tests/schemas/utils.d.ts +2 -0
- package/dist/tests/schemas/utils.js +3 -0
- package/dist/tests/utils.d.ts +10 -0
- package/dist/tests/utils.js +118 -0
- package/dist/tests/validator/config-validator.test.d.ts +1 -0
- package/dist/tests/validator/config-validator.test.js +73 -0
- package/dist/tests/validator/debug-config.d.ts +0 -0
- package/dist/tests/validator/debug-config.js +1 -0
- package/dist/tests/validator/debug-missing-service.d.ts +0 -0
- package/dist/tests/validator/debug-missing-service.js +1 -0
- package/dist/tests/validator/debug-other-configs.d.ts +0 -0
- package/dist/tests/validator/debug-other-configs.js +1 -0
- package/dist/tests/validator/debug-references.d.ts +0 -0
- package/dist/tests/validator/debug-references.js +1 -0
- package/dist/tests/validator/unispec-validator.test.d.ts +1 -0
- package/dist/tests/validator/unispec-validator.test.js +98 -0
- package/dist/tests/validator/utils.d.ts +6 -0
- package/dist/tests/validator/utils.js +20 -0
- package/package.json +4 -3
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const schemas_1 = require("../../src/schemas/index.js");
|
|
9
|
+
const utils_1 = require("../../src/schemas/utils.js");
|
|
10
|
+
const utils_2 = require("./utils.js");
|
|
11
|
+
(0, node_test_1.describe)("schemas module", () => {
|
|
12
|
+
(0, node_test_1.describe)("normalizeSchemaRef", () => {
|
|
13
|
+
(0, node_test_1.it)("should handle simple name format", () => {
|
|
14
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("User"), "User");
|
|
15
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("CreateOrderRequest"), "CreateOrderRequest");
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.it)("should handle JSON Pointer format", () => {
|
|
18
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/User"), "User");
|
|
19
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/CreateOrderRequest"), "CreateOrderRequest");
|
|
20
|
+
});
|
|
21
|
+
(0, node_test_1.it)("should handle hash format", () => {
|
|
22
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#User"), "User");
|
|
23
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#CreateOrderRequest"), "CreateOrderRequest");
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.it)("should handle path format", () => {
|
|
26
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("path/to/User"), "User");
|
|
27
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("models/User"), "User");
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.it)("should handle empty and whitespace strings", () => {
|
|
30
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)(""), "");
|
|
31
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)(" "), "");
|
|
32
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#"), "");
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.it)("should handle complex paths", () => {
|
|
35
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/nested/User"), "User");
|
|
36
|
+
node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("deeply/nested/path/to/Schema"), "Schema");
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
(0, node_test_1.describe)("stableStringify", () => {
|
|
40
|
+
(0, node_test_1.it)("should create consistent strings for simple values", () => {
|
|
41
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(null), "null");
|
|
42
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(42), "42");
|
|
43
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(true), "true");
|
|
44
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)("test"), '"test"');
|
|
45
|
+
});
|
|
46
|
+
(0, node_test_1.it)("should create consistent strings for arrays", () => {
|
|
47
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)([1, 2, 3]), "[1,2,3]");
|
|
48
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(["b", "a"]), '["b","a"]');
|
|
49
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)([]), "[]");
|
|
50
|
+
});
|
|
51
|
+
(0, node_test_1.it)("should create consistent strings for objects with sorted keys", () => {
|
|
52
|
+
const obj1 = { b: 2, a: 1 };
|
|
53
|
+
const obj2 = { a: 1, b: 2 };
|
|
54
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(obj1), (0, utils_1.stableStringify)(obj2));
|
|
55
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(obj1), '{"a":1,"b":2}');
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.it)("should handle nested objects", () => {
|
|
58
|
+
const nested = {
|
|
59
|
+
outer: {
|
|
60
|
+
z: 3,
|
|
61
|
+
a: 1,
|
|
62
|
+
},
|
|
63
|
+
b: 2,
|
|
64
|
+
};
|
|
65
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(nested), '{"b":2,"outer":{"a":1,"z":3}}');
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.it)("should handle complex nested structures", () => {
|
|
68
|
+
const complex = {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
name: { type: "string" },
|
|
72
|
+
age: { type: "number" },
|
|
73
|
+
},
|
|
74
|
+
required: ["name", "age"],
|
|
75
|
+
};
|
|
76
|
+
const expected = '{"properties":{"age":{"type":"number"},"name":{"type":"string"}},"required":["name","age"],"type":"object"}';
|
|
77
|
+
node_assert_1.default.strictEqual((0, utils_1.stableStringify)(complex), expected);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
(0, node_test_1.describe)("registerSchema", () => {
|
|
81
|
+
(0, node_test_1.it)("should register a new schema in an empty document", () => {
|
|
82
|
+
const doc = {
|
|
83
|
+
unispecVersion: "1.0.0",
|
|
84
|
+
service: { name: "test-service" },
|
|
85
|
+
};
|
|
86
|
+
const jsonSchema = {
|
|
87
|
+
type: "object",
|
|
88
|
+
properties: {
|
|
89
|
+
name: { type: "string" },
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
const definition = (0, schemas_1.registerSchema)(doc, "User", jsonSchema);
|
|
93
|
+
node_assert_1.default.deepStrictEqual(definition.jsonSchema, jsonSchema);
|
|
94
|
+
node_assert_1.default.ok(doc.service?.schemas?.User);
|
|
95
|
+
});
|
|
96
|
+
(0, node_test_1.it)("should create schemas container if missing", () => {
|
|
97
|
+
const doc = {
|
|
98
|
+
unispecVersion: "1.0.0",
|
|
99
|
+
service: { name: "test-service" },
|
|
100
|
+
};
|
|
101
|
+
(0, schemas_1.registerSchema)(doc, "User", { type: "object" });
|
|
102
|
+
node_assert_1.default.ok(doc.service?.schemas);
|
|
103
|
+
node_assert_1.default.ok(doc.service.schemas.User);
|
|
104
|
+
});
|
|
105
|
+
(0, node_test_1.it)("should create service if missing", () => {
|
|
106
|
+
const doc = {
|
|
107
|
+
unispecVersion: "1.0.0",
|
|
108
|
+
};
|
|
109
|
+
(0, schemas_1.registerSchema)(doc, "User", { type: "object" });
|
|
110
|
+
node_assert_1.default.ok(doc.service);
|
|
111
|
+
node_assert_1.default.strictEqual(doc.service.name, "");
|
|
112
|
+
node_assert_1.default.ok(doc.service.schemas);
|
|
113
|
+
});
|
|
114
|
+
(0, node_test_1.it)("should overwrite existing schema", () => {
|
|
115
|
+
const doc = {
|
|
116
|
+
unispecVersion: "1.0.0",
|
|
117
|
+
service: {
|
|
118
|
+
name: "test-service",
|
|
119
|
+
schemas: {
|
|
120
|
+
User: {
|
|
121
|
+
jsonSchema: { type: "string" },
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
const newSchema = { type: "number" };
|
|
127
|
+
(0, schemas_1.registerSchema)(doc, "User", newSchema);
|
|
128
|
+
node_assert_1.default.deepStrictEqual(doc.service?.schemas?.User?.jsonSchema, newSchema);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, node_test_1.describe)("resolveSchemaRef", () => {
|
|
132
|
+
(0, node_test_1.it)("should resolve simple schema reference", () => {
|
|
133
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
134
|
+
const schema = (0, schemas_1.resolveSchemaRef)(doc, "CreateOrderRequest");
|
|
135
|
+
node_assert_1.default.ok(schema);
|
|
136
|
+
node_assert_1.default.strictEqual(schema.jsonSchema.type, "object");
|
|
137
|
+
node_assert_1.default.ok(schema?.jsonSchema.properties);
|
|
138
|
+
const properties = schema.jsonSchema.properties;
|
|
139
|
+
node_assert_1.default.ok(properties.productIds);
|
|
140
|
+
});
|
|
141
|
+
(0, node_test_1.it)("should resolve JSON Pointer reference", () => {
|
|
142
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
143
|
+
const schema = (0, schemas_1.resolveSchemaRef)(doc, "#/service/schemas/OrderStatusUpdate");
|
|
144
|
+
node_assert_1.default.ok(schema);
|
|
145
|
+
node_assert_1.default.strictEqual(schema.jsonSchema.type, "object");
|
|
146
|
+
node_assert_1.default.ok(schema?.jsonSchema.properties);
|
|
147
|
+
const properties = schema.jsonSchema.properties;
|
|
148
|
+
node_assert_1.default.ok(properties.status);
|
|
149
|
+
});
|
|
150
|
+
(0, node_test_1.it)("should resolve hash reference", () => {
|
|
151
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
152
|
+
const schema = (0, schemas_1.resolveSchemaRef)(doc, "#OrderStatusUpdate");
|
|
153
|
+
node_assert_1.default.ok(schema);
|
|
154
|
+
node_assert_1.default.strictEqual(schema.jsonSchema.type, "object");
|
|
155
|
+
});
|
|
156
|
+
(0, node_test_1.it)("should return undefined for non-existent schema", () => {
|
|
157
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
158
|
+
const schema = (0, schemas_1.resolveSchemaRef)(doc, "NonExistentSchema");
|
|
159
|
+
node_assert_1.default.strictEqual(schema, undefined);
|
|
160
|
+
});
|
|
161
|
+
(0, node_test_1.it)("should return undefined for empty reference", () => {
|
|
162
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
163
|
+
const schema = (0, schemas_1.resolveSchemaRef)(doc, "");
|
|
164
|
+
node_assert_1.default.strictEqual(schema, undefined);
|
|
165
|
+
});
|
|
166
|
+
(0, node_test_1.it)("should handle document without schemas", () => {
|
|
167
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "rest-simple.json"));
|
|
168
|
+
const schema = (0, schemas_1.resolveSchemaRef)(doc, "AnySchema");
|
|
169
|
+
node_assert_1.default.strictEqual(schema, undefined);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
(0, node_test_1.describe)("dedupeSchemas", () => {
|
|
173
|
+
(0, node_test_1.it)("should remove duplicate schemas and update references", () => {
|
|
174
|
+
const doc = {
|
|
175
|
+
unispecVersion: "1.0.0",
|
|
176
|
+
service: {
|
|
177
|
+
name: "test-service",
|
|
178
|
+
schemas: {
|
|
179
|
+
User: {
|
|
180
|
+
jsonSchema: {
|
|
181
|
+
type: "object",
|
|
182
|
+
properties: {
|
|
183
|
+
id: { type: "string" },
|
|
184
|
+
name: { type: "string" },
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
Person: {
|
|
189
|
+
jsonSchema: {
|
|
190
|
+
type: "object",
|
|
191
|
+
properties: {
|
|
192
|
+
id: { type: "string" },
|
|
193
|
+
name: { type: "string" },
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
protocols: {
|
|
199
|
+
rest: {
|
|
200
|
+
routes: [
|
|
201
|
+
{
|
|
202
|
+
name: "getUser",
|
|
203
|
+
path: "/user",
|
|
204
|
+
method: "GET",
|
|
205
|
+
responses: {
|
|
206
|
+
"200": {
|
|
207
|
+
description: "User found",
|
|
208
|
+
content: {
|
|
209
|
+
"application/json": {
|
|
210
|
+
schemaRef: "User",
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: "getPerson",
|
|
218
|
+
path: "/person",
|
|
219
|
+
method: "GET",
|
|
220
|
+
responses: {
|
|
221
|
+
"200": {
|
|
222
|
+
description: "Person found",
|
|
223
|
+
content: {
|
|
224
|
+
"application/json": {
|
|
225
|
+
schemaRef: "Person",
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
237
|
+
// Should keep only one schema (the first one encountered)
|
|
238
|
+
const schemas = doc.service?.schemas;
|
|
239
|
+
node_assert_1.default.strictEqual(Object.keys(schemas || {}).length, 1);
|
|
240
|
+
node_assert_1.default.ok(schemas?.User);
|
|
241
|
+
node_assert_1.default.strictEqual(schemas?.Person, undefined);
|
|
242
|
+
// References should be updated to point to the retained schema
|
|
243
|
+
const rest = doc.service?.protocols?.rest;
|
|
244
|
+
if (rest?.routes) {
|
|
245
|
+
const userRoute = rest.routes[0];
|
|
246
|
+
const personRoute = rest.routes[1];
|
|
247
|
+
node_assert_1.default.strictEqual(userRoute.responses?.["200"]?.content?.["application/json"]
|
|
248
|
+
?.schemaRef, "User");
|
|
249
|
+
node_assert_1.default.strictEqual(personRoute.responses?.["200"]?.content?.["application/json"]
|
|
250
|
+
?.schemaRef, "User");
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
(0, node_test_1.it)("should handle documents without schemas", () => {
|
|
254
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "rest-simple.json"));
|
|
255
|
+
// Should not throw
|
|
256
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
257
|
+
// Should still not have schemas
|
|
258
|
+
node_assert_1.default.strictEqual(doc.service?.schemas, undefined);
|
|
259
|
+
});
|
|
260
|
+
(0, node_test_1.it)("should handle empty schemas object", () => {
|
|
261
|
+
const doc = {
|
|
262
|
+
unispecVersion: "1.0.0",
|
|
263
|
+
service: {
|
|
264
|
+
name: "test-service",
|
|
265
|
+
schemas: {},
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
// Should not throw
|
|
269
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
270
|
+
node_assert_1.default.deepStrictEqual(doc.service.schemas, {});
|
|
271
|
+
});
|
|
272
|
+
(0, node_test_1.it)("should preserve unique schemas", () => {
|
|
273
|
+
const doc = {
|
|
274
|
+
unispecVersion: "1.0.0",
|
|
275
|
+
service: {
|
|
276
|
+
name: "test-service",
|
|
277
|
+
schemas: {
|
|
278
|
+
User: {
|
|
279
|
+
jsonSchema: { type: "string" },
|
|
280
|
+
},
|
|
281
|
+
Product: {
|
|
282
|
+
jsonSchema: { type: "number" },
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
288
|
+
// Both schemas should be preserved
|
|
289
|
+
const schemas = doc.service?.schemas;
|
|
290
|
+
node_assert_1.default.strictEqual(Object.keys(schemas || {}).length, 2);
|
|
291
|
+
node_assert_1.default.ok(schemas?.User);
|
|
292
|
+
node_assert_1.default.ok(schemas?.Product);
|
|
293
|
+
});
|
|
294
|
+
(0, node_test_1.it)("should update all types of schema references", () => {
|
|
295
|
+
const doc = {
|
|
296
|
+
unispecVersion: "1.0.0",
|
|
297
|
+
service: {
|
|
298
|
+
name: "test-service",
|
|
299
|
+
schemas: {
|
|
300
|
+
SchemaA: {
|
|
301
|
+
jsonSchema: { type: "object" },
|
|
302
|
+
},
|
|
303
|
+
SchemaB: {
|
|
304
|
+
jsonSchema: { type: "object" },
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
protocols: {
|
|
308
|
+
rest: {
|
|
309
|
+
routes: [
|
|
310
|
+
{
|
|
311
|
+
name: "test",
|
|
312
|
+
path: "/test",
|
|
313
|
+
method: "POST",
|
|
314
|
+
pathParams: [{ name: "id", schemaRef: "SchemaA" }],
|
|
315
|
+
queryParams: [{ name: "filter", schemaRef: "SchemaB" }],
|
|
316
|
+
headers: [{ name: "auth", schemaRef: "SchemaA" }],
|
|
317
|
+
requestBody: {
|
|
318
|
+
content: {
|
|
319
|
+
"application/json": { schemaRef: "SchemaB" },
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
responses: {
|
|
323
|
+
"200": {
|
|
324
|
+
content: {
|
|
325
|
+
"application/json": { schemaRef: "SchemaA" },
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
],
|
|
331
|
+
},
|
|
332
|
+
websocket: {
|
|
333
|
+
channels: [
|
|
334
|
+
{
|
|
335
|
+
name: "test",
|
|
336
|
+
messages: [{ name: "msg", schemaRef: "SchemaB" }],
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
344
|
+
// Should keep only SchemaA
|
|
345
|
+
const schemas = doc.service?.schemas;
|
|
346
|
+
node_assert_1.default.strictEqual(Object.keys(schemas || {}).length, 1);
|
|
347
|
+
node_assert_1.default.ok(schemas?.SchemaA);
|
|
348
|
+
const rest = doc.service?.protocols?.rest;
|
|
349
|
+
if (rest?.routes) {
|
|
350
|
+
const route = rest.routes[0];
|
|
351
|
+
node_assert_1.default.strictEqual(route.pathParams?.[0]?.schemaRef, "SchemaA");
|
|
352
|
+
node_assert_1.default.strictEqual(route.queryParams?.[0]?.schemaRef, "SchemaA");
|
|
353
|
+
node_assert_1.default.strictEqual(route.headers?.[0]?.schemaRef, "SchemaA");
|
|
354
|
+
node_assert_1.default.strictEqual(route.requestBody?.content?.["application/json"]?.schemaRef, "SchemaA");
|
|
355
|
+
node_assert_1.default.strictEqual(route.responses?.["200"]?.content?.["application/json"]?.schemaRef, "SchemaA");
|
|
356
|
+
}
|
|
357
|
+
const ws = doc.service?.protocols?.websocket;
|
|
358
|
+
if (ws?.channels) {
|
|
359
|
+
const wsMessage = ws.channels[0].messages?.[0];
|
|
360
|
+
if (wsMessage) {
|
|
361
|
+
node_assert_1.default.strictEqual(wsMessage.schemaRef, "SchemaA");
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
(0, node_test_1.describe)("integration with real examples", () => {
|
|
367
|
+
(0, node_test_1.it)("should handle mixed-complete example correctly", () => {
|
|
368
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
369
|
+
// Test resolving existing schemas
|
|
370
|
+
const createOrderSchema = (0, schemas_1.resolveSchemaRef)(doc, "CreateOrderRequest");
|
|
371
|
+
node_assert_1.default.ok(createOrderSchema?.jsonSchema.properties);
|
|
372
|
+
const createOrderProperties = createOrderSchema.jsonSchema
|
|
373
|
+
.properties;
|
|
374
|
+
node_assert_1.default.ok(createOrderProperties.productIds);
|
|
375
|
+
node_assert_1.default.ok(createOrderProperties.customerId);
|
|
376
|
+
const orderStatusSchema = (0, schemas_1.resolveSchemaRef)(doc, "OrderStatusUpdate");
|
|
377
|
+
node_assert_1.default.ok(orderStatusSchema);
|
|
378
|
+
node_assert_1.default.strictEqual(orderStatusSchema.jsonSchema.type, "object");
|
|
379
|
+
node_assert_1.default.ok(orderStatusSchema.jsonSchema.properties);
|
|
380
|
+
const orderStatusProperties = orderStatusSchema.jsonSchema
|
|
381
|
+
.properties;
|
|
382
|
+
node_assert_1.default.ok(orderStatusProperties.orderId);
|
|
383
|
+
node_assert_1.default.ok(orderStatusProperties.status);
|
|
384
|
+
// Test deduplication with no duplicates
|
|
385
|
+
const schemas = doc.service?.schemas;
|
|
386
|
+
const originalSchemaCount = Object.keys(schemas || {}).length;
|
|
387
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
388
|
+
node_assert_1.default.strictEqual(Object.keys(schemas || {}).length, originalSchemaCount);
|
|
389
|
+
});
|
|
390
|
+
(0, node_test_1.it)("should handle documents without schemas gracefully", () => {
|
|
391
|
+
const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "rest-simple.json"));
|
|
392
|
+
// Should not throw when resolving non-existent schemas
|
|
393
|
+
node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(doc, "NonExistent"), undefined);
|
|
394
|
+
// Should not throw when deduplicating
|
|
395
|
+
(0, schemas_1.dedupeSchemas)(doc);
|
|
396
|
+
// Should still have no schemas
|
|
397
|
+
node_assert_1.default.strictEqual(doc.service?.schemas, undefined);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadExample = exports.getExamplePath = exports.examplesDir = void 0;
|
|
4
|
+
const utils_1 = require("../../tests/utils.js");
|
|
5
|
+
Object.defineProperty(exports, "examplesDir", { enumerable: true, get: function () { return utils_1.examplesDir; } });
|
|
6
|
+
Object.defineProperty(exports, "getExamplePath", { enumerable: true, get: function () { return utils_1.getExamplePath; } });
|
|
7
|
+
Object.defineProperty(exports, "loadExample", { enumerable: true, get: function () { return utils_1.loadExample; } });
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.examplesDir = void 0;
|
|
7
|
+
exports.loadExample = loadExample;
|
|
8
|
+
exports.getExamplePath = getExamplePath;
|
|
9
|
+
exports.createTestDocument = createTestDocument;
|
|
10
|
+
exports.createTestChange = createTestChange;
|
|
11
|
+
exports.loadInvalidExample = loadInvalidExample;
|
|
12
|
+
exports.getValidExamplePaths = getValidExamplePaths;
|
|
13
|
+
exports.getInvalidExamplePaths = getInvalidExamplePaths;
|
|
14
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
15
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
16
|
+
exports.examplesDir = node_path_1.default.join(process.cwd(), "node_modules", "@unispechq", "unispec-schema", "examples");
|
|
17
|
+
function loadExample(filePath) {
|
|
18
|
+
const content = node_fs_1.default.readFileSync(filePath, "utf-8");
|
|
19
|
+
const parsed = JSON.parse(content);
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
function getExamplePath(...parts) {
|
|
23
|
+
return node_path_1.default.join(exports.examplesDir, ...parts);
|
|
24
|
+
}
|
|
25
|
+
function createTestDocument(overrides = {}) {
|
|
26
|
+
const base = {
|
|
27
|
+
unispecVersion: "1.0.0",
|
|
28
|
+
service: {
|
|
29
|
+
name: "test-service",
|
|
30
|
+
description: "Test service description",
|
|
31
|
+
protocols: {
|
|
32
|
+
rest: {
|
|
33
|
+
routes: [
|
|
34
|
+
{
|
|
35
|
+
name: "getUsers",
|
|
36
|
+
summary: "Get all users",
|
|
37
|
+
path: "/users",
|
|
38
|
+
method: "GET",
|
|
39
|
+
responses: {
|
|
40
|
+
"200": { description: "Success" },
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
graphql: {
|
|
46
|
+
queries: [
|
|
47
|
+
{
|
|
48
|
+
name: "users",
|
|
49
|
+
description: "Get all users",
|
|
50
|
+
args: [],
|
|
51
|
+
returnType: "[User!]!",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
mutations: [
|
|
55
|
+
{
|
|
56
|
+
name: "createUser",
|
|
57
|
+
description: "Create a user",
|
|
58
|
+
args: [],
|
|
59
|
+
returnType: "User!",
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
schema: "type User { id: ID! name: String! }",
|
|
63
|
+
},
|
|
64
|
+
websocket: {
|
|
65
|
+
channels: [
|
|
66
|
+
{
|
|
67
|
+
name: "notifications",
|
|
68
|
+
description: "Real-time notifications",
|
|
69
|
+
messages: [
|
|
70
|
+
{
|
|
71
|
+
name: "notification",
|
|
72
|
+
description: "Notification message",
|
|
73
|
+
direction: "subscribe",
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
// Deep merge overrides
|
|
83
|
+
return mergeDeep(base, overrides);
|
|
84
|
+
}
|
|
85
|
+
function mergeDeep(target, source) {
|
|
86
|
+
const result = { ...target };
|
|
87
|
+
for (const key in source) {
|
|
88
|
+
if (source[key] !== undefined) {
|
|
89
|
+
if (typeof source[key] === "object" &&
|
|
90
|
+
source[key] !== null &&
|
|
91
|
+
!Array.isArray(source[key])) {
|
|
92
|
+
result[key] = mergeDeep(result[key], source[key]);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
result[key] = source[key];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
function createTestChange(overrides = {}) {
|
|
102
|
+
const base = {
|
|
103
|
+
path: "/test/path",
|
|
104
|
+
description: "Test change",
|
|
105
|
+
severity: "unknown",
|
|
106
|
+
};
|
|
107
|
+
return { ...base, ...overrides };
|
|
108
|
+
}
|
|
109
|
+
function loadInvalidExample(filePath) {
|
|
110
|
+
const content = node_fs_1.default.readFileSync(filePath, "utf-8");
|
|
111
|
+
return JSON.parse(content);
|
|
112
|
+
}
|
|
113
|
+
function getValidExamplePaths() {
|
|
114
|
+
const validSpecDir = node_path_1.default.join(exports.examplesDir, "valid", "spec");
|
|
115
|
+
return [
|
|
116
|
+
node_path_1.default.join(validSpecDir, "rest-simple.json"),
|
|
117
|
+
node_path_1.default.join(validSpecDir, "graphql-simple.json"),
|
|
118
|
+
node_path_1.default.join(validSpecDir, "websocket-simple.json"),
|
|
119
|
+
node_path_1.default.join(validSpecDir, "mixed-complete.json"),
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
function getInvalidExamplePaths() {
|
|
123
|
+
const invalidSpecDir = node_path_1.default.join(exports.examplesDir, "invalid", "spec");
|
|
124
|
+
return [
|
|
125
|
+
node_path_1.default.join(invalidSpecDir, "missing-unispec-version.json"),
|
|
126
|
+
node_path_1.default.join(invalidSpecDir, "missing-service-name.json"),
|
|
127
|
+
node_path_1.default.join(invalidSpecDir, "invalid-rest-method.json"),
|
|
128
|
+
node_path_1.default.join(invalidSpecDir, "graphql-missing-name.json"),
|
|
129
|
+
node_path_1.default.join(invalidSpecDir, "invalid-identifier.json"),
|
|
130
|
+
];
|
|
131
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const validator_1 = require("../../src/validator/index.js");
|
|
9
|
+
const utils_1 = require("./utils.js");
|
|
10
|
+
(0, node_test_1.describe)("validateUniSpecConfig", () => {
|
|
11
|
+
(0, node_test_1.describe)("valid examples", () => {
|
|
12
|
+
(0, node_test_1.it)("should validate simple multi-service config", async () => {
|
|
13
|
+
const doc = (0, utils_1.loadValidConfigExample)("simple-multi-service");
|
|
14
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
15
|
+
node_assert_1.default.strictEqual(result.valid, true, "Valid multi-service config should pass validation");
|
|
16
|
+
node_assert_1.default.deepStrictEqual(result.errors, [], "Should have no errors");
|
|
17
|
+
});
|
|
18
|
+
(0, node_test_1.it)("should validate registry-based config", async () => {
|
|
19
|
+
const doc = (0, utils_1.loadValidConfigExample)("registry-based");
|
|
20
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
21
|
+
node_assert_1.default.strictEqual(result.valid, true, "Valid registry-based config should pass validation");
|
|
22
|
+
node_assert_1.default.deepStrictEqual(result.errors, [], "Should have no errors");
|
|
23
|
+
});
|
|
24
|
+
(0, node_test_1.it)("should validate complete enterprise config", async () => {
|
|
25
|
+
const doc = (0, utils_1.loadValidConfigExample)("complete-enterprise");
|
|
26
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
27
|
+
node_assert_1.default.strictEqual(result.valid, true, "Valid enterprise config should pass validation");
|
|
28
|
+
node_assert_1.default.deepStrictEqual(result.errors, [], "Should have no errors");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
(0, node_test_1.describe)("invalid examples", () => {
|
|
32
|
+
(0, node_test_1.it)("should reject config missing services", async () => {
|
|
33
|
+
const doc = (0, utils_1.loadInvalidConfigExample)("missing-services");
|
|
34
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
35
|
+
node_assert_1.default.strictEqual(result.valid, false, "Config without services should fail validation");
|
|
36
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
37
|
+
// Check that error mentions missing required property
|
|
38
|
+
const hasServicesError = result.errors.some((error) => error.message?.includes("services"));
|
|
39
|
+
node_assert_1.default.ok(hasServicesError, "Should have error about missing services");
|
|
40
|
+
});
|
|
41
|
+
(0, node_test_1.it)("should reject config with empty services array", async () => {
|
|
42
|
+
const doc = (0, utils_1.loadInvalidConfigExample)("empty-services-array");
|
|
43
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
44
|
+
node_assert_1.default.strictEqual(result.valid, false, "Config with empty services array should fail validation");
|
|
45
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
46
|
+
});
|
|
47
|
+
(0, node_test_1.it)("should reject config missing version", async () => {
|
|
48
|
+
const doc = (0, utils_1.loadInvalidConfigExample)("missing-version");
|
|
49
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
50
|
+
node_assert_1.default.strictEqual(result.valid, false, "Config without version should fail validation");
|
|
51
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
52
|
+
});
|
|
53
|
+
(0, node_test_1.it)("should reject config with invalid spec reference", async () => {
|
|
54
|
+
const doc = (0, utils_1.loadInvalidConfigExample)("invalid-spec-reference");
|
|
55
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
56
|
+
node_assert_1.default.strictEqual(result.valid, false, "Config with invalid spec reference should fail validation");
|
|
57
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.it)("should reject config missing service name", async () => {
|
|
60
|
+
const doc = (0, utils_1.loadInvalidConfigExample)("missing-service-name");
|
|
61
|
+
const result = await (0, validator_1.validateUniSpecConfig)(doc);
|
|
62
|
+
node_assert_1.default.strictEqual(result.valid, false, "Config without service name should fail validation");
|
|
63
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
(0, node_test_1.describe)("edge cases", () => {
|
|
67
|
+
(0, node_test_1.it)("should reject null input", async () => {
|
|
68
|
+
const result = await (0, validator_1.validateUniSpecConfig)(null);
|
|
69
|
+
node_assert_1.default.strictEqual(result.valid, false, "Null input should fail validation");
|
|
70
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
71
|
+
});
|
|
72
|
+
(0, node_test_1.it)("should reject undefined input", async () => {
|
|
73
|
+
const result = await (0, validator_1.validateUniSpecConfig)(undefined);
|
|
74
|
+
node_assert_1.default.strictEqual(result.valid, false, "Undefined input should fail validation");
|
|
75
|
+
node_assert_1.default.ok(result.errors.length > 0, "Should have validation errors");
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|