@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,222 @@
|
|
|
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 core_1 = require("../../src/optimizer/core.js");
|
|
9
|
+
const utils_1 = require("./utils.js");
|
|
10
|
+
(0, node_test_1.describe)("generateOptimizationReport", () => {
|
|
11
|
+
(0, node_test_1.it)("should generate report for document with duplicates", () => {
|
|
12
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
13
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
14
|
+
// Check properties exist using if statements
|
|
15
|
+
if (!report.recommendations) {
|
|
16
|
+
throw new Error("recommendations should exist");
|
|
17
|
+
}
|
|
18
|
+
if (!report.potentialSavings) {
|
|
19
|
+
throw new Error("potentialSavings should exist");
|
|
20
|
+
}
|
|
21
|
+
// Should recommend deduplication
|
|
22
|
+
const dedupRecommendation = report.recommendations.find((rec) => rec.includes("Deduplicate"));
|
|
23
|
+
if (!dedupRecommendation) {
|
|
24
|
+
throw new Error("Should recommend deduplication");
|
|
25
|
+
}
|
|
26
|
+
// The test document has 3 schemas: User (referenced), Person (duplicate of User), Profile (orphaned)
|
|
27
|
+
// So we expect 1 duplicate removal + 1 orphaned removal = 2 total reduction
|
|
28
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 2);
|
|
29
|
+
});
|
|
30
|
+
(0, node_test_1.it)("should generate report for document with orphaned schemas", () => {
|
|
31
|
+
const doc = (0, utils_1.createDocumentWithOrphanedSchemas)();
|
|
32
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
33
|
+
// Should recommend removing orphaned schemas
|
|
34
|
+
const orphanedRecommendation = report.recommendations.find((rec) => rec.includes("orphaned"));
|
|
35
|
+
node_assert_1.default.ok(orphanedRecommendation);
|
|
36
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 2);
|
|
37
|
+
});
|
|
38
|
+
(0, node_test_1.it)("should generate report for document with both duplicates and orphaned schemas", () => {
|
|
39
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
40
|
+
// Add orphaned schema
|
|
41
|
+
if (doc.service?.schemas) {
|
|
42
|
+
doc.service.schemas.OrphanedSchema = {
|
|
43
|
+
description: "Orphaned schema",
|
|
44
|
+
jsonSchema: { type: "string" },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
48
|
+
// Should recommend both optimizations
|
|
49
|
+
const dedupRecommendation = report.recommendations.find((rec) => rec.includes("Deduplicate"));
|
|
50
|
+
const orphanedRecommendation = report.recommendations.find((rec) => rec.includes("orphaned"));
|
|
51
|
+
node_assert_1.default.ok(dedupRecommendation);
|
|
52
|
+
node_assert_1.default.ok(orphanedRecommendation);
|
|
53
|
+
// Now we have: 1 duplicate + 2 orphaned (Profile + OrphanedSchema) = 3 total reduction
|
|
54
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 3);
|
|
55
|
+
});
|
|
56
|
+
(0, node_test_1.it)("should generate empty report for optimized document", () => {
|
|
57
|
+
const doc = {
|
|
58
|
+
unispecVersion: "1.0.0",
|
|
59
|
+
service: {
|
|
60
|
+
name: "test",
|
|
61
|
+
schemas: {
|
|
62
|
+
TestSchema: {
|
|
63
|
+
name: "TestSchema",
|
|
64
|
+
description: "Test schema",
|
|
65
|
+
jsonSchema: { type: "string" },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
protocols: {
|
|
69
|
+
rest: {
|
|
70
|
+
routes: [
|
|
71
|
+
{
|
|
72
|
+
name: "testRoute",
|
|
73
|
+
method: "GET",
|
|
74
|
+
path: "/test",
|
|
75
|
+
responses: {
|
|
76
|
+
"200": {
|
|
77
|
+
description: "Success",
|
|
78
|
+
content: {
|
|
79
|
+
"application/json": {
|
|
80
|
+
schemaRef: "TestSchema",
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
92
|
+
node_assert_1.default.strictEqual(report.recommendations.length, 0);
|
|
93
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 0);
|
|
94
|
+
// This schema is referenced, so no compression savings
|
|
95
|
+
node_assert_1.default.strictEqual(report.potentialSavings.referenceCompression, 0);
|
|
96
|
+
});
|
|
97
|
+
(0, node_test_1.it)("should handle documents without schemas", () => {
|
|
98
|
+
const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
|
|
99
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
100
|
+
node_assert_1.default.strictEqual(report.recommendations.length, 0);
|
|
101
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 0);
|
|
102
|
+
node_assert_1.default.strictEqual(report.potentialSavings.referenceCompression, 0);
|
|
103
|
+
});
|
|
104
|
+
(0, node_test_1.it)("should handle documents without service", () => {
|
|
105
|
+
const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
|
|
106
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
107
|
+
node_assert_1.default.strictEqual(report.recommendations.length, 0);
|
|
108
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 0);
|
|
109
|
+
node_assert_1.default.strictEqual(report.potentialSavings.referenceCompression, 0);
|
|
110
|
+
});
|
|
111
|
+
(0, node_test_1.it)("should estimate reference compression savings", () => {
|
|
112
|
+
const doc = {
|
|
113
|
+
unispecVersion: "1.0.0",
|
|
114
|
+
service: {
|
|
115
|
+
name: "test",
|
|
116
|
+
schemas: {
|
|
117
|
+
TestSchema: {
|
|
118
|
+
name: "TestSchema",
|
|
119
|
+
description: "Test schema",
|
|
120
|
+
jsonSchema: { type: "string" },
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
protocols: {
|
|
124
|
+
rest: {
|
|
125
|
+
routes: [
|
|
126
|
+
{
|
|
127
|
+
name: "testRoute",
|
|
128
|
+
method: "GET",
|
|
129
|
+
path: "/test",
|
|
130
|
+
responses: {
|
|
131
|
+
"200": {
|
|
132
|
+
description: "Success",
|
|
133
|
+
content: {
|
|
134
|
+
"application/json": {
|
|
135
|
+
schemaRef: "#/service/schemas/TestSchema",
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
147
|
+
// Should estimate reference compression (only 1 reference, so no compression)
|
|
148
|
+
node_assert_1.default.strictEqual(report.potentialSavings.referenceCompression, 0);
|
|
149
|
+
});
|
|
150
|
+
(0, node_test_1.it)("should work with real examples from node_modules", () => {
|
|
151
|
+
const doc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
152
|
+
const report = (0, core_1.generateOptimizationReport)(JSON.parse(JSON.stringify(doc)));
|
|
153
|
+
// mixed-complete.json is well-structured, so minimal recommendations
|
|
154
|
+
node_assert_1.default.ok(report.recommendations.length >= 0);
|
|
155
|
+
node_assert_1.default.ok(report.potentialSavings.schemaReduction >= 0);
|
|
156
|
+
node_assert_1.default.ok(report.potentialSavings.referenceCompression >= 0);
|
|
157
|
+
});
|
|
158
|
+
(0, node_test_1.it)("should handle complex documents with multiple optimization opportunities", () => {
|
|
159
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
160
|
+
// Add multiple orphaned schemas
|
|
161
|
+
if (doc.service?.schemas) {
|
|
162
|
+
doc.service.schemas.Orphaned1 = {
|
|
163
|
+
description: "Orphaned schema 1",
|
|
164
|
+
jsonSchema: { type: "string" },
|
|
165
|
+
};
|
|
166
|
+
doc.service.schemas.Orphaned2 = {
|
|
167
|
+
description: "Orphaned schema 2",
|
|
168
|
+
jsonSchema: { type: "number" },
|
|
169
|
+
};
|
|
170
|
+
doc.service.schemas.Orphaned3 = {
|
|
171
|
+
description: "Orphaned schema 3",
|
|
172
|
+
jsonSchema: { type: "boolean" },
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
176
|
+
// Should recommend multiple optimizations
|
|
177
|
+
node_assert_1.default.ok(report.recommendations.length >= 2);
|
|
178
|
+
// Should account for all potential savings
|
|
179
|
+
node_assert_1.default.ok(report.potentialSavings.schemaReduction >= 3); // 1 duplicate + 2+ orphaned
|
|
180
|
+
});
|
|
181
|
+
(0, node_test_1.it)("should not recommend removing schemas that are referenced", () => {
|
|
182
|
+
const doc = {
|
|
183
|
+
unispecVersion: "1.0.0",
|
|
184
|
+
service: {
|
|
185
|
+
name: "test",
|
|
186
|
+
schemas: {
|
|
187
|
+
ReferencedSchema: {
|
|
188
|
+
name: "ReferencedSchema",
|
|
189
|
+
description: "Referenced schema",
|
|
190
|
+
jsonSchema: { type: "string" },
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
protocols: {
|
|
194
|
+
rest: {
|
|
195
|
+
routes: [
|
|
196
|
+
{
|
|
197
|
+
name: "testRoute",
|
|
198
|
+
method: "GET",
|
|
199
|
+
path: "/test",
|
|
200
|
+
responses: {
|
|
201
|
+
"200": {
|
|
202
|
+
description: "Success",
|
|
203
|
+
content: {
|
|
204
|
+
"application/json": {
|
|
205
|
+
schemaRef: "ReferencedSchema",
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
const report = (0, core_1.generateOptimizationReport)(doc);
|
|
217
|
+
// Should not recommend removing the referenced schema
|
|
218
|
+
const removeRecommendation = report.recommendations.find((rec) => rec.includes("Remove"));
|
|
219
|
+
node_assert_1.default.strictEqual(removeRecommendation, undefined);
|
|
220
|
+
node_assert_1.default.strictEqual(report.potentialSavings.schemaReduction, 0);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
@@ -0,0 +1,187 @@
|
|
|
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 core_1 = require("../../src/optimizer/core.js");
|
|
9
|
+
const utils_1 = require("./utils.js");
|
|
10
|
+
(0, node_test_1.describe)("optimizeDocument", () => {
|
|
11
|
+
(0, node_test_1.it)("should apply all optimizations by default", () => {
|
|
12
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
13
|
+
const result = (0, core_1.optimizeDocument)(doc);
|
|
14
|
+
node_assert_1.default.ok(result.document);
|
|
15
|
+
node_assert_1.default.ok(result.statistics);
|
|
16
|
+
node_assert_1.default.ok(Array.isArray(result.changes));
|
|
17
|
+
// Should have removed duplicate schemas
|
|
18
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 3);
|
|
19
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 2);
|
|
20
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 1);
|
|
21
|
+
node_assert_1.default.strictEqual(result.statistics.deduplicatedSchemas, 1);
|
|
22
|
+
// Should have changes recorded
|
|
23
|
+
node_assert_1.default.ok(result.changes.length > 0);
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.it)("should apply only specified optimizations", () => {
|
|
26
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
27
|
+
const result = (0, core_1.optimizeDocument)(doc, {
|
|
28
|
+
dedupeSchemas: true,
|
|
29
|
+
sortSchemas: false,
|
|
30
|
+
removeUnusedSchemas: false,
|
|
31
|
+
compressReferences: false,
|
|
32
|
+
});
|
|
33
|
+
// Should only deduplicate
|
|
34
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 1);
|
|
35
|
+
node_assert_1.default.strictEqual(result.statistics.deduplicatedSchemas, 1);
|
|
36
|
+
// Check that changes mention deduplication
|
|
37
|
+
const deduplicationChange = result.changes.find((change) => change.includes("Deduplicated"));
|
|
38
|
+
node_assert_1.default.ok(deduplicationChange);
|
|
39
|
+
});
|
|
40
|
+
(0, node_test_1.it)("should handle documents without schemas", () => {
|
|
41
|
+
const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
|
|
42
|
+
const result = (0, core_1.optimizeDocument)(doc);
|
|
43
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 0);
|
|
44
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 0);
|
|
45
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 0);
|
|
46
|
+
node_assert_1.default.strictEqual(result.statistics.deduplicatedSchemas, 0);
|
|
47
|
+
node_assert_1.default.strictEqual(result.changes.length, 0);
|
|
48
|
+
});
|
|
49
|
+
(0, node_test_1.it)("should handle documents without service", () => {
|
|
50
|
+
const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
|
|
51
|
+
const result = (0, core_1.optimizeDocument)(doc);
|
|
52
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 0);
|
|
53
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 0);
|
|
54
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 0);
|
|
55
|
+
node_assert_1.default.strictEqual(result.statistics.deduplicatedSchemas, 0);
|
|
56
|
+
node_assert_1.default.strictEqual(result.changes.length, 0);
|
|
57
|
+
});
|
|
58
|
+
(0, node_test_1.it)("should remove orphaned schemas when enabled", () => {
|
|
59
|
+
const doc = (0, utils_1.createDocumentWithOrphanedSchemas)();
|
|
60
|
+
const result = (0, core_1.optimizeDocument)(doc, {
|
|
61
|
+
removeUnusedSchemas: true,
|
|
62
|
+
dedupeSchemas: false,
|
|
63
|
+
sortSchemas: false,
|
|
64
|
+
compressReferences: false,
|
|
65
|
+
});
|
|
66
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 3);
|
|
67
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 1);
|
|
68
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 2);
|
|
69
|
+
// Should have changes about orphaned schema removal
|
|
70
|
+
const orphanedChange = result.changes.find((change) => change.includes("orphaned"));
|
|
71
|
+
node_assert_1.default.ok(orphanedChange);
|
|
72
|
+
});
|
|
73
|
+
(0, node_test_1.it)("should sort schemas when enabled", () => {
|
|
74
|
+
const doc = (0, utils_1.createDocumentWithUnsortedSchemas)();
|
|
75
|
+
const result = (0, core_1.optimizeDocument)(doc, {
|
|
76
|
+
sortSchemas: true,
|
|
77
|
+
dedupeSchemas: false,
|
|
78
|
+
removeUnusedSchemas: false,
|
|
79
|
+
compressReferences: false,
|
|
80
|
+
});
|
|
81
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 3);
|
|
82
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 3);
|
|
83
|
+
// Check schemas are sorted
|
|
84
|
+
const schemaNames = Object.keys(result.document.service?.schemas || {});
|
|
85
|
+
node_assert_1.default.deepStrictEqual(schemaNames, ["Alpha", "Beta", "Zebra"]);
|
|
86
|
+
// Should have changes about sorting
|
|
87
|
+
const sortChange = result.changes.find((change) => change.includes("Sorted"));
|
|
88
|
+
node_assert_1.default.ok(sortChange);
|
|
89
|
+
});
|
|
90
|
+
(0, node_test_1.it)("should compress references when enabled", () => {
|
|
91
|
+
const doc = (0, utils_1.createDocumentWithLongReferences)();
|
|
92
|
+
const result = (0, core_1.optimizeDocument)(doc, {
|
|
93
|
+
compressReferences: true,
|
|
94
|
+
dedupeSchemas: false,
|
|
95
|
+
sortSchemas: false,
|
|
96
|
+
removeUnusedSchemas: false,
|
|
97
|
+
});
|
|
98
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 1);
|
|
99
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 1);
|
|
100
|
+
// Should have changes about compression
|
|
101
|
+
const compressionChange = result.changes.find((change) => change.includes("Compressed"));
|
|
102
|
+
node_assert_1.default.ok(compressionChange);
|
|
103
|
+
});
|
|
104
|
+
(0, node_test_1.it)("should create a deep copy of the document", () => {
|
|
105
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
106
|
+
const originalSchemas = doc.service?.schemas;
|
|
107
|
+
const result = (0, core_1.optimizeDocument)(doc);
|
|
108
|
+
// Original document should be unchanged
|
|
109
|
+
node_assert_1.default.strictEqual(doc.service?.schemas, originalSchemas);
|
|
110
|
+
node_assert_1.default.strictEqual(Object.keys(doc.service?.schemas || {}).length, 3);
|
|
111
|
+
// Result document should be different object
|
|
112
|
+
node_assert_1.default.notStrictEqual(result.document, doc);
|
|
113
|
+
node_assert_1.default.notStrictEqual(result.document.service, doc.service);
|
|
114
|
+
node_assert_1.default.notStrictEqual(result.document.service?.schemas, doc.service?.schemas);
|
|
115
|
+
});
|
|
116
|
+
(0, node_test_1.it)("should work with complex documents", () => {
|
|
117
|
+
const doc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
118
|
+
const result = (0, core_1.optimizeDocument)(JSON.parse(JSON.stringify(doc)));
|
|
119
|
+
node_assert_1.default.ok(result.document);
|
|
120
|
+
node_assert_1.default.ok(result.statistics);
|
|
121
|
+
node_assert_1.default.ok(Array.isArray(result.changes));
|
|
122
|
+
// mixed-complete.json has 2 schemas that are referenced
|
|
123
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 2);
|
|
124
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 2);
|
|
125
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 0);
|
|
126
|
+
node_assert_1.default.strictEqual(result.statistics.deduplicatedSchemas, 0);
|
|
127
|
+
});
|
|
128
|
+
(0, node_test_1.it)("should handle all optimizations together", () => {
|
|
129
|
+
// Create a simpler document with all optimization opportunities
|
|
130
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
131
|
+
// Add one orphaned schema
|
|
132
|
+
if (doc.service?.schemas) {
|
|
133
|
+
doc.service.schemas.OrphanedSchema = {
|
|
134
|
+
description: "Orphaned schema",
|
|
135
|
+
jsonSchema: { type: "string" },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Add long reference
|
|
139
|
+
if (doc.service?.protocols?.rest?.routes?.[0]) {
|
|
140
|
+
doc.service.protocols.rest.routes[0].responses = {
|
|
141
|
+
"200": {
|
|
142
|
+
description: "Success",
|
|
143
|
+
content: {
|
|
144
|
+
"application/json": {
|
|
145
|
+
schemaRef: "#/service/schemas/Person",
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const result = (0, core_1.optimizeDocument)(doc, {
|
|
152
|
+
dedupeSchemas: true,
|
|
153
|
+
sortSchemas: true,
|
|
154
|
+
removeUnusedSchemas: true,
|
|
155
|
+
compressReferences: true,
|
|
156
|
+
});
|
|
157
|
+
node_assert_1.default.strictEqual(result.statistics.originalSchemas, 4);
|
|
158
|
+
node_assert_1.default.strictEqual(result.statistics.optimizedSchemas, 1); // Person (Profile is orphaned)
|
|
159
|
+
node_assert_1.default.strictEqual(result.statistics.removedSchemas, 3); // User + Profile + OrphanedSchema
|
|
160
|
+
node_assert_1.default.strictEqual(result.statistics.deduplicatedSchemas, 1); // User removed as duplicate
|
|
161
|
+
// Should have multiple changes
|
|
162
|
+
node_assert_1.default.ok(result.changes.length >= 2);
|
|
163
|
+
// Check final state
|
|
164
|
+
const finalSchemaNames = Object.keys(result.document.service?.schemas || {});
|
|
165
|
+
node_assert_1.default.deepStrictEqual(finalSchemaNames, ["Person"]); // Only Person remains
|
|
166
|
+
// Check reference was compressed
|
|
167
|
+
const route = result.document.service?.protocols?.rest?.routes?.[0];
|
|
168
|
+
const schemaRef = route?.responses?.["200"]?.content?.["application/json"]?.schemaRef;
|
|
169
|
+
node_assert_1.default.strictEqual(schemaRef, "Person");
|
|
170
|
+
});
|
|
171
|
+
(0, node_test_1.it)("should handle empty options", () => {
|
|
172
|
+
const doc = (0, utils_1.createDocumentWithDuplicateSchemas)();
|
|
173
|
+
const result = (0, core_1.optimizeDocument)(doc, {});
|
|
174
|
+
// Should apply default optimizations (all enabled except removeUnusedSchemas)
|
|
175
|
+
node_assert_1.default.ok(result.statistics.removedSchemas >= 1); // At least deduplication
|
|
176
|
+
});
|
|
177
|
+
(0, node_test_1.it)("should preserve document structure", () => {
|
|
178
|
+
const doc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
179
|
+
const result = (0, core_1.optimizeDocument)(JSON.parse(JSON.stringify(doc)));
|
|
180
|
+
// Should preserve all required fields
|
|
181
|
+
node_assert_1.default.strictEqual(result.document.unispecVersion, doc.unispecVersion);
|
|
182
|
+
node_assert_1.default.strictEqual(result.document.service?.name, doc.service?.name);
|
|
183
|
+
node_assert_1.default.strictEqual(result.document.service?.description, doc.service?.description);
|
|
184
|
+
node_assert_1.default.ok(result.document.service?.protocols);
|
|
185
|
+
node_assert_1.default.ok(result.document.service?.schemas);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
@@ -0,0 +1,194 @@
|
|
|
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 optimization_functions_1 = require("../../src/optimizer/optimization-functions.js");
|
|
9
|
+
const utils_1 = require("./utils.js");
|
|
10
|
+
(0, node_test_1.describe)("removeOrphanedSchemas", () => {
|
|
11
|
+
(0, node_test_1.it)("should remove orphaned schemas", () => {
|
|
12
|
+
const doc = (0, utils_1.createDocumentWithOrphanedSchemas)();
|
|
13
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
14
|
+
node_assert_1.default.strictEqual(removed.length, 2);
|
|
15
|
+
node_assert_1.default.ok(removed.includes("OrphanedSchema1"));
|
|
16
|
+
node_assert_1.default.ok(removed.includes("OrphanedSchema2"));
|
|
17
|
+
// Check that only used schema remains
|
|
18
|
+
const remainingSchemas = Object.keys(doc.service?.schemas || {});
|
|
19
|
+
node_assert_1.default.strictEqual(remainingSchemas.length, 1);
|
|
20
|
+
node_assert_1.default.ok(remainingSchemas.includes("UsedSchema"));
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.it)("should keep all schemas when all are referenced", () => {
|
|
23
|
+
const doc = (0, utils_1.createDocumentWithOrphanedSchemas)();
|
|
24
|
+
// Add references to all schemas
|
|
25
|
+
if (doc.service?.protocols?.rest?.routes?.[0]) {
|
|
26
|
+
doc.service.protocols.rest.routes[0].responses = {
|
|
27
|
+
"200": {
|
|
28
|
+
description: "Success",
|
|
29
|
+
content: {
|
|
30
|
+
"application/json": {
|
|
31
|
+
schemaRef: "UsedSchema",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
"201": {
|
|
36
|
+
description: "Created",
|
|
37
|
+
content: {
|
|
38
|
+
"application/json": {
|
|
39
|
+
schemaRef: "OrphanedSchema1",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
"202": {
|
|
44
|
+
description: "Accepted",
|
|
45
|
+
content: {
|
|
46
|
+
"application/json": {
|
|
47
|
+
schemaRef: "OrphanedSchema2",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
54
|
+
node_assert_1.default.strictEqual(removed.length, 0);
|
|
55
|
+
node_assert_1.default.strictEqual(Object.keys(doc.service?.schemas || {}).length, 3);
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.it)("should handle documents without schemas", () => {
|
|
58
|
+
const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
|
|
59
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
60
|
+
node_assert_1.default.strictEqual(removed.length, 0);
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.it)("should handle documents without service", () => {
|
|
63
|
+
const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
|
|
64
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
65
|
+
node_assert_1.default.strictEqual(removed.length, 0);
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.it)("should handle empty schemas object", () => {
|
|
68
|
+
const doc = {
|
|
69
|
+
unispecVersion: "1.0.0",
|
|
70
|
+
service: { name: "test", schemas: {} },
|
|
71
|
+
};
|
|
72
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
73
|
+
node_assert_1.default.strictEqual(removed.length, 0);
|
|
74
|
+
});
|
|
75
|
+
(0, node_test_1.it)("should find references in nested structures", () => {
|
|
76
|
+
const doc = {
|
|
77
|
+
unispecVersion: "1.0.0",
|
|
78
|
+
service: {
|
|
79
|
+
name: "test",
|
|
80
|
+
schemas: {
|
|
81
|
+
ReferencedSchema: {
|
|
82
|
+
name: "ReferencedSchema",
|
|
83
|
+
description: "Referenced schema",
|
|
84
|
+
jsonSchema: { type: "string" },
|
|
85
|
+
},
|
|
86
|
+
UnreferencedSchema: {
|
|
87
|
+
name: "UnreferencedSchema",
|
|
88
|
+
description: "Unreferenced schema",
|
|
89
|
+
jsonSchema: { type: "number" },
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
protocols: {
|
|
93
|
+
rest: {
|
|
94
|
+
routes: [
|
|
95
|
+
{
|
|
96
|
+
name: "testRoute",
|
|
97
|
+
method: "GET",
|
|
98
|
+
path: "/test",
|
|
99
|
+
responses: {
|
|
100
|
+
"200": {
|
|
101
|
+
description: "Success",
|
|
102
|
+
content: {
|
|
103
|
+
"application/json": {
|
|
104
|
+
schemaRef: "ReferencedSchema",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
graphql: {
|
|
113
|
+
queries: [
|
|
114
|
+
{
|
|
115
|
+
name: "testQuery",
|
|
116
|
+
returnType: "ReferencedSchema",
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
websocket: {
|
|
121
|
+
channels: [
|
|
122
|
+
{
|
|
123
|
+
name: "testChannel",
|
|
124
|
+
messages: [
|
|
125
|
+
{
|
|
126
|
+
name: "testMessage",
|
|
127
|
+
schemaRef: "ReferencedSchema",
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
137
|
+
node_assert_1.default.strictEqual(removed.length, 1);
|
|
138
|
+
node_assert_1.default.ok(removed.includes("UnreferencedSchema"));
|
|
139
|
+
node_assert_1.default.ok(doc.service?.schemas?.ReferencedSchema);
|
|
140
|
+
node_assert_1.default.ok(!doc.service?.schemas?.UnreferencedSchema);
|
|
141
|
+
});
|
|
142
|
+
(0, node_test_1.it)("should work with real examples from node_modules", () => {
|
|
143
|
+
const doc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "mixed-complete.json"));
|
|
144
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(JSON.parse(JSON.stringify(doc)));
|
|
145
|
+
// mixed-complete.json has schemas that are referenced, so nothing should be removed
|
|
146
|
+
node_assert_1.default.strictEqual(removed.length, 0);
|
|
147
|
+
});
|
|
148
|
+
(0, node_test_1.it)("should handle schema references in different formats", () => {
|
|
149
|
+
const doc = {
|
|
150
|
+
unispecVersion: "1.0.0",
|
|
151
|
+
service: {
|
|
152
|
+
name: "test",
|
|
153
|
+
schemas: {
|
|
154
|
+
TestSchema: {
|
|
155
|
+
name: "TestSchema",
|
|
156
|
+
description: "Test schema",
|
|
157
|
+
jsonSchema: { type: "string" },
|
|
158
|
+
},
|
|
159
|
+
OrphanedSchema: {
|
|
160
|
+
name: "OrphanedSchema",
|
|
161
|
+
description: "Orphaned schema",
|
|
162
|
+
jsonSchema: { type: "number" },
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
protocols: {
|
|
166
|
+
rest: {
|
|
167
|
+
routes: [
|
|
168
|
+
{
|
|
169
|
+
name: "testRoute",
|
|
170
|
+
method: "GET",
|
|
171
|
+
path: "/test",
|
|
172
|
+
responses: {
|
|
173
|
+
"200": {
|
|
174
|
+
description: "Success",
|
|
175
|
+
content: {
|
|
176
|
+
"application/json": {
|
|
177
|
+
schemaRef: "#/service/schemas/TestSchema", // JSON Pointer format
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
const removed = (0, optimization_functions_1.removeOrphanedSchemas)(doc);
|
|
189
|
+
node_assert_1.default.strictEqual(removed.length, 1);
|
|
190
|
+
node_assert_1.default.ok(removed.includes("OrphanedSchema"));
|
|
191
|
+
node_assert_1.default.ok(doc.service?.schemas?.TestSchema);
|
|
192
|
+
node_assert_1.default.ok(!doc.service?.schemas?.OrphanedSchema);
|
|
193
|
+
});
|
|
194
|
+
});
|