@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,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
+ 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)("sortSchemas", () => {
11
+ (0, node_test_1.it)("should sort schemas alphabetically", () => {
12
+ const doc = (0, utils_1.createDocumentWithUnsortedSchemas)();
13
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(doc);
14
+ node_assert_1.default.strictEqual(sortedCount, 3);
15
+ const schemaNames = Object.keys(doc.service?.schemas || {});
16
+ node_assert_1.default.deepStrictEqual(schemaNames, ["Alpha", "Beta", "Zebra"]);
17
+ });
18
+ (0, node_test_1.it)("should return 0 for empty schemas", () => {
19
+ const doc = {
20
+ unispecVersion: "1.0.0",
21
+ service: { name: "test", schemas: {} },
22
+ };
23
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(doc);
24
+ node_assert_1.default.strictEqual(sortedCount, 0);
25
+ });
26
+ (0, node_test_1.it)("should handle documents without schemas", () => {
27
+ const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
28
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(doc);
29
+ node_assert_1.default.strictEqual(sortedCount, 0);
30
+ });
31
+ (0, node_test_1.it)("should handle documents without service", () => {
32
+ const doc = { unispecVersion: "1.0.0", service: { name: "test" } };
33
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(doc);
34
+ node_assert_1.default.strictEqual(sortedCount, 0);
35
+ });
36
+ (0, node_test_1.it)("should preserve schema content while sorting", () => {
37
+ const doc = (0, utils_1.createDocumentWithUnsortedSchemas)();
38
+ (0, optimization_functions_1.sortSchemas)(doc);
39
+ const schemas = doc.service?.schemas || {};
40
+ node_assert_1.default.strictEqual(schemas.Alpha.description, "Alpha schema");
41
+ node_assert_1.default.strictEqual(schemas.Beta.description, "Beta schema");
42
+ node_assert_1.default.strictEqual(schemas.Zebra.description, "Zebra schema");
43
+ });
44
+ (0, node_test_1.it)("should handle already sorted schemas", () => {
45
+ const doc = {
46
+ unispecVersion: "1.0.0",
47
+ service: {
48
+ name: "test",
49
+ schemas: {
50
+ Alpha: {
51
+ name: "Alpha",
52
+ description: "Alpha schema",
53
+ jsonSchema: { type: "string" },
54
+ },
55
+ Beta: {
56
+ name: "Beta",
57
+ description: "Beta schema",
58
+ jsonSchema: { type: "number" },
59
+ },
60
+ Zebra: {
61
+ name: "Zebra",
62
+ description: "Zebra schema",
63
+ jsonSchema: { type: "boolean" },
64
+ },
65
+ },
66
+ },
67
+ };
68
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(doc);
69
+ node_assert_1.default.strictEqual(sortedCount, 3);
70
+ const schemaNames = Object.keys(doc.service?.schemas || {});
71
+ node_assert_1.default.deepStrictEqual(schemaNames, ["Alpha", "Beta", "Zebra"]);
72
+ });
73
+ (0, node_test_1.it)("should handle single schema", () => {
74
+ const doc = {
75
+ unispecVersion: "1.0.0",
76
+ service: {
77
+ name: "test",
78
+ schemas: {
79
+ SingleSchema: {
80
+ name: "SingleSchema",
81
+ description: "Single schema",
82
+ jsonSchema: { type: "string" },
83
+ },
84
+ },
85
+ },
86
+ };
87
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(doc);
88
+ node_assert_1.default.strictEqual(sortedCount, 1);
89
+ const schemaNames = Object.keys(doc.service?.schemas || {});
90
+ node_assert_1.default.deepStrictEqual(schemaNames, ["SingleSchema"]);
91
+ });
92
+ (0, node_test_1.it)("should work with real examples from node_modules", () => {
93
+ const doc = (0, utils_1.loadExample)((0, utils_1.getExamplePath)("valid", "spec", "mixed-complete.json"));
94
+ const sortedCount = (0, optimization_functions_1.sortSchemas)(JSON.parse(JSON.stringify(doc)));
95
+ // mixed-complete.json has 2 schemas
96
+ node_assert_1.default.strictEqual(sortedCount, 2);
97
+ // Check that schemas are sorted
98
+ const schemaNames = Object.keys(doc.service?.schemas || {});
99
+ const sortedSchemaNames = [...schemaNames].sort();
100
+ node_assert_1.default.deepStrictEqual(schemaNames, sortedSchemaNames);
101
+ });
102
+ (0, node_test_1.it)("should handle case-sensitive sorting", () => {
103
+ const doc = {
104
+ unispecVersion: "1.0.0",
105
+ service: {
106
+ name: "test",
107
+ schemas: {
108
+ zebra: {
109
+ name: "zebra",
110
+ description: "lowercase zebra",
111
+ jsonSchema: { type: "string" },
112
+ },
113
+ Alpha: {
114
+ name: "Alpha",
115
+ description: "uppercase Alpha",
116
+ jsonSchema: { type: "string" },
117
+ },
118
+ beta: {
119
+ name: "beta",
120
+ description: "lowercase beta",
121
+ jsonSchema: { type: "string" },
122
+ },
123
+ },
124
+ },
125
+ };
126
+ (0, optimization_functions_1.sortSchemas)(doc);
127
+ const schemaNames = Object.keys(doc.service?.schemas || {});
128
+ // Default JavaScript sort is case-sensitive: uppercase letters come before lowercase
129
+ node_assert_1.default.deepStrictEqual(schemaNames, ["Alpha", "beta", "zebra"]);
130
+ });
131
+ });
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadExample = exports.getExamplePath = exports.examplesDir = exports.createTestDocument = void 0;
4
+ exports.createTestDocumentWithSchemas = createTestDocumentWithSchemas;
5
+ exports.createDocumentWithDuplicateSchemas = createDocumentWithDuplicateSchemas;
6
+ exports.createDocumentWithOrphanedSchemas = createDocumentWithOrphanedSchemas;
7
+ exports.createDocumentWithUnsortedSchemas = createDocumentWithUnsortedSchemas;
8
+ exports.createDocumentWithLongReferences = createDocumentWithLongReferences;
9
+ const utils_1 = require("../../tests/utils.js");
10
+ Object.defineProperty(exports, "createTestDocument", { enumerable: true, get: function () { return utils_1.createTestDocument; } });
11
+ Object.defineProperty(exports, "examplesDir", { enumerable: true, get: function () { return utils_1.examplesDir; } });
12
+ Object.defineProperty(exports, "getExamplePath", { enumerable: true, get: function () { return utils_1.getExamplePath; } });
13
+ Object.defineProperty(exports, "loadExample", { enumerable: true, get: function () { return utils_1.loadExample; } });
14
+ // Optimizer-specific utilities
15
+ function createTestDocumentWithSchemas(schemas = {}, overrides = {}) {
16
+ const base = {
17
+ unispecVersion: "1.0.0",
18
+ service: {
19
+ name: "test-service",
20
+ description: "Test service description",
21
+ protocols: {
22
+ rest: {
23
+ routes: [
24
+ {
25
+ name: "testRoute",
26
+ summary: "Test route",
27
+ path: "/test",
28
+ method: "GET",
29
+ responses: {
30
+ "200": { description: "Success" },
31
+ },
32
+ },
33
+ ],
34
+ },
35
+ },
36
+ schemas,
37
+ },
38
+ };
39
+ // Deep merge overrides
40
+ return mergeDeep(base, overrides);
41
+ }
42
+ function createDocumentWithDuplicateSchemas() {
43
+ const duplicateSchema = {
44
+ type: "object",
45
+ properties: {
46
+ id: { type: "string" },
47
+ name: { type: "string" },
48
+ },
49
+ required: ["id", "name"],
50
+ };
51
+ return createTestDocumentWithSchemas({
52
+ User: {
53
+ description: "User schema",
54
+ jsonSchema: duplicateSchema,
55
+ },
56
+ Person: {
57
+ description: "Person schema",
58
+ jsonSchema: duplicateSchema,
59
+ },
60
+ Profile: {
61
+ description: "Profile schema",
62
+ jsonSchema: {
63
+ type: "object",
64
+ properties: {
65
+ profileId: { type: "string" },
66
+ title: { type: "string" },
67
+ },
68
+ required: ["profileId", "title"],
69
+ },
70
+ },
71
+ }, {
72
+ service: {
73
+ name: "test-service",
74
+ protocols: {
75
+ rest: {
76
+ routes: [
77
+ {
78
+ name: "userRoute",
79
+ method: "GET",
80
+ path: "/users",
81
+ responses: {
82
+ "200": {
83
+ description: "Success",
84
+ content: {
85
+ "application/json": {
86
+ schemaRef: "User",
87
+ },
88
+ },
89
+ },
90
+ },
91
+ },
92
+ ],
93
+ },
94
+ },
95
+ },
96
+ });
97
+ }
98
+ function createDocumentWithOrphanedSchemas() {
99
+ return createTestDocumentWithSchemas({
100
+ UsedSchema: {
101
+ description: "Used schema",
102
+ jsonSchema: {
103
+ type: "object",
104
+ properties: { id: { type: "string" } },
105
+ required: ["id"],
106
+ },
107
+ },
108
+ OrphanedSchema1: {
109
+ description: "Orphaned schema 1",
110
+ jsonSchema: { type: "string" },
111
+ },
112
+ OrphanedSchema2: {
113
+ description: "Orphaned schema 2",
114
+ jsonSchema: { type: "number" },
115
+ },
116
+ }, {
117
+ service: {
118
+ name: "test-service",
119
+ protocols: {
120
+ rest: {
121
+ routes: [
122
+ {
123
+ name: "testRoute",
124
+ summary: "Test route",
125
+ path: "/test",
126
+ method: "GET",
127
+ responses: {
128
+ "200": {
129
+ description: "Success",
130
+ content: {
131
+ "application/json": {
132
+ schemaRef: "UsedSchema",
133
+ },
134
+ },
135
+ },
136
+ },
137
+ },
138
+ ],
139
+ },
140
+ },
141
+ },
142
+ });
143
+ }
144
+ function createDocumentWithUnsortedSchemas() {
145
+ return createTestDocumentWithSchemas({
146
+ Zebra: {
147
+ description: "Zebra schema",
148
+ jsonSchema: { type: "string" },
149
+ },
150
+ Alpha: {
151
+ description: "Alpha schema",
152
+ jsonSchema: { type: "number" },
153
+ },
154
+ Beta: {
155
+ description: "Beta schema",
156
+ jsonSchema: { type: "boolean" },
157
+ },
158
+ });
159
+ }
160
+ function createDocumentWithLongReferences() {
161
+ return createTestDocumentWithSchemas({
162
+ TestSchema: {
163
+ description: "Test schema",
164
+ jsonSchema: { type: "string" },
165
+ },
166
+ }, {
167
+ service: {
168
+ name: "test-service",
169
+ protocols: {
170
+ rest: {
171
+ routes: [
172
+ {
173
+ name: "testRoute",
174
+ summary: "Test route",
175
+ path: "/test",
176
+ method: "GET",
177
+ responses: {
178
+ "200": {
179
+ description: "Success",
180
+ content: {
181
+ "application/json": {
182
+ schemaRef: "#/service/schemas/TestSchema",
183
+ },
184
+ },
185
+ },
186
+ },
187
+ },
188
+ ],
189
+ },
190
+ },
191
+ },
192
+ });
193
+ }
194
+ function mergeDeep(target, source) {
195
+ const result = { ...target };
196
+ for (const key in source) {
197
+ if (source[key] !== undefined) {
198
+ if (typeof source[key] === "object" &&
199
+ source[key] !== null &&
200
+ !Array.isArray(source[key])) {
201
+ result[key] = mergeDeep(result[key], source[key]);
202
+ }
203
+ else {
204
+ result[key] = source[key];
205
+ }
206
+ }
207
+ }
208
+ return result;
209
+ }
@@ -0,0 +1,223 @@
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 - edge cases and invalid examples", () => {
12
+ (0, node_test_1.describe)("resolveSchemaRef with invalid examples", () => {
13
+ (0, node_test_1.it)("should handle documents without schemas gracefully", () => {
14
+ const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("invalid", "spec", "missing-unispec-version.json"));
15
+ // Should not throw even with invalid documents
16
+ const schema = (0, schemas_1.resolveSchemaRef)(doc, "AnySchema");
17
+ node_assert_1.default.strictEqual(schema, undefined);
18
+ });
19
+ (0, node_test_1.it)("should handle malformed schema references", () => {
20
+ const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
21
+ // Test various malformed references
22
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(doc, ""), undefined);
23
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(doc, " "), undefined);
24
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(doc, "#"), undefined);
25
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(doc, "#/"), undefined);
26
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(doc, "#/service/schemas/"), undefined);
27
+ });
28
+ (0, node_test_1.it)("should handle deeply nested JSON pointers", () => {
29
+ const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("valid", "spec", "mixed-complete.json"));
30
+ // Test deeply nested pointer that doesn't exist
31
+ const schema = (0, schemas_1.resolveSchemaRef)(doc, "#/service/schemas/nonexistent/deep/nested/schema");
32
+ node_assert_1.default.strictEqual(schema, undefined);
33
+ });
34
+ (0, node_test_1.it)("should handle special characters in schema names", () => {
35
+ // biome-ignore lint/suspicious/noExplicitAny: Testing edge cases with special characters
36
+ const doc = {
37
+ service: {
38
+ schemas: {
39
+ "schema-with-dashes": { jsonSchema: { type: "string" } },
40
+ "schema_with_underscores": { jsonSchema: { type: "number" } },
41
+ "schema.with.dots": { jsonSchema: { type: "boolean" } },
42
+ "schema with spaces": { jsonSchema: { type: "array" } },
43
+ },
44
+ },
45
+ };
46
+ node_assert_1.default.ok((0, schemas_1.resolveSchemaRef)(doc, "schema-with-dashes"));
47
+ node_assert_1.default.ok((0, schemas_1.resolveSchemaRef)(doc, "schema_with_underscores"));
48
+ node_assert_1.default.ok((0, schemas_1.resolveSchemaRef)(doc, "schema.with.dots"));
49
+ node_assert_1.default.ok((0, schemas_1.resolveSchemaRef)(doc, "schema with spaces"));
50
+ });
51
+ });
52
+ (0, node_test_1.describe)("dedupeSchemas with complex scenarios", () => {
53
+ (0, node_test_1.it)("should handle circular references safely", () => {
54
+ // biome-ignore lint/suspicious/noExplicitAny: Testing edge cases with circular references
55
+ const doc = {
56
+ service: {
57
+ schemas: {
58
+ SchemaA: {
59
+ jsonSchema: {
60
+ type: "object",
61
+ properties: {
62
+ ref: { $ref: "#/service/schemas/SchemaB" },
63
+ },
64
+ },
65
+ },
66
+ SchemaB: {
67
+ jsonSchema: {
68
+ type: "object",
69
+ properties: {
70
+ ref: { $ref: "#/service/schemas/SchemaA" },
71
+ },
72
+ },
73
+ },
74
+ },
75
+ },
76
+ };
77
+ // Should not throw with circular references
78
+ (0, schemas_1.dedupeSchemas)(doc);
79
+ // Both schemas should remain since they have different content
80
+ node_assert_1.default.strictEqual(Object.keys(doc.service.schemas).length, 2);
81
+ });
82
+ (0, node_test_1.it)("should preserve schema order during deduplication", () => {
83
+ // biome-ignore lint/suspicious/noExplicitAny: Testing edge cases with schema ordering
84
+ const doc = {
85
+ service: {
86
+ schemas: {
87
+ ThirdSchema: { jsonSchema: { type: "string" } },
88
+ FirstSchema: { jsonSchema: { type: "string" } },
89
+ SecondSchema: { jsonSchema: { type: "number" } },
90
+ },
91
+ },
92
+ };
93
+ (0, schemas_1.dedupeSchemas)(doc);
94
+ // Should deduplicate one of the string schemas and keep the number schema
95
+ const remainingSchemas = Object.keys(doc.service.schemas);
96
+ node_assert_1.default.strictEqual(remainingSchemas.length, 2);
97
+ node_assert_1.default.ok(remainingSchemas.includes("SecondSchema")); // Number schema should remain
98
+ node_assert_1.default.ok(remainingSchemas.includes("FirstSchema") ||
99
+ remainingSchemas.includes("ThirdSchema")); // One string schema should remain
100
+ });
101
+ (0, node_test_1.it)("should handle null and undefined schemas", () => {
102
+ // biome-ignore lint/suspicious/noExplicitAny: Testing edge cases with null/undefined schemas
103
+ const doc = {
104
+ service: {
105
+ schemas: {
106
+ NullSchema: null,
107
+ UndefinedSchema: undefined,
108
+ ValidSchema: { jsonSchema: { type: "string" } },
109
+ },
110
+ },
111
+ };
112
+ // Should not throw
113
+ (0, schemas_1.dedupeSchemas)(doc);
114
+ // Should handle null/undefined gracefully
115
+ node_assert_1.default.ok(doc.service.schemas.ValidSchema);
116
+ });
117
+ (0, node_test_1.it)("should handle empty schema objects", () => {
118
+ // biome-ignore lint/suspicious/noExplicitAny: Testing edge cases with empty schemas
119
+ const doc = {
120
+ service: {
121
+ schemas: {
122
+ EmptySchema1: {},
123
+ EmptySchema2: {},
124
+ ValidSchema: { jsonSchema: { type: "string" } },
125
+ },
126
+ },
127
+ };
128
+ (0, schemas_1.dedupeSchemas)(doc);
129
+ // Should deduplicate empty schemas
130
+ const schemas = Object.keys(doc.service.schemas);
131
+ node_assert_1.default.strictEqual(schemas.length, 2);
132
+ node_assert_1.default.ok(schemas.includes("ValidSchema"));
133
+ node_assert_1.default.ok(schemas.includes("EmptySchema1") || schemas.includes("EmptySchema2"));
134
+ });
135
+ });
136
+ (0, node_test_1.describe)("normalizeSchemaRef edge cases", () => {
137
+ (0, node_test_1.it)("should handle Unicode characters", () => {
138
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("Схема"), "Схема");
139
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/Схема"), "Схема");
140
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#Схема"), "Схема");
141
+ });
142
+ (0, node_test_1.it)("should handle very long schema names", () => {
143
+ const longName = "a".repeat(1000);
144
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)(longName), longName);
145
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)(`#/service/schemas/${longName}`), longName);
146
+ });
147
+ (0, node_test_1.it)("should handle JSON pointer encoding", () => {
148
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/schema~0name"), "schema~0name");
149
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/schema~1name"), "schema~1name");
150
+ node_assert_1.default.strictEqual((0, utils_1.normalizeSchemaRef)("#/service/schemas/schema/name"), "name");
151
+ });
152
+ });
153
+ (0, node_test_1.describe)("integration with invalid examples", () => {
154
+ (0, node_test_1.it)("should not crash on completely invalid documents", () => {
155
+ const invalidDocs = [
156
+ { invalid: "structure" },
157
+ {},
158
+ { service: null },
159
+ { service: { schemas: "not an object" } },
160
+ ];
161
+ for (const doc of invalidDocs) {
162
+ // Should not throw
163
+ node_assert_1.default.doesNotThrow(() => {
164
+ // biome-ignore lint/suspicious/noExplicitAny: Testing invalid document structures
165
+ (0, schemas_1.resolveSchemaRef)(doc, "test");
166
+ // biome-ignore lint/suspicious/noExplicitAny: Testing invalid document structures
167
+ (0, schemas_1.dedupeSchemas)(doc);
168
+ });
169
+ }
170
+ // null and undefined should be handled by resolveSchemaRef
171
+ // biome-ignore lint/suspicious/noExplicitAny: Testing null input handling
172
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(null, "test"), undefined);
173
+ // biome-ignore lint/suspicious/noExplicitAny: Testing undefined input handling
174
+ node_assert_1.default.strictEqual((0, schemas_1.resolveSchemaRef)(undefined, "test"), undefined);
175
+ });
176
+ (0, node_test_1.it)("should handle documents with missing required fields", () => {
177
+ const doc = (0, utils_2.loadExample)((0, utils_2.getExamplePath)("invalid", "spec", "missing-service-name.json"));
178
+ // Should handle gracefully
179
+ const schema = (0, schemas_1.resolveSchemaRef)(doc, "anything");
180
+ node_assert_1.default.strictEqual(schema, undefined);
181
+ // Should not throw
182
+ node_assert_1.default.doesNotThrow(() => (0, schemas_1.dedupeSchemas)(doc));
183
+ });
184
+ });
185
+ (0, node_test_1.describe)("performance and memory", () => {
186
+ (0, node_test_1.it)("should handle large numbers of schemas efficiently", () => {
187
+ // biome-ignore lint/suspicious/noExplicitAny: Testing performance with large schema sets
188
+ const doc = {
189
+ service: {
190
+ schemas: {},
191
+ },
192
+ };
193
+ // Create 100 schemas with some duplicates (10 unique types, each repeated 10 times)
194
+ const schemaTypes = [
195
+ { type: "string" },
196
+ { type: "number" },
197
+ { type: "boolean" },
198
+ { type: "array" },
199
+ { type: "object" },
200
+ { type: "null" },
201
+ { type: "string", format: "date" },
202
+ { type: "string", format: "email" },
203
+ { type: "integer" },
204
+ { type: "number", format: "float" },
205
+ ];
206
+ let schemaIndex = 0;
207
+ for (let i = 0; i < 10; i++) {
208
+ for (let j = 0; j < schemaTypes.length; j++) {
209
+ doc.service.schemas[`Schema${schemaIndex++}`] = {
210
+ jsonSchema: schemaTypes[j],
211
+ };
212
+ }
213
+ }
214
+ const startTime = Date.now();
215
+ (0, schemas_1.dedupeSchemas)(doc);
216
+ const endTime = Date.now();
217
+ // Should complete in reasonable time (less than 1 second)
218
+ node_assert_1.default.ok(endTime - startTime < 1000);
219
+ // Should deduplicate to only 10 unique schemas
220
+ node_assert_1.default.strictEqual(Object.keys(doc.service.schemas).length, 10);
221
+ });
222
+ });
223
+ });