@contractual/differs.json-schema 0.1.0-dev.0 → 0.1.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compare.d.ts +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +1 -3
- package/dist/compare.js.map +1 -1
- package/dist/differ.d.ts +3 -34
- package/dist/differ.d.ts.map +1 -1
- package/dist/differ.js +7 -249
- package/dist/differ.js.map +1 -1
- package/dist/index.d.ts +1 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -43
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +4 -219
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -207
- package/dist/types.js.map +1 -1
- package/package.json +6 -2
- package/dist/classifiers.d.ts +0 -87
- package/dist/classifiers.d.ts.map +0 -1
- package/dist/classifiers.js +0 -357
- package/dist/classifiers.js.map +0 -1
- package/dist/ref-resolver.d.ts +0 -73
- package/dist/ref-resolver.d.ts.map +0 -1
- package/dist/ref-resolver.js +0 -345
- package/dist/ref-resolver.js.map +0 -1
- package/dist/walker.d.ts +0 -17
- package/dist/walker.d.ts.map +0 -1
- package/dist/walker.js +0 -1195
- package/dist/walker.js.map +0 -1
package/dist/compare.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Provides schema comparison with output format matching the Strands API
|
|
5
5
|
* (https://strands.octue.com/api/compare-schemas)
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import type { CompareResult, CompareOptions, StrandsCompatibility } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Compare two JSON Schema objects and return Strands-compatible result
|
|
10
10
|
*
|
package/dist/compare.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAEd,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAGpB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAuDf;AA0KD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,OAAO,GACpB,oBAAoB,CAetB"}
|
package/dist/compare.js
CHANGED
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
* Provides schema comparison with output format matching the Strands API
|
|
5
5
|
* (https://strands.octue.com/api/compare-schemas)
|
|
6
6
|
*/
|
|
7
|
-
import { resolveRefs } from '
|
|
8
|
-
import { walk } from './walker.js';
|
|
9
|
-
import { classify, classifyPropertyAdded } from './classifiers.js';
|
|
7
|
+
import { resolveRefs, walk, classify, classifyPropertyAdded } from '@contractual/differs.core';
|
|
10
8
|
/**
|
|
11
9
|
* Compare two JSON Schema objects and return Strands-compatible result
|
|
12
10
|
*
|
package/dist/compare.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"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"}
|
package/dist/differ.d.ts
CHANGED
|
@@ -4,54 +4,23 @@
|
|
|
4
4
|
* Compares two JSON Schema files and detects structural changes,
|
|
5
5
|
* classifying them by severity for semver bump decisions.
|
|
6
6
|
*/
|
|
7
|
-
import type { DiffResult
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*
|
|
11
|
-
* @param change - The raw change to format
|
|
12
|
-
* @returns Human-readable message describing the change
|
|
13
|
-
*/
|
|
14
|
-
export declare function formatChangeMessage(change: RawChange): string;
|
|
7
|
+
import type { DiffResult } from '@contractual/types';
|
|
8
|
+
import { formatChangeMessage } from '@contractual/differs.core';
|
|
9
|
+
export { formatChangeMessage };
|
|
15
10
|
/**
|
|
16
11
|
* Diff two JSON Schema files and detect structural changes
|
|
17
12
|
*
|
|
18
|
-
* Reads both schema files, resolves $ref references, walks the schemas
|
|
19
|
-
* to detect differences, and classifies each change by severity.
|
|
20
|
-
*
|
|
21
13
|
* @param oldPath - Path to the old/base schema file
|
|
22
14
|
* @param newPath - Path to the new/changed schema file
|
|
23
15
|
* @returns DiffResult with classified changes and suggested bump
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* const result = await diffJsonSchema('v1/schema.json', 'v2/schema.json');
|
|
28
|
-
*
|
|
29
|
-
* console.log(`Suggested bump: ${result.suggestedBump}`);
|
|
30
|
-
* console.log(`Breaking changes: ${result.summary.breaking}`);
|
|
31
|
-
*
|
|
32
|
-
* for (const change of result.changes) {
|
|
33
|
-
* console.log(`[${change.severity}] ${change.message}`);
|
|
34
|
-
* }
|
|
35
|
-
* ```
|
|
36
16
|
*/
|
|
37
17
|
export declare function diffJsonSchema(oldPath: string, newPath: string): Promise<DiffResult>;
|
|
38
18
|
/**
|
|
39
19
|
* Diff two JSON Schema objects and detect structural changes
|
|
40
20
|
*
|
|
41
|
-
* Like diffJsonSchema but accepts schema objects directly instead of file paths.
|
|
42
|
-
*
|
|
43
21
|
* @param oldSchema - The old/base schema object
|
|
44
22
|
* @param newSchema - The new/changed schema object
|
|
45
23
|
* @returns DiffResult with classified changes and suggested bump
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* const oldSchema = { type: 'object', properties: { name: { type: 'string' } } };
|
|
50
|
-
* const newSchema = { type: 'object', properties: { name: { type: 'number' } } };
|
|
51
|
-
*
|
|
52
|
-
* const result = diffJsonSchemaObjects(oldSchema, newSchema);
|
|
53
|
-
* console.log(`Suggested bump: ${result.suggestedBump}`);
|
|
54
|
-
* ```
|
|
55
24
|
*/
|
|
56
25
|
export declare function diffJsonSchemaObjects(oldSchema: unknown, newSchema: unknown): DiffResult;
|
|
57
26
|
//# sourceMappingURL=differ.d.ts.map
|
package/dist/differ.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAqC,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGnG,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAwC1F;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,UAAU,CAOxF"}
|
package/dist/differ.js
CHANGED
|
@@ -5,169 +5,17 @@
|
|
|
5
5
|
* classifying them by severity for semver bump decisions.
|
|
6
6
|
*/
|
|
7
7
|
import { readFile } from 'node:fs/promises';
|
|
8
|
-
import { resolveRefs } from '
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Format a human-readable message for a change
|
|
13
|
-
*
|
|
14
|
-
* @param change - The raw change to format
|
|
15
|
-
* @returns Human-readable message describing the change
|
|
16
|
-
*/
|
|
17
|
-
export function formatChangeMessage(change) {
|
|
18
|
-
const pathDisplay = change.path || '/';
|
|
19
|
-
switch (change.type) {
|
|
20
|
-
case 'property-added':
|
|
21
|
-
return `Property added at ${pathDisplay}`;
|
|
22
|
-
case 'property-removed':
|
|
23
|
-
return `Property removed at ${pathDisplay}`;
|
|
24
|
-
case 'required-added':
|
|
25
|
-
return `Field "${formatRequiredFieldName(change.newValue)}" made required at ${pathDisplay}`;
|
|
26
|
-
case 'required-removed':
|
|
27
|
-
return `Field "${formatRequiredFieldName(change.oldValue)}" made optional at ${pathDisplay}`;
|
|
28
|
-
case 'type-changed':
|
|
29
|
-
return `Type changed from ${formatValue(change.oldValue)} to ${formatValue(change.newValue)} at ${pathDisplay}`;
|
|
30
|
-
case 'type-narrowed':
|
|
31
|
-
return `Type narrowed from ${formatValue(change.oldValue)} to ${formatValue(change.newValue)} at ${pathDisplay}`;
|
|
32
|
-
case 'type-widened':
|
|
33
|
-
return `Type widened from ${formatValue(change.oldValue)} to ${formatValue(change.newValue)} at ${pathDisplay}`;
|
|
34
|
-
case 'enum-value-added':
|
|
35
|
-
return `Enum value ${formatValue(change.newValue)} added at ${pathDisplay}`;
|
|
36
|
-
case 'enum-value-removed':
|
|
37
|
-
return `Enum value ${formatValue(change.oldValue)} removed at ${pathDisplay}`;
|
|
38
|
-
case 'enum-added':
|
|
39
|
-
return `Enum constraint added at ${pathDisplay}`;
|
|
40
|
-
case 'enum-removed':
|
|
41
|
-
return `Enum constraint removed at ${pathDisplay}`;
|
|
42
|
-
case 'constraint-tightened':
|
|
43
|
-
return formatConstraintMessage(change, 'tightened', pathDisplay);
|
|
44
|
-
case 'constraint-loosened':
|
|
45
|
-
return formatConstraintMessage(change, 'loosened', pathDisplay);
|
|
46
|
-
case 'format-added':
|
|
47
|
-
return `Format "${change.newValue}" added at ${pathDisplay}`;
|
|
48
|
-
case 'format-removed':
|
|
49
|
-
return `Format "${change.oldValue}" removed at ${pathDisplay}`;
|
|
50
|
-
case 'format-changed':
|
|
51
|
-
return `Format changed from "${change.oldValue}" to "${change.newValue}" at ${pathDisplay}`;
|
|
52
|
-
case 'additional-properties-denied':
|
|
53
|
-
return `Additional properties denied at ${pathDisplay}`;
|
|
54
|
-
case 'additional-properties-allowed':
|
|
55
|
-
return `Additional properties allowed at ${pathDisplay}`;
|
|
56
|
-
case 'additional-properties-changed':
|
|
57
|
-
return `Additional properties schema changed at ${pathDisplay}`;
|
|
58
|
-
case 'items-changed':
|
|
59
|
-
return `Array items schema changed at ${pathDisplay}`;
|
|
60
|
-
case 'min-items-increased':
|
|
61
|
-
return `Minimum items increased from ${formatValue(change.oldValue)} to ${formatValue(change.newValue)} at ${pathDisplay}`;
|
|
62
|
-
case 'max-items-decreased':
|
|
63
|
-
return `Maximum items decreased from ${formatValue(change.oldValue)} to ${formatValue(change.newValue)} at ${pathDisplay}`;
|
|
64
|
-
case 'composition-changed':
|
|
65
|
-
return `Composition (allOf/anyOf/oneOf) changed at ${pathDisplay}`;
|
|
66
|
-
case 'ref-target-changed':
|
|
67
|
-
return `Reference target changed at ${pathDisplay}`;
|
|
68
|
-
case 'description-changed':
|
|
69
|
-
return `Description changed at ${pathDisplay}`;
|
|
70
|
-
case 'title-changed':
|
|
71
|
-
return `Title changed at ${pathDisplay}`;
|
|
72
|
-
case 'default-changed':
|
|
73
|
-
return `Default value changed at ${pathDisplay}`;
|
|
74
|
-
case 'examples-changed':
|
|
75
|
-
return `Examples changed at ${pathDisplay}`;
|
|
76
|
-
case 'unknown-change':
|
|
77
|
-
default:
|
|
78
|
-
return `Unknown change at ${pathDisplay}`;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Format a value for display in messages
|
|
83
|
-
*/
|
|
84
|
-
function formatValue(value) {
|
|
85
|
-
if (value === undefined) {
|
|
86
|
-
return 'undefined';
|
|
87
|
-
}
|
|
88
|
-
if (value === null) {
|
|
89
|
-
return 'null';
|
|
90
|
-
}
|
|
91
|
-
if (typeof value === 'string') {
|
|
92
|
-
return `"${value}"`;
|
|
93
|
-
}
|
|
94
|
-
if (Array.isArray(value)) {
|
|
95
|
-
return JSON.stringify(value);
|
|
96
|
-
}
|
|
97
|
-
if (typeof value === 'object') {
|
|
98
|
-
return JSON.stringify(value);
|
|
99
|
-
}
|
|
100
|
-
return String(value);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Format required field name from change value
|
|
104
|
-
*/
|
|
105
|
-
function formatRequiredFieldName(value) {
|
|
106
|
-
if (typeof value === 'string') {
|
|
107
|
-
return value;
|
|
108
|
-
}
|
|
109
|
-
return String(value);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Format constraint change message
|
|
113
|
-
*/
|
|
114
|
-
function formatConstraintMessage(change, direction, pathDisplay) {
|
|
115
|
-
const constraintName = extractConstraintName(change.path);
|
|
116
|
-
const oldVal = change.oldValue !== undefined ? formatValue(change.oldValue) : 'none';
|
|
117
|
-
const newVal = change.newValue !== undefined ? formatValue(change.newValue) : 'none';
|
|
118
|
-
if (constraintName) {
|
|
119
|
-
return `Constraint "${constraintName}" ${direction} from ${oldVal} to ${newVal} at ${pathDisplay}`;
|
|
120
|
-
}
|
|
121
|
-
return `Constraint ${direction} from ${oldVal} to ${newVal} at ${pathDisplay}`;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Extract constraint name from path
|
|
125
|
-
*/
|
|
126
|
-
function extractConstraintName(path) {
|
|
127
|
-
const segments = path.split('/');
|
|
128
|
-
const lastSegment = segments[segments.length - 1];
|
|
129
|
-
if (lastSegment && lastSegment !== '') {
|
|
130
|
-
return lastSegment;
|
|
131
|
-
}
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Classify a change, with context-aware classification for property-added
|
|
136
|
-
*
|
|
137
|
-
* @param change - The raw change to classify
|
|
138
|
-
* @param newSchema - The new schema for context (used for property-added)
|
|
139
|
-
* @returns The severity classification
|
|
140
|
-
*/
|
|
141
|
-
function classifyChange(change, newSchema) {
|
|
142
|
-
if (change.type === 'property-added') {
|
|
143
|
-
return classifyPropertyAdded(change, newSchema);
|
|
144
|
-
}
|
|
145
|
-
return classify(change);
|
|
146
|
-
}
|
|
8
|
+
import { resolveRefs, walk, assembleResult, formatChangeMessage } from '@contractual/differs.core';
|
|
9
|
+
// Re-export for backward compatibility
|
|
10
|
+
export { formatChangeMessage };
|
|
147
11
|
/**
|
|
148
12
|
* Diff two JSON Schema files and detect structural changes
|
|
149
13
|
*
|
|
150
|
-
* Reads both schema files, resolves $ref references, walks the schemas
|
|
151
|
-
* to detect differences, and classifies each change by severity.
|
|
152
|
-
*
|
|
153
14
|
* @param oldPath - Path to the old/base schema file
|
|
154
15
|
* @param newPath - Path to the new/changed schema file
|
|
155
16
|
* @returns DiffResult with classified changes and suggested bump
|
|
156
|
-
*
|
|
157
|
-
* @example
|
|
158
|
-
* ```typescript
|
|
159
|
-
* const result = await diffJsonSchema('v1/schema.json', 'v2/schema.json');
|
|
160
|
-
*
|
|
161
|
-
* console.log(`Suggested bump: ${result.suggestedBump}`);
|
|
162
|
-
* console.log(`Breaking changes: ${result.summary.breaking}`);
|
|
163
|
-
*
|
|
164
|
-
* for (const change of result.changes) {
|
|
165
|
-
* console.log(`[${change.severity}] ${change.message}`);
|
|
166
|
-
* }
|
|
167
|
-
* ```
|
|
168
17
|
*/
|
|
169
18
|
export async function diffJsonSchema(oldPath, newPath) {
|
|
170
|
-
// Read both schema files
|
|
171
19
|
let oldContent;
|
|
172
20
|
let newContent;
|
|
173
21
|
try {
|
|
@@ -182,7 +30,6 @@ export async function diffJsonSchema(oldPath, newPath) {
|
|
|
182
30
|
catch (error) {
|
|
183
31
|
throw new Error(`Failed to read new schema file "${newPath}": ${error instanceof Error ? error.message : String(error)}`);
|
|
184
32
|
}
|
|
185
|
-
// Parse JSON
|
|
186
33
|
let oldSchema;
|
|
187
34
|
let newSchema;
|
|
188
35
|
try {
|
|
@@ -197,108 +44,19 @@ export async function diffJsonSchema(oldPath, newPath) {
|
|
|
197
44
|
catch (error) {
|
|
198
45
|
throw new Error(`Failed to parse new schema as JSON "${newPath}": ${error instanceof Error ? error.message : String(error)}`);
|
|
199
46
|
}
|
|
200
|
-
|
|
201
|
-
const resolvedOldResult = resolveRefs(oldSchema);
|
|
202
|
-
const resolvedNewResult = resolveRefs(newSchema);
|
|
203
|
-
const resolvedOld = resolvedOldResult.schema;
|
|
204
|
-
const resolvedNew = resolvedNewResult.schema;
|
|
205
|
-
// Log warnings if any $refs couldn't be resolved
|
|
206
|
-
const allWarnings = [
|
|
207
|
-
...resolvedOldResult.warnings.map((w) => `[old] ${w}`),
|
|
208
|
-
...resolvedNewResult.warnings.map((w) => `[new] ${w}`),
|
|
209
|
-
];
|
|
210
|
-
if (allWarnings.length > 0) {
|
|
211
|
-
// Warnings are informational; diff continues with best effort
|
|
212
|
-
// In production, you might want to expose these in the result
|
|
213
|
-
}
|
|
214
|
-
// Walk both schemas and detect raw changes
|
|
215
|
-
const rawChanges = walk(resolvedOld, resolvedNew, '');
|
|
216
|
-
// Classify changes and build final Change objects
|
|
217
|
-
const changes = rawChanges.map((raw) => ({
|
|
218
|
-
path: raw.path,
|
|
219
|
-
severity: classifyChange(raw, resolvedNew),
|
|
220
|
-
category: raw.type,
|
|
221
|
-
message: formatChangeMessage(raw),
|
|
222
|
-
oldValue: raw.oldValue,
|
|
223
|
-
newValue: raw.newValue,
|
|
224
|
-
}));
|
|
225
|
-
// Calculate summary counts
|
|
226
|
-
const summary = {
|
|
227
|
-
breaking: changes.filter((c) => c.severity === 'breaking').length,
|
|
228
|
-
nonBreaking: changes.filter((c) => c.severity === 'non-breaking').length,
|
|
229
|
-
patch: changes.filter((c) => c.severity === 'patch').length,
|
|
230
|
-
unknown: changes.filter((c) => c.severity === 'unknown').length,
|
|
231
|
-
};
|
|
232
|
-
// Determine suggested semver bump based on highest severity
|
|
233
|
-
const suggestedBump = summary.breaking > 0
|
|
234
|
-
? 'major'
|
|
235
|
-
: summary.nonBreaking > 0
|
|
236
|
-
? 'minor'
|
|
237
|
-
: summary.patch > 0
|
|
238
|
-
? 'patch'
|
|
239
|
-
: 'none';
|
|
240
|
-
return {
|
|
241
|
-
contract: '',
|
|
242
|
-
changes,
|
|
243
|
-
summary,
|
|
244
|
-
suggestedBump,
|
|
245
|
-
};
|
|
47
|
+
return diffJsonSchemaObjects(oldSchema, newSchema);
|
|
246
48
|
}
|
|
247
49
|
/**
|
|
248
50
|
* Diff two JSON Schema objects and detect structural changes
|
|
249
51
|
*
|
|
250
|
-
* Like diffJsonSchema but accepts schema objects directly instead of file paths.
|
|
251
|
-
*
|
|
252
52
|
* @param oldSchema - The old/base schema object
|
|
253
53
|
* @param newSchema - The new/changed schema object
|
|
254
54
|
* @returns DiffResult with classified changes and suggested bump
|
|
255
|
-
*
|
|
256
|
-
* @example
|
|
257
|
-
* ```typescript
|
|
258
|
-
* const oldSchema = { type: 'object', properties: { name: { type: 'string' } } };
|
|
259
|
-
* const newSchema = { type: 'object', properties: { name: { type: 'number' } } };
|
|
260
|
-
*
|
|
261
|
-
* const result = diffJsonSchemaObjects(oldSchema, newSchema);
|
|
262
|
-
* console.log(`Suggested bump: ${result.suggestedBump}`);
|
|
263
|
-
* ```
|
|
264
55
|
*/
|
|
265
56
|
export function diffJsonSchemaObjects(oldSchema, newSchema) {
|
|
266
|
-
|
|
267
|
-
const
|
|
268
|
-
const resolvedNewResult = resolveRefs(newSchema);
|
|
269
|
-
const resolvedOld = resolvedOldResult.schema;
|
|
270
|
-
const resolvedNew = resolvedNewResult.schema;
|
|
271
|
-
// Walk both schemas and detect raw changes
|
|
57
|
+
const resolvedOld = resolveRefs(oldSchema).schema;
|
|
58
|
+
const resolvedNew = resolveRefs(newSchema).schema;
|
|
272
59
|
const rawChanges = walk(resolvedOld, resolvedNew, '');
|
|
273
|
-
|
|
274
|
-
const changes = rawChanges.map((raw) => ({
|
|
275
|
-
path: raw.path,
|
|
276
|
-
severity: classifyChange(raw, resolvedNew),
|
|
277
|
-
category: raw.type,
|
|
278
|
-
message: formatChangeMessage(raw),
|
|
279
|
-
oldValue: raw.oldValue,
|
|
280
|
-
newValue: raw.newValue,
|
|
281
|
-
}));
|
|
282
|
-
// Calculate summary counts
|
|
283
|
-
const summary = {
|
|
284
|
-
breaking: changes.filter((c) => c.severity === 'breaking').length,
|
|
285
|
-
nonBreaking: changes.filter((c) => c.severity === 'non-breaking').length,
|
|
286
|
-
patch: changes.filter((c) => c.severity === 'patch').length,
|
|
287
|
-
unknown: changes.filter((c) => c.severity === 'unknown').length,
|
|
288
|
-
};
|
|
289
|
-
// Determine suggested semver bump based on highest severity
|
|
290
|
-
const suggestedBump = summary.breaking > 0
|
|
291
|
-
? 'major'
|
|
292
|
-
: summary.nonBreaking > 0
|
|
293
|
-
? 'minor'
|
|
294
|
-
: summary.patch > 0
|
|
295
|
-
? 'patch'
|
|
296
|
-
: 'none';
|
|
297
|
-
return {
|
|
298
|
-
contract: '',
|
|
299
|
-
changes,
|
|
300
|
-
summary,
|
|
301
|
-
suggestedBump,
|
|
302
|
-
};
|
|
60
|
+
return assembleResult(rawChanges, resolvedNew);
|
|
303
61
|
}
|
|
304
62
|
//# sourceMappingURL=differ.js.map
|
package/dist/differ.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEnG,uCAAuC;AACvC,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,OAAe;IACnE,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzG,CAAC;IACJ,CAAC;IAED,IAAI,SAAkB,CAAC;IACvB,IAAI,SAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uCAAuC,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7G,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uCAAuC,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7G,CAAC;IACJ,CAAC;IAED,OAAO,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAkB,EAAE,SAAkB;IAC1E,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAElD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAEtD,OAAO,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,42 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detect and classify breaking changes between JSON Schema versions.
|
|
5
5
|
*
|
|
6
|
-
* This package provides tools to compare JSON Schema documents and determine
|
|
7
|
-
* the semantic versioning impact of changes. It identifies breaking changes
|
|
8
|
-
* (major), non-breaking additions (minor), and documentation changes (patch).
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { compareSchemas } from '@contractual/differs.json-schema';
|
|
13
|
-
*
|
|
14
|
-
* const result = compareSchemas(oldSchema, newSchema, { currentVersion: '1.0.0' });
|
|
15
|
-
* console.log(result.version); // 'major' | 'minor' | 'patch' | 'equal' | null
|
|
16
|
-
* console.log(result.newVersion); // { major: 2, minor: 0, patch: 0, version: '2.0.0' }
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* import { diffJsonSchema, diffJsonSchemaObjects } from '@contractual/differs.json-schema';
|
|
22
|
-
*
|
|
23
|
-
* // Compare files
|
|
24
|
-
* const result = await diffJsonSchema('v1/schema.json', 'v2/schema.json');
|
|
25
|
-
* console.log(result.suggestedBump); // 'major' | 'minor' | 'patch' | 'none'
|
|
26
|
-
*
|
|
27
|
-
* // Compare schema objects directly
|
|
28
|
-
* const result2 = diffJsonSchemaObjects(oldSchema, newSchema);
|
|
29
|
-
* for (const change of result2.changes) {
|
|
30
|
-
* console.log(`[${change.severity}] ${change.message}`);
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
6
|
* @packageDocumentation
|
|
35
7
|
*/
|
|
36
8
|
export { compareSchemas, checkCompatibility } from './compare.js';
|
|
37
9
|
export { diffJsonSchema, diffJsonSchemaObjects, formatChangeMessage } from './differ.js';
|
|
38
|
-
export { classify, classifyPropertyAdded, classifyAll, CLASSIFICATION_SETS, } from '
|
|
39
|
-
export { resolveRefs, hasUnresolvedRefs, extractRefs, validateRefs, type ResolveResult, } from './ref-resolver.js';
|
|
40
|
-
export { walk } from './walker.js';
|
|
10
|
+
export { classify, classifyPropertyAdded, classifyAll, CLASSIFICATION_SETS, resolveRefs, hasUnresolvedRefs, extractRefs, validateRefs, type ResolveResult, walk, assembleResult, type AssembleOptions, type ResolvedSchema, type JSONSchemaType, type NormalizedType, type ConstraintKey, type ConstraintDirection, type CompositionKeyword, type MetadataKey, type AnnotationKey, type ContentKey, type WalkerContext, isSchemaObject, isSchemaArray, normalizeType, arraysEqual, deepEqual, escapeJsonPointer, joinPath, CONSTRAINT_KEYS, CONSTRAINT_DIRECTION, COMPOSITION_KEYWORDS, METADATA_KEYS, ANNOTATION_KEYS, CONTENT_KEYS, DEFAULT_MAX_DEPTH, } from '@contractual/differs.core';
|
|
41
11
|
export type { CompareResult, CompareOptions, StrandsTrace, StrandsCompatibility, StrandsVersion, SemanticVersion, JsonSchemaDraft, } from './types.js';
|
|
42
|
-
export type { ResolvedSchema, JSONSchemaType, NormalizedType, ConstraintKey, ConstraintDirection, CompositionKeyword, MetadataKey, AnnotationKey, ContentKey, WalkerContext, } from './types.js';
|
|
43
|
-
export { isSchemaObject, isSchemaArray, normalizeType, arraysEqual, deepEqual, escapeJsonPointer, joinPath, CONSTRAINT_KEYS, CONSTRAINT_DIRECTION, COMPOSITION_KEYWORDS, METADATA_KEYS, ANNOTATION_KEYS, CONTENT_KEYS, DEFAULT_MAX_DEPTH, } from './types.js';
|
|
44
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMlE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAMzF,OAAO,EAEL,QAAQ,EACR,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EAEnB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,KAAK,aAAa,EAElB,IAAI,EAEJ,cAAc,EACd,KAAK,eAAe,EAEpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAMnC,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,34 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detect and classify breaking changes between JSON Schema versions.
|
|
5
5
|
*
|
|
6
|
-
* This package provides tools to compare JSON Schema documents and determine
|
|
7
|
-
* the semantic versioning impact of changes. It identifies breaking changes
|
|
8
|
-
* (major), non-breaking additions (minor), and documentation changes (patch).
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { compareSchemas } from '@contractual/differs.json-schema';
|
|
13
|
-
*
|
|
14
|
-
* const result = compareSchemas(oldSchema, newSchema, { currentVersion: '1.0.0' });
|
|
15
|
-
* console.log(result.version); // 'major' | 'minor' | 'patch' | 'equal' | null
|
|
16
|
-
* console.log(result.newVersion); // { major: 2, minor: 0, patch: 0, version: '2.0.0' }
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* import { diffJsonSchema, diffJsonSchemaObjects } from '@contractual/differs.json-schema';
|
|
22
|
-
*
|
|
23
|
-
* // Compare files
|
|
24
|
-
* const result = await diffJsonSchema('v1/schema.json', 'v2/schema.json');
|
|
25
|
-
* console.log(result.suggestedBump); // 'major' | 'minor' | 'patch' | 'none'
|
|
26
|
-
*
|
|
27
|
-
* // Compare schema objects directly
|
|
28
|
-
* const result2 = diffJsonSchemaObjects(oldSchema, newSchema);
|
|
29
|
-
* for (const change of result2.changes) {
|
|
30
|
-
* console.log(`[${change.severity}] ${change.message}`);
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
6
|
* @packageDocumentation
|
|
35
7
|
*/
|
|
36
8
|
// =============================================================================
|
|
@@ -42,19 +14,15 @@ export { compareSchemas, checkCompatibility } from './compare.js';
|
|
|
42
14
|
// =============================================================================
|
|
43
15
|
export { diffJsonSchema, diffJsonSchemaObjects, formatChangeMessage } from './differ.js';
|
|
44
16
|
// =============================================================================
|
|
45
|
-
//
|
|
46
|
-
// =============================================================================
|
|
47
|
-
export {
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
// =============================================================================
|
|
57
|
-
// Type guards and utilities
|
|
58
|
-
// =============================================================================
|
|
59
|
-
export { isSchemaObject, isSchemaArray, normalizeType, arraysEqual, deepEqual, escapeJsonPointer, joinPath, CONSTRAINT_KEYS, CONSTRAINT_DIRECTION, COMPOSITION_KEYWORDS, METADATA_KEYS, ANNOTATION_KEYS, CONTENT_KEYS, DEFAULT_MAX_DEPTH, } from './types.js';
|
|
17
|
+
// Re-exports from @contractual/differs.core (backward compatibility)
|
|
18
|
+
// =============================================================================
|
|
19
|
+
export {
|
|
20
|
+
// Classification
|
|
21
|
+
classify, classifyPropertyAdded, classifyAll, CLASSIFICATION_SETS,
|
|
22
|
+
// Ref resolution
|
|
23
|
+
resolveRefs, hasUnresolvedRefs, extractRefs, validateRefs,
|
|
24
|
+
// Walker
|
|
25
|
+
walk,
|
|
26
|
+
// Result assembly
|
|
27
|
+
assembleResult, isSchemaObject, isSchemaArray, normalizeType, arraysEqual, deepEqual, escapeJsonPointer, joinPath, CONSTRAINT_KEYS, CONSTRAINT_DIRECTION, COMPOSITION_KEYWORDS, METADATA_KEYS, ANNOTATION_KEYS, CONTENT_KEYS, DEFAULT_MAX_DEPTH, } from '@contractual/differs.core';
|
|
60
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElE,gFAAgF;AAChF,8CAA8C;AAC9C,gFAAgF;AAEhF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEzF,gFAAgF;AAChF,qEAAqE;AACrE,gFAAgF;AAEhF,OAAO;AACL,iBAAiB;AACjB,QAAQ,EACR,qBAAqB,EACrB,WAAW,EACX,mBAAmB;AACnB,iBAAiB;AACjB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,YAAY;AAEZ,SAAS;AACT,IAAI;AACJ,kBAAkB;AAClB,cAAc,EAad,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,2BAA2B,CAAC"}
|