@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,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";