@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.
Files changed (306) hide show
  1. package/dist/cjs/diff/annotators.js +36 -9
  2. package/dist/cjs/src/cache/cache-factory.js +72 -0
  3. package/dist/cjs/src/cache/cache-manager.js +128 -0
  4. package/dist/cjs/src/cache/constants.js +25 -0
  5. package/dist/cjs/src/cache/hash-utils.js +19 -0
  6. package/dist/cjs/src/cache/hashing.js +230 -0
  7. package/dist/cjs/src/cache/index.js +24 -0
  8. package/dist/cjs/src/cache/lru-cache.js +144 -0
  9. package/dist/cjs/src/cache/types.js +5 -0
  10. package/dist/cjs/src/diff/annotators.js +160 -0
  11. package/dist/cjs/src/diff/change-reports.js +369 -0
  12. package/dist/cjs/src/diff/core.js +158 -0
  13. package/dist/cjs/src/diff/enhanced-diff.js +65 -0
  14. package/dist/cjs/src/diff/impact-strategies-refactored.js +230 -0
  15. package/dist/cjs/src/diff/impact-strategies.js +219 -0
  16. package/dist/cjs/src/diff/index.js +27 -0
  17. package/dist/cjs/src/diff/metrics-calculator.js +69 -0
  18. package/dist/cjs/src/diff/risk-calculator.js +58 -0
  19. package/dist/cjs/src/diff/suggestion-generator.js +78 -0
  20. package/dist/cjs/src/diff/types.js +11 -0
  21. package/dist/cjs/src/errors/base-error.js +33 -0
  22. package/dist/cjs/src/errors/config-error.js +11 -0
  23. package/dist/cjs/src/errors/error-factory.js +48 -0
  24. package/dist/cjs/src/errors/index.js +19 -0
  25. package/dist/cjs/src/errors/loader-error.js +11 -0
  26. package/dist/cjs/src/errors/reference-error.js +11 -0
  27. package/dist/cjs/src/errors/schema-error.js +11 -0
  28. package/dist/cjs/src/errors/security-error.js +11 -0
  29. package/dist/cjs/src/errors/semantic-error.js +11 -0
  30. package/dist/cjs/src/generated-schemas.js +2100 -0
  31. package/dist/cjs/src/index.js +59 -0
  32. package/dist/cjs/src/loader/index.js +13 -0
  33. package/dist/cjs/src/loader/security-validator.js +53 -0
  34. package/dist/cjs/src/loader/types.js +11 -0
  35. package/dist/cjs/src/loader/unispec-loader.js +84 -0
  36. package/dist/cjs/src/loader/yaml-loader.js +76 -0
  37. package/dist/cjs/src/normalizer/core.js +37 -0
  38. package/dist/cjs/src/normalizer/graphql-normalizer.js +67 -0
  39. package/dist/cjs/src/normalizer/index.js +7 -0
  40. package/dist/cjs/src/normalizer/rest-normalizer.js +51 -0
  41. package/dist/cjs/src/normalizer/types.js +2 -0
  42. package/dist/cjs/src/normalizer/utils.js +49 -0
  43. package/dist/cjs/src/normalizer/websocket-normalizer.js +81 -0
  44. package/dist/cjs/src/optimizer/core.js +140 -0
  45. package/dist/cjs/src/optimizer/index.js +17 -0
  46. package/dist/cjs/src/optimizer/optimization-functions.js +185 -0
  47. package/dist/cjs/src/optimizer/types.js +2 -0
  48. package/dist/cjs/src/optimizer/utils.js +32 -0
  49. package/dist/cjs/src/schemas/dedupe.js +113 -0
  50. package/dist/cjs/src/schemas/index.js +14 -0
  51. package/dist/cjs/src/schemas/resolver.js +42 -0
  52. package/dist/cjs/src/schemas/utils.js +53 -0
  53. package/dist/cjs/src/types/index.js +2 -0
  54. package/dist/cjs/src/validator/ajv-validator.js +82 -0
  55. package/dist/cjs/src/validator/config-validator-main.js +34 -0
  56. package/dist/cjs/src/validator/config-validator.js +17 -0
  57. package/dist/cjs/src/validator/index.js +23 -0
  58. package/dist/cjs/src/validator/object-traversal.js +112 -0
  59. package/dist/cjs/src/validator/reference-validator.js +233 -0
  60. package/dist/cjs/src/validator/schema-references.js +116 -0
  61. package/dist/cjs/src/validator/semantic-validator.js +328 -0
  62. package/dist/cjs/src/validator/tests-validator.js +16 -0
  63. package/dist/cjs/src/validator/types.js +2 -0
  64. package/dist/cjs/src/validator/unispec-validator.js +80 -0
  65. package/dist/cjs/src/validator/validator-factory.js +77 -0
  66. package/dist/cjs/src/versions.js +147 -0
  67. package/dist/cjs/tests/cache/cache.test.js +274 -0
  68. package/dist/cjs/tests/cache/utils.js +32 -0
  69. package/dist/cjs/tests/concurrency-normalizer-optimizer.test.js +1 -0
  70. package/dist/cjs/tests/diff/diff-annotators.test.js +280 -0
  71. package/dist/cjs/tests/diff/diff-comprehensive.test.js +262 -0
  72. package/dist/cjs/tests/diff/diff-extended.test.js +235 -0
  73. package/dist/cjs/tests/diff/diff.test.js +189 -0
  74. package/dist/cjs/tests/diff/utils.js +8 -0
  75. package/dist/cjs/tests/errors/errors-integration.test.js +173 -0
  76. package/dist/cjs/tests/errors/errors.test.js +280 -0
  77. package/dist/cjs/tests/errors/utils.js +7 -0
  78. package/dist/cjs/tests/loader/integration.test.js +216 -0
  79. package/dist/cjs/tests/loader/loader.test.js +341 -0
  80. package/dist/cjs/tests/normalizer/normalizer-comprehensive.test.js +648 -0
  81. package/dist/cjs/tests/normalizer/normalizer-invalid.test.js +258 -0
  82. package/dist/cjs/tests/normalizer/normalizer-valid.test.js +238 -0
  83. package/dist/cjs/tests/normalizer/utils.js +47 -0
  84. package/dist/cjs/tests/optimizer/compress-references.test.js +304 -0
  85. package/dist/cjs/tests/optimizer/deduplication.test.js +132 -0
  86. package/dist/cjs/tests/optimizer/integration.test.js +131 -0
  87. package/dist/cjs/tests/optimizer/optimization-report.test.js +222 -0
  88. package/dist/cjs/tests/optimizer/optimize-document.test.js +187 -0
  89. package/dist/cjs/tests/optimizer/orphaned-schemas.test.js +194 -0
  90. package/dist/cjs/tests/optimizer/sort-schemas.test.js +131 -0
  91. package/dist/cjs/tests/optimizer/utils.js +209 -0
  92. package/dist/cjs/tests/schemas/schemas-edge-cases.test.js +223 -0
  93. package/dist/cjs/tests/schemas/schemas.test.js +400 -0
  94. package/dist/cjs/tests/schemas/utils.js +7 -0
  95. package/dist/cjs/tests/utils.js +131 -0
  96. package/dist/cjs/tests/validator/config-validator.test.js +78 -0
  97. package/dist/cjs/tests/validator/debug-config.js +1 -0
  98. package/dist/cjs/tests/validator/debug-missing-service.js +1 -0
  99. package/dist/cjs/tests/validator/debug-other-configs.js +1 -0
  100. package/dist/cjs/tests/validator/debug-references.js +1 -0
  101. package/dist/cjs/tests/validator/unispec-validator.test.js +103 -0
  102. package/dist/cjs/tests/validator/utils.js +25 -0
  103. package/dist/diff/annotators.js +36 -9
  104. package/dist/src/cache/cache-factory.d.ts +31 -0
  105. package/dist/src/cache/cache-factory.js +65 -0
  106. package/dist/src/cache/cache-manager.d.ts +62 -0
  107. package/dist/src/cache/cache-manager.js +124 -0
  108. package/dist/src/cache/constants.d.ts +21 -0
  109. package/dist/src/cache/constants.js +22 -0
  110. package/dist/src/cache/hash-utils.d.ts +11 -0
  111. package/dist/src/cache/hash-utils.js +15 -0
  112. package/dist/src/cache/hashing.d.ts +28 -0
  113. package/dist/src/cache/hashing.js +193 -0
  114. package/dist/src/cache/index.d.ts +6 -0
  115. package/dist/src/cache/index.js +10 -0
  116. package/dist/src/cache/lru-cache.d.ts +44 -0
  117. package/dist/src/cache/lru-cache.js +140 -0
  118. package/dist/src/cache/types.d.ts +24 -0
  119. package/dist/src/cache/types.js +4 -0
  120. package/dist/src/diff/annotators.d.ts +4 -0
  121. package/dist/src/diff/annotators.js +155 -0
  122. package/dist/src/diff/change-reports.d.ts +37 -0
  123. package/dist/src/diff/change-reports.js +366 -0
  124. package/dist/src/diff/core.d.ts +26 -0
  125. package/dist/src/diff/core.js +155 -0
  126. package/dist/src/diff/enhanced-diff.d.ts +51 -0
  127. package/dist/src/diff/enhanced-diff.js +62 -0
  128. package/dist/src/diff/impact-strategies-refactored.d.ts +69 -0
  129. package/dist/src/diff/impact-strategies-refactored.js +223 -0
  130. package/dist/src/diff/impact-strategies.d.ts +41 -0
  131. package/dist/src/diff/impact-strategies.js +212 -0
  132. package/dist/src/diff/index.d.ts +8 -0
  133. package/dist/src/diff/index.js +11 -0
  134. package/dist/src/diff/metrics-calculator.d.ts +23 -0
  135. package/dist/src/diff/metrics-calculator.js +65 -0
  136. package/dist/src/diff/risk-calculator.d.ts +23 -0
  137. package/dist/src/diff/risk-calculator.js +55 -0
  138. package/dist/src/diff/suggestion-generator.d.ts +18 -0
  139. package/dist/src/diff/suggestion-generator.js +74 -0
  140. package/dist/src/diff/types.d.ts +24 -0
  141. package/dist/src/diff/types.js +8 -0
  142. package/dist/src/errors/base-error.d.ts +20 -0
  143. package/dist/src/errors/base-error.js +29 -0
  144. package/dist/src/errors/config-error.d.ts +4 -0
  145. package/dist/src/errors/config-error.js +7 -0
  146. package/dist/src/errors/error-factory.d.ts +22 -0
  147. package/dist/src/errors/error-factory.js +45 -0
  148. package/dist/src/errors/index.d.ts +8 -0
  149. package/dist/src/errors/index.js +8 -0
  150. package/dist/src/errors/loader-error.d.ts +4 -0
  151. package/dist/src/errors/loader-error.js +7 -0
  152. package/dist/src/errors/reference-error.d.ts +4 -0
  153. package/dist/src/errors/reference-error.js +7 -0
  154. package/dist/src/errors/schema-error.d.ts +4 -0
  155. package/dist/src/errors/schema-error.js +7 -0
  156. package/dist/src/errors/security-error.d.ts +4 -0
  157. package/dist/src/errors/security-error.js +7 -0
  158. package/dist/src/errors/semantic-error.d.ts +4 -0
  159. package/dist/src/errors/semantic-error.js +7 -0
  160. package/dist/src/generated-schemas.d.ts +2073 -0
  161. package/dist/src/generated-schemas.js +2097 -0
  162. package/dist/src/index.d.ts +13 -0
  163. package/dist/src/index.js +43 -0
  164. package/dist/src/loader/index.d.ts +5 -0
  165. package/dist/src/loader/index.js +5 -0
  166. package/dist/src/loader/security-validator.d.ts +5 -0
  167. package/dist/src/loader/security-validator.js +50 -0
  168. package/dist/src/loader/types.d.ts +30 -0
  169. package/dist/src/loader/types.js +8 -0
  170. package/dist/src/loader/unispec-loader.d.ts +10 -0
  171. package/dist/src/loader/unispec-loader.js +81 -0
  172. package/dist/src/loader/yaml-loader.d.ts +10 -0
  173. package/dist/src/loader/yaml-loader.js +39 -0
  174. package/dist/src/normalizer/core.d.ts +24 -0
  175. package/dist/src/normalizer/core.js +34 -0
  176. package/dist/src/normalizer/graphql-normalizer.d.ts +8 -0
  177. package/dist/src/normalizer/graphql-normalizer.js +64 -0
  178. package/dist/src/normalizer/index.d.ts +2 -0
  179. package/dist/src/normalizer/index.js +3 -0
  180. package/dist/src/normalizer/rest-normalizer.d.ts +8 -0
  181. package/dist/src/normalizer/rest-normalizer.js +48 -0
  182. package/dist/src/normalizer/types.d.ts +7 -0
  183. package/dist/src/normalizer/types.js +1 -0
  184. package/dist/src/normalizer/utils.d.ts +17 -0
  185. package/dist/src/normalizer/utils.js +45 -0
  186. package/dist/src/normalizer/websocket-normalizer.d.ts +8 -0
  187. package/dist/src/normalizer/websocket-normalizer.js +78 -0
  188. package/dist/src/optimizer/core.d.ts +17 -0
  189. package/dist/src/optimizer/core.js +136 -0
  190. package/dist/src/optimizer/index.d.ts +4 -0
  191. package/dist/src/optimizer/index.js +7 -0
  192. package/dist/src/optimizer/optimization-functions.d.ts +32 -0
  193. package/dist/src/optimizer/optimization-functions.js +179 -0
  194. package/dist/src/optimizer/types.d.ts +28 -0
  195. package/dist/src/optimizer/types.js +1 -0
  196. package/dist/src/optimizer/utils.d.ts +7 -0
  197. package/dist/src/optimizer/utils.js +29 -0
  198. package/dist/src/schemas/dedupe.d.ts +9 -0
  199. package/dist/src/schemas/dedupe.js +110 -0
  200. package/dist/src/schemas/index.d.ts +3 -0
  201. package/dist/src/schemas/index.js +6 -0
  202. package/dist/src/schemas/resolver.d.ts +19 -0
  203. package/dist/src/schemas/resolver.js +38 -0
  204. package/dist/src/schemas/utils.d.ts +20 -0
  205. package/dist/src/schemas/utils.js +49 -0
  206. package/dist/src/types/index.d.ts +434 -0
  207. package/dist/src/types/index.js +1 -0
  208. package/dist/src/validator/ajv-validator.d.ts +15 -0
  209. package/dist/src/validator/ajv-validator.js +75 -0
  210. package/dist/src/validator/config-validator-main.d.ts +10 -0
  211. package/dist/src/validator/config-validator-main.js +31 -0
  212. package/dist/src/validator/config-validator.d.ts +5 -0
  213. package/dist/src/validator/config-validator.js +14 -0
  214. package/dist/src/validator/index.d.ts +10 -0
  215. package/dist/src/validator/index.js +11 -0
  216. package/dist/src/validator/object-traversal.d.ts +52 -0
  217. package/dist/src/validator/object-traversal.js +104 -0
  218. package/dist/src/validator/reference-validator.d.ts +31 -0
  219. package/dist/src/validator/reference-validator.js +230 -0
  220. package/dist/src/validator/schema-references.d.ts +23 -0
  221. package/dist/src/validator/schema-references.js +111 -0
  222. package/dist/src/validator/semantic-validator.d.ts +26 -0
  223. package/dist/src/validator/semantic-validator.js +325 -0
  224. package/dist/src/validator/tests-validator.d.ts +9 -0
  225. package/dist/src/validator/tests-validator.js +13 -0
  226. package/dist/src/validator/types.d.ts +29 -0
  227. package/dist/src/validator/types.js +1 -0
  228. package/dist/src/validator/unispec-validator.d.ts +15 -0
  229. package/dist/src/validator/unispec-validator.js +77 -0
  230. package/dist/src/validator/validator-factory.d.ts +10 -0
  231. package/dist/src/validator/validator-factory.js +73 -0
  232. package/dist/src/versions.d.ts +10 -0
  233. package/dist/src/versions.js +143 -0
  234. package/dist/tests/cache/cache.test.d.ts +1 -0
  235. package/dist/tests/cache/cache.test.js +269 -0
  236. package/dist/tests/cache/utils.d.ts +4 -0
  237. package/dist/tests/cache/utils.js +24 -0
  238. package/dist/tests/concurrency-normalizer-optimizer.test.d.ts +0 -0
  239. package/dist/tests/concurrency-normalizer-optimizer.test.js +1 -0
  240. package/dist/tests/diff/diff-annotators.test.d.ts +1 -0
  241. package/dist/tests/diff/diff-annotators.test.js +275 -0
  242. package/dist/tests/diff/diff-comprehensive.test.d.ts +1 -0
  243. package/dist/tests/diff/diff-comprehensive.test.js +257 -0
  244. package/dist/tests/diff/diff-extended.test.d.ts +1 -0
  245. package/dist/tests/diff/diff-extended.test.js +230 -0
  246. package/dist/tests/diff/diff.test.d.ts +1 -0
  247. package/dist/tests/diff/diff.test.js +184 -0
  248. package/dist/tests/diff/utils.d.ts +2 -0
  249. package/dist/tests/diff/utils.js +3 -0
  250. package/dist/tests/errors/errors-integration.test.d.ts +1 -0
  251. package/dist/tests/errors/errors-integration.test.js +168 -0
  252. package/dist/tests/errors/errors.test.d.ts +1 -0
  253. package/dist/tests/errors/errors.test.js +275 -0
  254. package/dist/tests/errors/utils.d.ts +2 -0
  255. package/dist/tests/errors/utils.js +3 -0
  256. package/dist/tests/loader/integration.test.d.ts +1 -0
  257. package/dist/tests/loader/integration.test.js +211 -0
  258. package/dist/tests/loader/loader.test.d.ts +1 -0
  259. package/dist/tests/loader/loader.test.js +336 -0
  260. package/dist/tests/normalizer/normalizer-comprehensive.test.d.ts +1 -0
  261. package/dist/tests/normalizer/normalizer-comprehensive.test.js +643 -0
  262. package/dist/tests/normalizer/normalizer-invalid.test.d.ts +1 -0
  263. package/dist/tests/normalizer/normalizer-invalid.test.js +253 -0
  264. package/dist/tests/normalizer/normalizer-valid.test.d.ts +1 -0
  265. package/dist/tests/normalizer/normalizer-valid.test.js +233 -0
  266. package/dist/tests/normalizer/utils.d.ts +18 -0
  267. package/dist/tests/normalizer/utils.js +36 -0
  268. package/dist/tests/optimizer/compress-references.test.d.ts +1 -0
  269. package/dist/tests/optimizer/compress-references.test.js +299 -0
  270. package/dist/tests/optimizer/deduplication.test.d.ts +1 -0
  271. package/dist/tests/optimizer/deduplication.test.js +127 -0
  272. package/dist/tests/optimizer/integration.test.d.ts +1 -0
  273. package/dist/tests/optimizer/integration.test.js +126 -0
  274. package/dist/tests/optimizer/optimization-report.test.d.ts +1 -0
  275. package/dist/tests/optimizer/optimization-report.test.js +217 -0
  276. package/dist/tests/optimizer/optimize-document.test.d.ts +1 -0
  277. package/dist/tests/optimizer/optimize-document.test.js +182 -0
  278. package/dist/tests/optimizer/orphaned-schemas.test.d.ts +1 -0
  279. package/dist/tests/optimizer/orphaned-schemas.test.js +189 -0
  280. package/dist/tests/optimizer/sort-schemas.test.d.ts +1 -0
  281. package/dist/tests/optimizer/sort-schemas.test.js +126 -0
  282. package/dist/tests/optimizer/utils.d.ts +8 -0
  283. package/dist/tests/optimizer/utils.js +199 -0
  284. package/dist/tests/schemas/schemas-edge-cases.test.d.ts +1 -0
  285. package/dist/tests/schemas/schemas-edge-cases.test.js +218 -0
  286. package/dist/tests/schemas/schemas.test.d.ts +1 -0
  287. package/dist/tests/schemas/schemas.test.js +395 -0
  288. package/dist/tests/schemas/utils.d.ts +2 -0
  289. package/dist/tests/schemas/utils.js +3 -0
  290. package/dist/tests/utils.d.ts +10 -0
  291. package/dist/tests/utils.js +118 -0
  292. package/dist/tests/validator/config-validator.test.d.ts +1 -0
  293. package/dist/tests/validator/config-validator.test.js +73 -0
  294. package/dist/tests/validator/debug-config.d.ts +0 -0
  295. package/dist/tests/validator/debug-config.js +1 -0
  296. package/dist/tests/validator/debug-missing-service.d.ts +0 -0
  297. package/dist/tests/validator/debug-missing-service.js +1 -0
  298. package/dist/tests/validator/debug-other-configs.d.ts +0 -0
  299. package/dist/tests/validator/debug-other-configs.js +1 -0
  300. package/dist/tests/validator/debug-references.d.ts +0 -0
  301. package/dist/tests/validator/debug-references.js +1 -0
  302. package/dist/tests/validator/unispec-validator.test.d.ts +1 -0
  303. package/dist/tests/validator/unispec-validator.test.js +98 -0
  304. package/dist/tests/validator/utils.d.ts +6 -0
  305. package/dist/tests/validator/utils.js +20 -0
  306. package/package.json +4 -3
@@ -0,0 +1,189 @@
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_path_1 = __importDefault(require("node:path"));
8
+ const node_test_1 = require("node:test");
9
+ const utils_1 = require("../../tests/utils.js");
10
+ const core_1 = require("../../src/diff/core.js");
11
+ (0, node_test_1.describe)("diff module", () => {
12
+ (0, node_test_1.describe)("diffUniSpec", () => {
13
+ (0, node_test_1.it)("should detect no changes in identical documents", () => {
14
+ const doc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
15
+ const result = (0, core_1.diffUniSpec)(doc, doc);
16
+ node_assert_1.default.strictEqual(result.changes.length, 0);
17
+ });
18
+ (0, node_test_1.it)("should detect added fields", () => {
19
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
20
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
21
+ // Add a new field that doesn't exist
22
+ modifiedDoc.service.contact = {
23
+ name: "API Support",
24
+ email: "support@example.com",
25
+ };
26
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
27
+ const contactChange = result.changes.find((change) => change.path === "/service/contact");
28
+ node_assert_1.default.ok(contactChange);
29
+ node_assert_1.default.strictEqual(contactChange.description, "Field added");
30
+ node_assert_1.default.strictEqual(contactChange.severity, "unknown");
31
+ });
32
+ (0, node_test_1.it)("should detect removed fields", () => {
33
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
34
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
35
+ // Remove a field
36
+ delete modifiedDoc.service.description;
37
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
38
+ const descriptionChange = result.changes.find((change) => change.path === "/service/description");
39
+ node_assert_1.default.ok(descriptionChange);
40
+ node_assert_1.default.strictEqual(descriptionChange.description, "Field removed");
41
+ node_assert_1.default.strictEqual(descriptionChange.severity, "unknown");
42
+ });
43
+ (0, node_test_1.it)("should detect changed values", () => {
44
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
45
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
46
+ // Change a value
47
+ modifiedDoc.service.description = "Updated description";
48
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
49
+ const descriptionChange = result.changes.find((change) => change.path === "/service/description");
50
+ node_assert_1.default.ok(descriptionChange);
51
+ node_assert_1.default.strictEqual(descriptionChange.description, "Value changed");
52
+ node_assert_1.default.strictEqual(descriptionChange.severity, "unknown");
53
+ });
54
+ });
55
+ (0, node_test_1.describe)("named collections handling", () => {
56
+ (0, node_test_1.it)("should detect added routes by name", () => {
57
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
58
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
59
+ // Add a new route
60
+ modifiedDoc.service.protocols.rest.routes.push({
61
+ name: "updateUser",
62
+ summary: "Update user",
63
+ path: "/users/{id}",
64
+ method: "PUT",
65
+ responses: {
66
+ 200: {
67
+ description: "User updated successfully",
68
+ },
69
+ },
70
+ });
71
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
72
+ const routeChange = result.changes.find((change) => change.path === "/service/protocols/rest/routes/updateUser");
73
+ node_assert_1.default.ok(routeChange);
74
+ node_assert_1.default.strictEqual(routeChange.description, "Item added");
75
+ node_assert_1.default.strictEqual(routeChange.severity, "non-breaking");
76
+ node_assert_1.default.strictEqual(routeChange.protocol, "rest");
77
+ node_assert_1.default.strictEqual(routeChange.kind, "rest.route.added");
78
+ });
79
+ (0, node_test_1.it)("should detect removed routes by name", () => {
80
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
81
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
82
+ // Remove a route
83
+ modifiedDoc.service.protocols.rest.routes =
84
+ modifiedDoc.service.protocols.rest.routes.filter((route) => route.name !== "createUser");
85
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
86
+ const routeChange = result.changes.find((change) => change.path === "/service/protocols/rest/routes/createUser");
87
+ node_assert_1.default.ok(routeChange);
88
+ node_assert_1.default.strictEqual(routeChange.description, "Item removed");
89
+ node_assert_1.default.strictEqual(routeChange.severity, "breaking");
90
+ node_assert_1.default.strictEqual(routeChange.protocol, "rest");
91
+ node_assert_1.default.strictEqual(routeChange.kind, "rest.route.removed");
92
+ });
93
+ });
94
+ (0, node_test_1.describe)("GraphQL protocol handling", () => {
95
+ (0, node_test_1.it)("should detect added queries", () => {
96
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "graphql-simple.json"));
97
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
98
+ // Add a new query
99
+ modifiedDoc.service.protocols.graphql.queries.push({
100
+ name: "posts",
101
+ description: "Get all posts",
102
+ args: [],
103
+ returnType: "[Post!]!",
104
+ });
105
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
106
+ const queryChange = result.changes.find((change) => change.path === "/service/protocols/graphql/queries/posts");
107
+ node_assert_1.default.ok(queryChange);
108
+ node_assert_1.default.strictEqual(queryChange.description, "Item added");
109
+ node_assert_1.default.strictEqual(queryChange.protocol, "graphql");
110
+ });
111
+ (0, node_test_1.it)("should detect removed mutations", () => {
112
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "graphql-simple.json"));
113
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
114
+ // Remove a mutation
115
+ modifiedDoc.service.protocols.graphql.mutations = [];
116
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
117
+ const mutationChange = result.changes.find((change) => change.path === "/service/protocols/graphql/mutations/createPost");
118
+ node_assert_1.default.ok(mutationChange);
119
+ node_assert_1.default.strictEqual(mutationChange.description, "Item removed");
120
+ node_assert_1.default.strictEqual(mutationChange.protocol, "graphql");
121
+ });
122
+ });
123
+ (0, node_test_1.describe)("WebSocket protocol handling", () => {
124
+ (0, node_test_1.it)("should detect added channels", () => {
125
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "websocket-simple.json"));
126
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
127
+ // Add a new channel
128
+ modifiedDoc.service.protocols.websocket.channels.push({
129
+ name: "notifications",
130
+ description: "Real-time notifications",
131
+ messages: [
132
+ {
133
+ name: "notification",
134
+ description: "Notification message",
135
+ direction: "subscribe",
136
+ },
137
+ ],
138
+ });
139
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
140
+ const channelChange = result.changes.find((change) => change.path === "/service/protocols/websocket/channels/notifications");
141
+ node_assert_1.default.ok(channelChange);
142
+ node_assert_1.default.strictEqual(channelChange.description, "Item added");
143
+ node_assert_1.default.strictEqual(channelChange.protocol, "websocket");
144
+ });
145
+ });
146
+ (0, node_test_1.describe)("deep comparison options", () => {
147
+ (0, node_test_1.it)("should respect deepComparison: false option", () => {
148
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
149
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
150
+ // Change nested value in a named collection (route)
151
+ modifiedDoc.service.protocols.rest.routes[0].summary = "Updated summary";
152
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc, {
153
+ deepComparison: false,
154
+ });
155
+ // With deepComparison: false, named collections don't do deep comparison
156
+ // Since the route name stays the same, no changes are detected
157
+ node_assert_1.default.strictEqual(result.changes.length, 0);
158
+ });
159
+ (0, node_test_1.it)("should perform deep comparison by default", () => {
160
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
161
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
162
+ // Change nested value
163
+ modifiedDoc.service.protocols.rest.routes[0].summary = "Updated summary";
164
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc);
165
+ // With deep comparison, the specific field should be marked as changed
166
+ const summaryChange = result.changes.find((change) => change.path === "/service/protocols/rest/routes/getUsers/summary");
167
+ node_assert_1.default.ok(summaryChange);
168
+ node_assert_1.default.strictEqual(summaryChange.description, "Value changed");
169
+ });
170
+ });
171
+ (0, node_test_1.describe)("custom named collection paths", () => {
172
+ (0, node_test_1.it)("should respect custom namedCollectionPaths", () => {
173
+ const baseDoc = (0, utils_1.loadExample)(node_path_1.default.join(utils_1.examplesDir, "valid", "spec", "rest-simple.json"));
174
+ const modifiedDoc = JSON.parse(JSON.stringify(baseDoc));
175
+ // Add custom data to test
176
+ modifiedDoc.service.customItems = [
177
+ { name: "item1", value: "value1" },
178
+ { name: "item2", value: "value2" },
179
+ ];
180
+ const result = (0, core_1.diffUniSpec)(baseDoc, modifiedDoc, {
181
+ namedCollectionPaths: ["/service/customItems"],
182
+ });
183
+ // Should detect the customItems field as added
184
+ const customItemsChange = result.changes.find((change) => change.path === "/service/customItems");
185
+ node_assert_1.default.ok(customItemsChange);
186
+ node_assert_1.default.strictEqual(customItemsChange.description, "Field added");
187
+ });
188
+ });
189
+ });
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadExample = exports.getExamplePath = exports.examplesDir = exports.createTestChange = void 0;
4
+ const utils_1 = require("../../tests/utils.js");
5
+ Object.defineProperty(exports, "createTestChange", { enumerable: true, get: function () { return utils_1.createTestChange; } });
6
+ Object.defineProperty(exports, "examplesDir", { enumerable: true, get: function () { return utils_1.examplesDir; } });
7
+ Object.defineProperty(exports, "getExamplePath", { enumerable: true, get: function () { return utils_1.getExamplePath; } });
8
+ Object.defineProperty(exports, "loadExample", { enumerable: true, get: function () { return utils_1.loadExample; } });
@@ -0,0 +1,173 @@
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 errors_1 = require("../../src/errors/index.js");
9
+ const validator_1 = require("../../src/validator/index.js");
10
+ const utils_1 = require("./utils.js");
11
+ (0, node_test_1.describe)("errors module integration", () => {
12
+ (0, node_test_1.describe)("with validator module", () => {
13
+ (0, node_test_1.it)("should handle validation errors from valid specs", async () => {
14
+ const validDoc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "rest-simple.json"));
15
+ const result = await (0, validator_1.validateUniSpec)(validDoc);
16
+ node_assert_1.default.ok(result.valid);
17
+ node_assert_1.default.strictEqual(result.errors.length, 0);
18
+ });
19
+ (0, node_test_1.it)("should create appropriate errors for invalid specs", async () => {
20
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "missing-service-name.json"));
21
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
22
+ node_assert_1.default.ok(!result.valid);
23
+ node_assert_1.default.ok(result.errors.length > 0);
24
+ // Check that errors have proper structure
25
+ for (const error of result.errors) {
26
+ node_assert_1.default.ok(error.message);
27
+ node_assert_1.default.ok(error.code);
28
+ node_assert_1.default.ok(error.path);
29
+ }
30
+ });
31
+ (0, node_test_1.it)("should handle schema validation errors", async () => {
32
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "missing-unispec-version.json"));
33
+ const _result = await (0, validator_1.validateUniSpec)(invalidDoc);
34
+ // Note: This document might be considered valid without unispecVersion
35
+ // Let's test with a document that actually has schema errors
36
+ const invalidDoc2 = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "missing-service-name.json"));
37
+ const result2 = await (0, validator_1.validateUniSpec)(invalidDoc2);
38
+ node_assert_1.default.ok(!result2.valid);
39
+ // Should have schema errors
40
+ const schemaErrors = result2.errors.filter((e) => e.code === "schema_error");
41
+ node_assert_1.default.ok(schemaErrors.length > 0);
42
+ // Verify error structure
43
+ const schemaError = schemaErrors[0];
44
+ node_assert_1.default.strictEqual(schemaError.code, "schema_error");
45
+ node_assert_1.default.ok(schemaError.path);
46
+ node_assert_1.default.ok(schemaError.message);
47
+ });
48
+ (0, node_test_1.it)("should handle semantic validation errors", async () => {
49
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "invalid-rest-method.json"));
50
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
51
+ node_assert_1.default.ok(!result.valid);
52
+ // Should have schema errors (invalid REST method is caught by schema validation)
53
+ const schemaErrors = result.errors.filter((e) => e.code === "schema_error");
54
+ node_assert_1.default.ok(schemaErrors.length > 0);
55
+ // Verify error structure
56
+ const schemaError = schemaErrors[0];
57
+ node_assert_1.default.strictEqual(schemaError.code, "schema_error");
58
+ node_assert_1.default.ok(schemaError.path?.includes("method"));
59
+ node_assert_1.default.ok(schemaError.message);
60
+ });
61
+ (0, node_test_1.it)("should handle config validation errors", async () => {
62
+ const invalidConfig = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "config", "missing-version.json"));
63
+ const result = await (0, validator_1.validateUniSpec)(invalidConfig);
64
+ node_assert_1.default.ok(!result.valid);
65
+ // Should have schema errors for config validation
66
+ const configErrors = result.errors.filter((e) => e.code === "schema_error");
67
+ node_assert_1.default.ok(configErrors.length > 0);
68
+ // Verify error structure
69
+ const configError = configErrors[0];
70
+ node_assert_1.default.strictEqual(configError.code, "schema_error");
71
+ node_assert_1.default.ok(configError.path);
72
+ node_assert_1.default.ok(configError.message);
73
+ });
74
+ });
75
+ (0, node_test_1.describe)("error conversion and handling", () => {
76
+ (0, node_test_1.it)("should convert AJV errors to UniSpecValidationErrors", async () => {
77
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "missing-service-name.json"));
78
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
79
+ node_assert_1.default.ok(!result.valid);
80
+ // All errors should be ValidationError type
81
+ for (const error of result.errors) {
82
+ node_assert_1.default.ok(error.message);
83
+ node_assert_1.default.ok(error.code);
84
+ }
85
+ });
86
+ (0, node_test_1.it)("should handle error factory with validation context", async () => {
87
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "invalid-identifier.json"));
88
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
89
+ node_assert_1.default.ok(!result.valid);
90
+ // Create custom error based on validation result
91
+ if (result.errors.length > 0) {
92
+ const customError = errors_1.ErrorFactory.createSemanticError("Custom semantic error based on validation", result.errors[0].path || "", { originalErrors: result.errors.map((e) => e.message) });
93
+ node_assert_1.default.ok(customError instanceof Error);
94
+ node_assert_1.default.strictEqual(customError.code, "semantic_error");
95
+ node_assert_1.default.ok(customError.details?.originalErrors);
96
+ }
97
+ });
98
+ (0, node_test_1.it)("should preserve error details through validation chain", async () => {
99
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "graphql-missing-arg-type.json"));
100
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
101
+ node_assert_1.default.ok(!result.valid);
102
+ // Find GraphQL-related errors
103
+ const graphqlErrors = result.errors.filter((e) => e.path?.includes("graphql") ||
104
+ e.message.toLowerCase().includes("graphql"));
105
+ if (graphqlErrors.length > 0) {
106
+ const error = graphqlErrors[0];
107
+ // Error should have proper structure
108
+ node_assert_1.default.ok(error.message);
109
+ node_assert_1.default.ok(error.code);
110
+ node_assert_1.default.ok(error.path);
111
+ }
112
+ });
113
+ });
114
+ (0, node_test_1.describe)("error severity levels", () => {
115
+ (0, node_test_1.it)("should handle different severity levels in validation", async () => {
116
+ // Test with a document that might have different severity levels
117
+ const validDoc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "mixed-complete.json"));
118
+ const result = await (0, validator_1.validateUniSpec)(validDoc);
119
+ // Valid document should have no errors
120
+ if (result.errors.length > 0) {
121
+ // All errors should have proper structure
122
+ for (const error of result.errors) {
123
+ node_assert_1.default.ok(error.message);
124
+ node_assert_1.default.ok(error.code);
125
+ node_assert_1.default.ok(typeof error.path === "string");
126
+ }
127
+ }
128
+ });
129
+ (0, node_test_1.it)("should properly classify error types", async () => {
130
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "missing-service-name.json"));
131
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
132
+ node_assert_1.default.ok(!result.valid);
133
+ // Check that errors are properly classified
134
+ const errorCodes = result.errors.map((e) => e.code);
135
+ const expectedCodes = [
136
+ "schema_error",
137
+ "semantic_error",
138
+ "reference_error",
139
+ ];
140
+ // At least one of the expected error codes should be present
141
+ const hasExpectedCode = expectedCodes.some((code) => errorCodes.includes(code));
142
+ node_assert_1.default.ok(hasExpectedCode, `Expected one of ${expectedCodes}, got ${errorCodes}`);
143
+ });
144
+ });
145
+ (0, node_test_1.describe)("complex error scenarios", () => {
146
+ (0, node_test_1.it)("should handle multiple errors in single document", async () => {
147
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "missing-service-name.json"));
148
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
149
+ node_assert_1.default.ok(!result.valid);
150
+ // Should potentially have multiple errors
151
+ if (result.errors.length > 1) {
152
+ // Check that each error has unique path or code
153
+ const uniquePaths = new Set(result.errors.map((e) => e.path));
154
+ const uniqueCodes = new Set(result.errors.map((e) => e.code));
155
+ // Should have some diversity in errors
156
+ node_assert_1.default.ok(uniquePaths.size > 0 || uniqueCodes.size > 0);
157
+ }
158
+ });
159
+ (0, node_test_1.it)("should handle nested error paths", async () => {
160
+ const invalidDoc = (0, utils_1.loadInvalidExample)((0, utils_1.getExamplePath)("invalid", "spec", "invalid-rest-method.json"));
161
+ const result = await (0, validator_1.validateUniSpec)(invalidDoc);
162
+ node_assert_1.default.ok(!result.valid);
163
+ // Should have errors with nested paths
164
+ const nestedErrors = result.errors.filter((e) => e.path?.includes("/"));
165
+ node_assert_1.default.ok(nestedErrors.length > 0);
166
+ // Paths should be properly formatted
167
+ for (const error of nestedErrors) {
168
+ node_assert_1.default.ok(error.path?.includes("/service/"));
169
+ node_assert_1.default.ok(!error.path?.endsWith("."));
170
+ }
171
+ });
172
+ });
173
+ });