assert-json-body 1.0.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 (211) hide show
  1. package/README.md +352 -0
  2. package/dist/assertion/diff-recordings-vs-spec.d.ts +3 -0
  3. package/dist/assertion/diff-recordings-vs-spec.d.ts.map +1 -0
  4. package/dist/assertion/diff-recordings-vs-spec.js +176 -0
  5. package/dist/assertion/diff-recordings-vs-spec.js.map +1 -0
  6. package/dist/assertion/index.d.ts +2 -0
  7. package/dist/assertion/index.d.ts.map +1 -0
  8. package/dist/assertion/index.js +2 -0
  9. package/dist/assertion/index.js.map +1 -0
  10. package/dist/assertion/recorder.d.ts +7 -0
  11. package/dist/assertion/recorder.d.ts.map +1 -0
  12. package/dist/assertion/recorder.js +81 -0
  13. package/dist/assertion/recorder.js.map +1 -0
  14. package/dist/assertion/summarize-recordings.d.ts +3 -0
  15. package/dist/assertion/summarize-recordings.d.ts.map +1 -0
  16. package/dist/assertion/summarize-recordings.js +121 -0
  17. package/dist/assertion/summarize-recordings.js.map +1 -0
  18. package/dist/assertion/validator.d.ts +2 -0
  19. package/dist/assertion/validator.d.ts.map +1 -0
  20. package/dist/assertion/validator.js +3 -0
  21. package/dist/assertion/validator.js.map +1 -0
  22. package/dist/base.d.ts +2 -0
  23. package/dist/base.d.ts.map +1 -0
  24. package/dist/base.js +3 -0
  25. package/dist/base.js.map +1 -0
  26. package/dist/cli/index.d.ts +3 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +84 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/extractor/src/lib/child-expansion.d.ts +8 -0
  31. package/dist/extractor/src/lib/child-expansion.d.ts.map +1 -0
  32. package/dist/extractor/src/lib/child-expansion.js +72 -0
  33. package/dist/extractor/src/lib/child-expansion.js.map +1 -0
  34. package/dist/extractor/src/lib/git.d.ts +9 -0
  35. package/dist/extractor/src/lib/git.d.ts.map +1 -0
  36. package/dist/extractor/src/lib/git.js +22 -0
  37. package/dist/extractor/src/lib/git.js.map +1 -0
  38. package/dist/extractor/src/lib/schema-flatten.d.ts +10 -0
  39. package/dist/extractor/src/lib/schema-flatten.d.ts.map +1 -0
  40. package/dist/extractor/src/lib/schema-flatten.js +203 -0
  41. package/dist/extractor/src/lib/schema-flatten.js.map +1 -0
  42. package/dist/extractor/src/lib/type-utils.d.ts +5 -0
  43. package/dist/extractor/src/lib/type-utils.d.ts.map +1 -0
  44. package/dist/extractor/src/lib/type-utils.js +27 -0
  45. package/dist/extractor/src/lib/type-utils.js.map +1 -0
  46. package/dist/index.d.ts +5 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +6 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/lib/assert.d.ts +27 -0
  51. package/dist/lib/assert.d.ts.map +1 -0
  52. package/dist/lib/assert.js +32 -0
  53. package/dist/lib/assert.js.map +1 -0
  54. package/dist/lib/child-expansion.d.ts +2 -0
  55. package/dist/lib/child-expansion.d.ts.map +1 -0
  56. package/dist/lib/child-expansion.js +2 -0
  57. package/dist/lib/child-expansion.js.map +1 -0
  58. package/dist/lib/config.d.ts +27 -0
  59. package/dist/lib/config.d.ts.map +1 -0
  60. package/dist/lib/config.js +139 -0
  61. package/dist/lib/config.js.map +1 -0
  62. package/dist/lib/extractor.d.ts +6 -0
  63. package/dist/lib/extractor.d.ts.map +1 -0
  64. package/dist/lib/extractor.js +164 -0
  65. package/dist/lib/extractor.js.map +1 -0
  66. package/dist/lib/git.d.ts +2 -0
  67. package/dist/lib/git.d.ts.map +1 -0
  68. package/dist/lib/git.js +2 -0
  69. package/dist/lib/git.js.map +1 -0
  70. package/dist/lib/recorder.d.ts +8 -0
  71. package/dist/lib/recorder.d.ts.map +1 -0
  72. package/dist/lib/recorder.js +68 -0
  73. package/dist/lib/recorder.js.map +1 -0
  74. package/dist/lib/responses.d.ts +13 -0
  75. package/dist/lib/responses.d.ts.map +1 -0
  76. package/dist/lib/responses.js +114 -0
  77. package/dist/lib/responses.js.map +1 -0
  78. package/dist/lib/schema-flatten.d.ts +2 -0
  79. package/dist/lib/schema-flatten.d.ts.map +1 -0
  80. package/dist/lib/schema-flatten.js +2 -0
  81. package/dist/lib/schema-flatten.js.map +1 -0
  82. package/dist/lib/tools/diff-recordings-vs-spec.d.ts +2 -0
  83. package/dist/lib/tools/diff-recordings-vs-spec.d.ts.map +1 -0
  84. package/dist/lib/tools/diff-recordings-vs-spec.js +2 -0
  85. package/dist/lib/tools/diff-recordings-vs-spec.js.map +1 -0
  86. package/dist/lib/tools/recorder.d.ts +2 -0
  87. package/dist/lib/tools/recorder.d.ts.map +1 -0
  88. package/dist/lib/tools/recorder.js +3 -0
  89. package/dist/lib/tools/recorder.js.map +1 -0
  90. package/dist/lib/tools/summarize-recordings.d.ts +2 -0
  91. package/dist/lib/tools/summarize-recordings.d.ts.map +1 -0
  92. package/dist/lib/tools/summarize-recordings.js +2 -0
  93. package/dist/lib/tools/summarize-recordings.js.map +1 -0
  94. package/dist/lib/type-utils.d.ts +2 -0
  95. package/dist/lib/type-utils.d.ts.map +1 -0
  96. package/dist/lib/type-utils.js +2 -0
  97. package/dist/lib/type-utils.js.map +1 -0
  98. package/dist/lib/validator.d.ts +33 -0
  99. package/dist/lib/validator.d.ts.map +1 -0
  100. package/dist/lib/validator.js +179 -0
  101. package/dist/lib/validator.js.map +1 -0
  102. package/dist/types/index.d.ts +88 -0
  103. package/dist/types/index.d.ts.map +1 -0
  104. package/dist/types/index.js +3 -0
  105. package/dist/types/index.js.map +1 -0
  106. package/dist-cjs/assertion/diff-recordings-vs-spec.d.ts +3 -0
  107. package/dist-cjs/assertion/diff-recordings-vs-spec.d.ts.map +1 -0
  108. package/dist-cjs/assertion/diff-recordings-vs-spec.js +178 -0
  109. package/dist-cjs/assertion/diff-recordings-vs-spec.js.map +1 -0
  110. package/dist-cjs/assertion/index.d.ts +2 -0
  111. package/dist-cjs/assertion/index.d.ts.map +1 -0
  112. package/dist-cjs/assertion/index.js +3 -0
  113. package/dist-cjs/assertion/index.js.map +1 -0
  114. package/dist-cjs/assertion/recorder.d.ts +7 -0
  115. package/dist-cjs/assertion/recorder.d.ts.map +1 -0
  116. package/dist-cjs/assertion/recorder.js +84 -0
  117. package/dist-cjs/assertion/recorder.js.map +1 -0
  118. package/dist-cjs/assertion/summarize-recordings.d.ts +3 -0
  119. package/dist-cjs/assertion/summarize-recordings.d.ts.map +1 -0
  120. package/dist-cjs/assertion/summarize-recordings.js +123 -0
  121. package/dist-cjs/assertion/summarize-recordings.js.map +1 -0
  122. package/dist-cjs/assertion/validator.d.ts +2 -0
  123. package/dist-cjs/assertion/validator.d.ts.map +1 -0
  124. package/dist-cjs/assertion/validator.js +7 -0
  125. package/dist-cjs/assertion/validator.js.map +1 -0
  126. package/dist-cjs/base.d.ts +2 -0
  127. package/dist-cjs/base.d.ts.map +1 -0
  128. package/dist-cjs/base.js +7 -0
  129. package/dist-cjs/base.js.map +1 -0
  130. package/dist-cjs/cli/index.d.ts +3 -0
  131. package/dist-cjs/cli/index.d.ts.map +1 -0
  132. package/dist-cjs/cli/index.js +86 -0
  133. package/dist-cjs/cli/index.js.map +1 -0
  134. package/dist-cjs/extractor/src/lib/child-expansion.d.ts +8 -0
  135. package/dist-cjs/extractor/src/lib/child-expansion.d.ts.map +1 -0
  136. package/dist-cjs/extractor/src/lib/child-expansion.js +76 -0
  137. package/dist-cjs/extractor/src/lib/child-expansion.js.map +1 -0
  138. package/dist-cjs/extractor/src/lib/git.d.ts +9 -0
  139. package/dist-cjs/extractor/src/lib/git.d.ts.map +1 -0
  140. package/dist-cjs/extractor/src/lib/git.js +26 -0
  141. package/dist-cjs/extractor/src/lib/git.js.map +1 -0
  142. package/dist-cjs/extractor/src/lib/schema-flatten.d.ts +10 -0
  143. package/dist-cjs/extractor/src/lib/schema-flatten.d.ts.map +1 -0
  144. package/dist-cjs/extractor/src/lib/schema-flatten.js +211 -0
  145. package/dist-cjs/extractor/src/lib/schema-flatten.js.map +1 -0
  146. package/dist-cjs/extractor/src/lib/type-utils.d.ts +5 -0
  147. package/dist-cjs/extractor/src/lib/type-utils.d.ts.map +1 -0
  148. package/dist-cjs/extractor/src/lib/type-utils.js +32 -0
  149. package/dist-cjs/extractor/src/lib/type-utils.js.map +1 -0
  150. package/dist-cjs/index.d.ts +5 -0
  151. package/dist-cjs/index.d.ts.map +1 -0
  152. package/dist-cjs/index.js +26 -0
  153. package/dist-cjs/index.js.map +1 -0
  154. package/dist-cjs/lib/assert.d.ts +27 -0
  155. package/dist-cjs/lib/assert.d.ts.map +1 -0
  156. package/dist-cjs/lib/assert.js +35 -0
  157. package/dist-cjs/lib/assert.js.map +1 -0
  158. package/dist-cjs/lib/child-expansion.d.ts +2 -0
  159. package/dist-cjs/lib/child-expansion.d.ts.map +1 -0
  160. package/dist-cjs/lib/child-expansion.js +7 -0
  161. package/dist-cjs/lib/child-expansion.js.map +1 -0
  162. package/dist-cjs/lib/config.d.ts +27 -0
  163. package/dist-cjs/lib/config.d.ts.map +1 -0
  164. package/dist-cjs/lib/config.js +147 -0
  165. package/dist-cjs/lib/config.js.map +1 -0
  166. package/dist-cjs/lib/extractor.d.ts +6 -0
  167. package/dist-cjs/lib/extractor.d.ts.map +1 -0
  168. package/dist-cjs/lib/extractor.js +172 -0
  169. package/dist-cjs/lib/extractor.js.map +1 -0
  170. package/dist-cjs/lib/git.d.ts +2 -0
  171. package/dist-cjs/lib/git.d.ts.map +1 -0
  172. package/dist-cjs/lib/git.js +6 -0
  173. package/dist-cjs/lib/git.js.map +1 -0
  174. package/dist-cjs/lib/recorder.d.ts +8 -0
  175. package/dist-cjs/lib/recorder.d.ts.map +1 -0
  176. package/dist-cjs/lib/recorder.js +71 -0
  177. package/dist-cjs/lib/recorder.js.map +1 -0
  178. package/dist-cjs/lib/responses.d.ts +13 -0
  179. package/dist-cjs/lib/responses.d.ts.map +1 -0
  180. package/dist-cjs/lib/responses.js +117 -0
  181. package/dist-cjs/lib/responses.js.map +1 -0
  182. package/dist-cjs/lib/schema-flatten.d.ts +2 -0
  183. package/dist-cjs/lib/schema-flatten.d.ts.map +1 -0
  184. package/dist-cjs/lib/schema-flatten.js +11 -0
  185. package/dist-cjs/lib/schema-flatten.js.map +1 -0
  186. package/dist-cjs/lib/tools/diff-recordings-vs-spec.d.ts +2 -0
  187. package/dist-cjs/lib/tools/diff-recordings-vs-spec.d.ts.map +1 -0
  188. package/dist-cjs/lib/tools/diff-recordings-vs-spec.js +18 -0
  189. package/dist-cjs/lib/tools/diff-recordings-vs-spec.js.map +1 -0
  190. package/dist-cjs/lib/tools/recorder.d.ts +2 -0
  191. package/dist-cjs/lib/tools/recorder.d.ts.map +1 -0
  192. package/dist-cjs/lib/tools/recorder.js +19 -0
  193. package/dist-cjs/lib/tools/recorder.js.map +1 -0
  194. package/dist-cjs/lib/tools/summarize-recordings.d.ts +2 -0
  195. package/dist-cjs/lib/tools/summarize-recordings.d.ts.map +1 -0
  196. package/dist-cjs/lib/tools/summarize-recordings.js +18 -0
  197. package/dist-cjs/lib/tools/summarize-recordings.js.map +1 -0
  198. package/dist-cjs/lib/type-utils.d.ts +2 -0
  199. package/dist-cjs/lib/type-utils.d.ts.map +1 -0
  200. package/dist-cjs/lib/type-utils.js +8 -0
  201. package/dist-cjs/lib/type-utils.js.map +1 -0
  202. package/dist-cjs/lib/validator.d.ts +33 -0
  203. package/dist-cjs/lib/validator.d.ts.map +1 -0
  204. package/dist-cjs/lib/validator.js +182 -0
  205. package/dist-cjs/lib/validator.js.map +1 -0
  206. package/dist-cjs/package.json +1 -0
  207. package/dist-cjs/types/index.d.ts +88 -0
  208. package/dist-cjs/types/index.d.ts.map +1 -0
  209. package/dist-cjs/types/index.js +4 -0
  210. package/dist-cjs/types/index.js.map +1 -0
  211. package/package.json +125 -0
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ /*
4
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under
5
+ * one or more contributor license agreements. See the NOTICE file distributed
6
+ * with this work for additional information regarding copyright ownership.
7
+ * Licensed under the Camunda License 1.0. You may not use this file
8
+ * except in compliance with the Camunda License 1.0.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ /**
12
+ * Diff recorder observations against the spec-derived responses.json to
13
+ * recommend which optional fields (top-level & deep) should be promoted
14
+ * to required based on presence frequency.
15
+ *
16
+ * Data sources:
17
+ * 1. Recording directory (JSONL) from TEST_RESPONSE_BODY_RECORD_DIR (or arg1)
18
+ * 2. responses.json (default path or ROUTE_TEST_RESPONSES_FILE override)
19
+ *
20
+ * Usage:
21
+ * ts-node diff-recordings-vs-spec.ts <record-dir?> <thresholdPct=100>
22
+ *
23
+ * Output: JSON report similar to summarize-recordings but restricted only to
24
+ * fields that are optional in the current spec.
25
+ */
26
+ const node_fs_1 = require("node:fs");
27
+ const node_path_1 = require("node:path");
28
+ const recordDir = process.argv[2] || process.env.TEST_RESPONSE_BODY_RECORD_DIR;
29
+ const thresholdPct = Number(process.argv[3] || '100');
30
+ if (!recordDir) {
31
+ console.error('Usage: diff-recordings-vs-spec <record-dir?> <thresholdPct=100>');
32
+ process.exit(1);
33
+ }
34
+ // Resolve responses.json path (same logic as runtime module)
35
+ const RESPONSES_FILE_ENV = process.env.ROUTE_TEST_RESPONSES_FILE;
36
+ const DEFAULT_RESPONSES_PATH = (0, node_path_1.resolve)(__dirname, '../../response-required-extractor/output/responses.json');
37
+ const RESPONSES_PATH = RESPONSES_FILE_ENV
38
+ ? (0, node_path_1.resolve)(process.cwd(), RESPONSES_FILE_ENV)
39
+ : DEFAULT_RESPONSES_PATH;
40
+ let parsedSpec = null;
41
+ try {
42
+ parsedSpec = JSON.parse((0, node_fs_1.readFileSync)(RESPONSES_PATH, 'utf8'));
43
+ }
44
+ catch (e) {
45
+ console.error('Failed to load responses.json at', RESPONSES_PATH, e);
46
+ process.exit(1);
47
+ }
48
+ function specKey(path, method, status) {
49
+ return `${method.toUpperCase()} ${status} ${path}`;
50
+ }
51
+ const specIndex = new Map();
52
+ for (const entry of parsedSpec.responses) {
53
+ specIndex.set(specKey(entry.path, entry.method, entry.status), {
54
+ required: new Set((entry.schema.required || []).map((f) => f.name)),
55
+ optional: new Set((entry.schema.optional || []).map((f) => f.name)),
56
+ });
57
+ }
58
+ function recKey(route, method, status) {
59
+ return `${(method || 'ANY').toUpperCase()} ${(status || 'ANY')} ${route}`;
60
+ }
61
+ const aggIndex = new Map();
62
+ function isJsonl(f) { return f.endsWith('.jsonl'); }
63
+ for (const file of (0, node_fs_1.readdirSync)(recordDir)) {
64
+ if (!isJsonl(file))
65
+ continue;
66
+ const full = (0, node_path_1.resolve)(recordDir, file);
67
+ const st = (0, node_fs_1.statSync)(full);
68
+ if (!st.isFile())
69
+ continue;
70
+ const lines = (0, node_fs_1.readFileSync)(full, 'utf8').split(/\n+/).filter(Boolean);
71
+ for (const line of lines) {
72
+ try {
73
+ const obj = JSON.parse(line);
74
+ const key = recKey(obj.route, obj.method, obj.status);
75
+ let a = aggIndex.get(key);
76
+ if (!a) {
77
+ a = {
78
+ route: obj.route,
79
+ method: (obj.method || 'ANY').toUpperCase(),
80
+ status: obj.status || 'ANY',
81
+ samples: 0,
82
+ required: new Set(obj.required || []),
83
+ presentCounts: new Map(),
84
+ deepCounts: new Map(),
85
+ };
86
+ aggIndex.set(key, a);
87
+ }
88
+ a.samples++;
89
+ for (const f of obj.present || []) {
90
+ a.presentCounts.set(f, (a.presentCounts.get(f) || 0) + 1);
91
+ }
92
+ for (const p of obj.deepPresent || []) {
93
+ a.deepCounts.set(p, (a.deepCounts.get(p) || 0) + 1);
94
+ }
95
+ }
96
+ catch { /* ignore malformed */ }
97
+ }
98
+ }
99
+ const results = [];
100
+ for (const [, agg] of aggIndex.entries()) {
101
+ // Only attempt method/status exact matches in spec; skip wildcard ANY groups
102
+ if (agg.method === 'ANY' || agg.status === 'ANY')
103
+ continue;
104
+ const sKey = specKey(agg.route, agg.method, agg.status);
105
+ const spec = specIndex.get(sKey);
106
+ if (!spec)
107
+ continue; // skip recordings not in spec (maybe new route)
108
+ const thresholdCount = Math.ceil((thresholdPct / 100) * agg.samples);
109
+ const candidates = [];
110
+ // Top-level optional candidates
111
+ for (const [field, count] of agg.presentCounts.entries()) {
112
+ if (spec.required.has(field))
113
+ continue; // already required
114
+ if (!spec.optional.has(field))
115
+ continue; // ignore undeclared extras
116
+ if (count >= thresholdCount) {
117
+ candidates.push({
118
+ field,
119
+ pct: (count / agg.samples) * 100,
120
+ count,
121
+ level: 'top',
122
+ reason: `Observed in ${count}/${agg.samples} samples (${((count / agg.samples) * 100).toFixed(1)}%)`,
123
+ });
124
+ }
125
+ }
126
+ // Deep candidates: we only look at pointers where the first segment is an optional top-level field
127
+ for (const [ptr, count] of agg.deepCounts.entries()) {
128
+ if (!ptr.startsWith('/'))
129
+ continue;
130
+ const topSeg = ptr.split('/')[1];
131
+ if (!spec.optional.has(topSeg))
132
+ continue; // only consider deep paths under optional parents
133
+ if (spec.required.has(topSeg))
134
+ continue; // parent already required
135
+ if (count >= thresholdCount) {
136
+ candidates.push({
137
+ field: ptr,
138
+ pct: (count / agg.samples) * 100,
139
+ count,
140
+ level: 'deep',
141
+ reason: `Deep presence under optional parent ${topSeg} in ${count}/${agg.samples} samples (${((count / agg.samples) * 100).toFixed(1)}%)`,
142
+ });
143
+ }
144
+ }
145
+ candidates.sort((a, b) => b.pct - a.pct || a.field.localeCompare(b.field));
146
+ results.push({
147
+ route: agg.route,
148
+ method: agg.method,
149
+ status: agg.status,
150
+ samples: agg.samples,
151
+ specRequired: Array.from(spec.required).sort(),
152
+ specOptional: Array.from(spec.optional).sort(),
153
+ candidates,
154
+ });
155
+ }
156
+ results.sort((a, b) => a.route.localeCompare(b.route) ||
157
+ a.method.localeCompare(b.method) ||
158
+ a.status.localeCompare(b.status));
159
+ const payload = {
160
+ generatedAt: new Date().toISOString(),
161
+ thresholdPct,
162
+ totalGroups: results.length,
163
+ items: results,
164
+ };
165
+ console.log(JSON.stringify(payload, null, 2));
166
+ // Human summary to stderr
167
+ console.error('\n--- Promotion diff (spec optional -> always observed) ---');
168
+ for (const r of results) {
169
+ const top = r.candidates
170
+ .filter((c) => c.level === 'top')
171
+ .slice(0, 6)
172
+ .map((c) => `${c.field}:${c.pct.toFixed(0)}%`)
173
+ .join(', ');
174
+ if (top) {
175
+ console.error(`${r.method} ${r.status} ${r.route} samples=${r.samples} promote: ${top}`);
176
+ }
177
+ }
178
+ //# sourceMappingURL=diff-recordings-vs-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-recordings-vs-spec.js","sourceRoot":"","sources":["../../src/assertion/diff-recordings-vs-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assertion/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assertion/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { RouteContext } from '../types/index.js';
2
+ export declare function recordBody(opts: {
3
+ routeCtx: RouteContext;
4
+ body: unknown;
5
+ testTitle?: string;
6
+ }): void;
7
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/assertion/recorder.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAmB/C,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAsDP"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under
4
+ * one or more contributor license agreements. See the NOTICE file distributed
5
+ * with this work for additional information regarding copyright ownership.
6
+ * Licensed under the Camunda License 1.0. You may not use this file
7
+ * except in compliance with the Camunda License 1.0.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.recordBody = recordBody;
11
+ const node_fs_1 = require("node:fs");
12
+ const RECORD_DIR = process.env.TEST_RESPONSE_BODY_RECORD_DIR;
13
+ function ensureRecordDir() {
14
+ if (!RECORD_DIR)
15
+ return;
16
+ if (!(0, node_fs_1.existsSync)(RECORD_DIR)) {
17
+ try {
18
+ (0, node_fs_1.mkdirSync)(RECORD_DIR, { recursive: true });
19
+ }
20
+ catch {
21
+ /* ignore */
22
+ }
23
+ }
24
+ }
25
+ function sanitizeForFile(name) {
26
+ return name.replace(/^\//, '').replace(/[^A-Za-z0-9._-]+/g, '_');
27
+ }
28
+ function recordBody(opts) {
29
+ if (!RECORD_DIR)
30
+ return;
31
+ try {
32
+ ensureRecordDir();
33
+ const { routeCtx, body, testTitle } = opts;
34
+ const fileBase = `${(routeCtx.method || 'ANY').toUpperCase()}_${routeCtx.status || 'ANY'}_${sanitizeForFile(routeCtx.route)}`;
35
+ const file = `${RECORD_DIR}/${fileBase}.jsonl`;
36
+ const present = [];
37
+ const deepSet = new Set();
38
+ const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
39
+ const escape = (seg) => seg.replace(/~/g, '~0').replace(/\//g, '~1');
40
+ const addPath = (p) => {
41
+ if (p)
42
+ deepSet.add(p);
43
+ };
44
+ const walk = (val, base) => {
45
+ if (isObj(val)) {
46
+ for (const key of Object.keys(val)) {
47
+ const ptr = `${base}/${escape(key)}`;
48
+ addPath(ptr);
49
+ walk(val[key], ptr);
50
+ }
51
+ }
52
+ else if (Array.isArray(val)) {
53
+ for (let i = 0; i < val.length; i++) {
54
+ const el = val[i];
55
+ if (isObj(el) || Array.isArray(el)) {
56
+ walk(el, `${base}/*`);
57
+ }
58
+ }
59
+ }
60
+ };
61
+ if (isObj(body)) {
62
+ for (const k of Object.keys(body))
63
+ present.push(k);
64
+ walk(body, '');
65
+ }
66
+ const deepPresent = Array.from(deepSet).sort();
67
+ const line = JSON.stringify({
68
+ ts: new Date().toISOString(),
69
+ route: routeCtx.route,
70
+ method: routeCtx.method,
71
+ status: routeCtx.status,
72
+ test: testTitle,
73
+ required: routeCtx.requiredFieldNames,
74
+ present,
75
+ deepPresent,
76
+ body,
77
+ });
78
+ (0, node_fs_1.appendFileSync)(file, line + '\n');
79
+ }
80
+ catch {
81
+ /* ignore */
82
+ }
83
+ }
84
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/assertion/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ts-node
2
+ export {};
3
+ //# sourceMappingURL=summarize-recordings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize-recordings.d.ts","sourceRoot":"","sources":["../../src/assertion/summarize-recordings.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ /*
4
+ * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH under
5
+ * one or more contributor license agreements. See the NOTICE file distributed
6
+ * with this work for additional information regarding copyright ownership.
7
+ * Licensed under the Camunda License 1.0. You may not use this file
8
+ * except in compliance with the Camunda License 1.0.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ /**
12
+ * Summarize recorded response bodies (JSONL) produced by TEST_RESPONSE_BODY_RECORD_DIR
13
+ * to propose fields that appear in N% (default 100%) of observations but are not
14
+ * marked required in the spec-derived artifact.
15
+ */
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = require("node:path");
18
+ const dir = process.argv[2] || process.env.TEST_RESPONSE_BODY_RECORD_DIR;
19
+ if (!dir) {
20
+ console.error('Usage: summarize-recordings <record-dir> [thresholdPct=100]');
21
+ process.exit(1);
22
+ }
23
+ const thresholdPct = Number(process.argv[3] || '100');
24
+ function isJsonlFile(f) {
25
+ return f.endsWith('.jsonl');
26
+ }
27
+ function groupKey(route, method, status) {
28
+ return `${method || 'ANY'} ${status || 'ANY'} ${route}`;
29
+ }
30
+ const aggregates = new Map();
31
+ for (const file of (0, node_fs_1.readdirSync)(dir)) {
32
+ const full = (0, node_path_1.resolve)(dir, file);
33
+ if (!isJsonlFile(file))
34
+ continue;
35
+ const stat = (0, node_fs_1.statSync)(full);
36
+ if (!stat.isFile())
37
+ continue;
38
+ const lines = (0, node_fs_1.readFileSync)(full, 'utf8').split(/\n+/).filter(Boolean);
39
+ for (const line of lines) {
40
+ try {
41
+ const parsed = JSON.parse(line);
42
+ const key = groupKey(parsed.route, parsed.method, parsed.status);
43
+ let agg = aggregates.get(key);
44
+ if (!agg) {
45
+ agg = {
46
+ route: parsed.route,
47
+ method: parsed.method || 'ANY',
48
+ status: parsed.status || 'ANY',
49
+ samples: 0,
50
+ required: new Set(parsed.required || []),
51
+ presentCounts: new Map(),
52
+ deepCounts: new Map(),
53
+ };
54
+ aggregates.set(key, agg);
55
+ }
56
+ agg.samples++;
57
+ for (const f of parsed.present || []) {
58
+ agg.presentCounts.set(f, (agg.presentCounts.get(f) || 0) + 1);
59
+ }
60
+ for (const p of parsed.deepPresent || []) {
61
+ agg.deepCounts.set(p, (agg.deepCounts.get(p) || 0) + 1);
62
+ }
63
+ }
64
+ catch {
65
+ // skip malformed line
66
+ }
67
+ }
68
+ }
69
+ const report = [];
70
+ for (const [key, agg] of aggregates.entries()) {
71
+ const promote = [];
72
+ const thresholdCount = Math.ceil((thresholdPct / 100) * agg.samples);
73
+ for (const [field, count] of agg.presentCounts.entries()) {
74
+ if (!agg.required.has(field) && count >= thresholdCount) {
75
+ promote.push({
76
+ field,
77
+ pct: (count / agg.samples) * 100,
78
+ count,
79
+ level: 'top',
80
+ });
81
+ }
82
+ }
83
+ for (const [ptr, count] of agg.deepCounts.entries()) {
84
+ // Skip root-level (empty) and focus on pointers like /field, /field/sub, /field/*/id
85
+ if (!ptr.startsWith('/'))
86
+ continue;
87
+ const topSeg = ptr.split('/')[1];
88
+ if (agg.required.has(topSeg))
89
+ continue; // already required at top-level
90
+ if (count >= thresholdCount) {
91
+ promote.push({
92
+ field: ptr,
93
+ pct: (count / agg.samples) * 100,
94
+ count,
95
+ level: 'deep',
96
+ });
97
+ }
98
+ }
99
+ promote.sort((a, b) => b.pct - a.pct || a.field.localeCompare(b.field));
100
+ report.push({
101
+ key,
102
+ route: agg.route,
103
+ method: agg.method,
104
+ status: agg.status,
105
+ samples: agg.samples,
106
+ required: Array.from(agg.required).sort(),
107
+ promote,
108
+ });
109
+ }
110
+ report.sort((a, b) => a.route.localeCompare(b.route) ||
111
+ a.method.localeCompare(b.method) ||
112
+ a.status.localeCompare(b.status));
113
+ // Output JSON for machine usage & a concise human summary
114
+ console.log(JSON.stringify({ thresholdPct, generatedAt: new Date().toISOString(), items: report }, null, 2));
115
+ console.error('\n--- Promotion summary (top candidates) ---');
116
+ for (const r of report) {
117
+ const tops = r.promote
118
+ .slice(0, 8)
119
+ .map((p) => `${p.field}(${p.level === 'top' ? 'T' : 'D'}:${p.pct.toFixed(0)}%)`)
120
+ .join(', ');
121
+ console.error(`${r.method} ${r.status} ${r.route} samples=${r.samples} promote: ${tops}`);
122
+ }
123
+ //# sourceMappingURL=summarize-recordings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize-recordings.js","sourceRoot":"","sources":["../../src/assertion/summarize-recordings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { validateResponseShape } from '../lib/validator.js';
2
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/assertion/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateResponseShape = void 0;
4
+ // Shim: validator relocated to unified lib implementation
5
+ var validator_js_1 = require("../lib/validator.js");
6
+ Object.defineProperty(exports, "validateResponseShape", { enumerable: true, get: function () { return validator_js_1.validateResponseShape; } });
7
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/assertion/validator.ts"],"names":[],"mappings":";;;AAAA,0DAA0D;AAC1D,oDAA4D;AAAnD,qHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,2 @@
1
+ export { validateResponseShape } from './lib/validator.js';
2
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateResponseShape = void 0;
4
+ // Minimal stable base export (no typed wrapper) for internal & generated imports
5
+ var validator_js_1 = require("./lib/validator.js");
6
+ Object.defineProperty(exports, "validateResponseShape", { enumerable: true, get: function () { return validator_js_1.validateResponseShape; } });
7
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":";;;AAAA,iFAAiF;AACjF,mDAA2D;AAAlD,qHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const extractor_js_1 = require("../lib/extractor.js");
5
+ const config_js_1 = require("../lib/config.js");
6
+ const node_fs_1 = require("node:fs");
7
+ function printVersion() {
8
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
9
+ const pkg = require('../../package.json');
10
+ console.log(pkg.version);
11
+ }
12
+ function printHelp() {
13
+ console.log(`assert-json-body <command> [options]\n\nCommands:\n extract Run extraction (default)\n init-config Create example assert-json-body.config.json\n help Show this help\n version Print version\n\nExtraction Options (CLI/env override config.extract):\n --repo=URL\n --specPath=PATH\n --ref=REF (branch/tag/sha)\n --outputDir=DIR (default: assert-json-body)\n --responsesFile=FILE (override output file path)\n --preserveCheckout (do not delete temp git checkout)\n --dryRun (simulate, no filesystem writes)\n --failIfExists (error if responses file exists)\n --logLevel=VAL (silent|error|warn|info|debug)\n --config=FILE (explicit config file path)\n\nValidation (env overrides only for now):\n AJB_RECORD / TEST_RESPONSE_BODY_RECORD (enable global recording)\n AJB_THROW_ON_FAIL (default throw behaviour)\n\nSchema file resolution precedence:\n explicit option > env (AJB_RESPONSES_FILE / ROUTE_TEST_RESPONSES_FILE) > config.extract.responsesFile or <outputDir>/responses.json > default ./assert-json-body/responses.json\n`);
14
+ }
15
+ function initConfig() {
16
+ const path = 'assert-json-body.config.json';
17
+ if ((0, node_fs_1.existsSync)(path)) {
18
+ console.error(`Config file already exists at ${path}`);
19
+ process.exit(1);
20
+ }
21
+ const example = {
22
+ extract: {
23
+ repo: 'https://github.com/camunda/camunda-orchestration-cluster-api',
24
+ specPath: 'specification/openapi.yaml',
25
+ ref: 'main',
26
+ outputDir: 'assert-json-body',
27
+ preserveCheckout: false,
28
+ dryRun: false,
29
+ logLevel: 'info',
30
+ failIfExists: false
31
+ },
32
+ validate: {
33
+ recordResponses: false,
34
+ throwOnValidationFail: true
35
+ }
36
+ };
37
+ (0, node_fs_1.writeFileSync)(path, JSON.stringify(example, null, 2));
38
+ console.log(`Wrote example config to ${path}`);
39
+ // Idempotently add npm script to consumer package.json if exists
40
+ const pkgPath = 'package.json';
41
+ if ((0, node_fs_1.existsSync)(pkgPath)) {
42
+ try {
43
+ const raw = (0, node_fs_1.readFileSync)(pkgPath, 'utf8');
44
+ const pkg = JSON.parse(raw);
45
+ pkg.scripts = pkg.scripts || {};
46
+ if (pkg.scripts['responses:regenerate'] !== 'assert-json-body extract') {
47
+ pkg.scripts['responses:regenerate'] = 'assert-json-body extract';
48
+ (0, node_fs_1.writeFileSync)(pkgPath, JSON.stringify(pkg, null, 2));
49
+ console.log('Added script "responses:regenerate" to package.json');
50
+ }
51
+ else {
52
+ console.log('Script "responses:regenerate" already present in package.json');
53
+ }
54
+ }
55
+ catch (e) {
56
+ console.warn('Could not update package.json with responses:regenerate script:', e.message);
57
+ }
58
+ }
59
+ }
60
+ async function run() {
61
+ const { command, args } = (0, config_js_1.parseCliArgs)();
62
+ const baseCommand = command || 'extract';
63
+ if (args.help || baseCommand === 'help')
64
+ return printHelp();
65
+ if (args.version || baseCommand === 'version' || args.v)
66
+ return printVersion();
67
+ if (baseCommand === 'init-config')
68
+ return initConfig();
69
+ if (baseCommand !== 'extract') {
70
+ console.error(`Unknown command: ${baseCommand}`);
71
+ printHelp();
72
+ process.exit(1);
73
+ }
74
+ const cfgPath = typeof args.config === 'string' ? String(args.config) : undefined;
75
+ (0, config_js_1.buildConfig)(cfgPath);
76
+ const cliOverrides = (0, config_js_1.cliConfigSubset)(args);
77
+ try {
78
+ await (0, extractor_js_1.generate)(cliOverrides);
79
+ }
80
+ catch (err) {
81
+ console.error('[assert-json-body] extract failed:', err);
82
+ process.exit(1);
83
+ }
84
+ }
85
+ run();
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { SchemaGroup as OutputSchema } from '../../../types/index.js';
2
+ import { SchemaOrRef } from './schema-flatten.js';
3
+ export declare function buildSchemaTree(schema: SchemaOrRef, components: Record<string, SchemaOrRef>, seen?: Set<string>): OutputSchema;
4
+ export declare function resolveFieldSchema(fieldName: string, parentSchema: SchemaOrRef, components: Record<string, SchemaOrRef>): {
5
+ kind: string;
6
+ target?: SchemaOrRef;
7
+ } | null;
8
+ //# sourceMappingURL=child-expansion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-expansion.d.ts","sourceRoot":"","sources":["../../../../src/extractor/src/lib/child-expansion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAW,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG3D,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,cAAoB,GAAG,YAAY,CAgBpI;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CAuCvK"}