@contractual/differs.json-schema 0.1.0-dev.0

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/index.js ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @contractual/differs.json-schema
3
+ *
4
+ * Detect and classify breaking changes between JSON Schema versions.
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
+ * @packageDocumentation
35
+ */
36
+ // =============================================================================
37
+ // Strands-compatible API (primary)
38
+ // =============================================================================
39
+ export { compareSchemas, checkCompatibility } from './compare.js';
40
+ // =============================================================================
41
+ // Legacy file-based API (backward compatible)
42
+ // =============================================================================
43
+ export { diffJsonSchema, diffJsonSchemaObjects, formatChangeMessage } from './differ.js';
44
+ // =============================================================================
45
+ // Classification utilities
46
+ // =============================================================================
47
+ export { classify, classifyPropertyAdded, classifyAll, CLASSIFICATION_SETS, } from './classifiers.js';
48
+ // =============================================================================
49
+ // Ref resolution utilities
50
+ // =============================================================================
51
+ export { resolveRefs, hasUnresolvedRefs, extractRefs, validateRefs, } from './ref-resolver.js';
52
+ // =============================================================================
53
+ // Low-level walker
54
+ // =============================================================================
55
+ export { walk } from './walker.js';
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';
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;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,2BAA2B;AAC3B,gFAAgF;AAEhF,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,WAAW,EACX,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAE3B,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAiCnC,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,OAAO,EACL,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,YAAY,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * JSON Schema $ref Resolver
3
+ *
4
+ * Resolves all $ref pointers in a JSON Schema, producing a self-contained schema.
5
+ * Handles internal references ($defs, definitions) and detects circular references.
6
+ *
7
+ * This resolver operates on in-memory schema objects and does not fetch external URLs.
8
+ * External references are flagged as warnings.
9
+ */
10
+ /**
11
+ * Result of resolving references in a schema
12
+ */
13
+ export interface ResolveResult {
14
+ /** The resolved schema with $refs replaced */
15
+ readonly schema: unknown;
16
+ /** Warnings encountered during resolution (circular refs, external refs, etc.) */
17
+ readonly warnings: string[];
18
+ }
19
+ /**
20
+ * Resolve all $ref pointers in a JSON Schema
21
+ *
22
+ * Creates a self-contained schema by inlining all internal references.
23
+ * Does not modify the original schema.
24
+ *
25
+ * @param schema - The JSON Schema to resolve
26
+ * @returns The resolved schema and any warnings
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const schema = {
31
+ * type: 'object',
32
+ * properties: {
33
+ * user: { $ref: '#/$defs/User' }
34
+ * },
35
+ * $defs: {
36
+ * User: { type: 'object', properties: { name: { type: 'string' } } }
37
+ * }
38
+ * };
39
+ *
40
+ * const result = resolveRefs(schema);
41
+ * // result.schema.properties.user === { type: 'object', properties: { name: { type: 'string' } } }
42
+ * // result.warnings === []
43
+ * ```
44
+ */
45
+ export declare function resolveRefs(schema: unknown): ResolveResult;
46
+ /**
47
+ * Check if a schema contains any unresolved $refs
48
+ *
49
+ * @param schema - The schema to check
50
+ * @returns True if the schema contains $ref pointers
51
+ */
52
+ export declare function hasUnresolvedRefs(schema: unknown): boolean;
53
+ /**
54
+ * Extract all $ref pointers from a schema
55
+ *
56
+ * @param schema - The schema to analyze
57
+ * @returns Array of { pointer, path } objects
58
+ */
59
+ export declare function extractRefs(schema: unknown): Array<{
60
+ pointer: string;
61
+ path: string;
62
+ }>;
63
+ /**
64
+ * Validate that all internal references in a schema are resolvable
65
+ *
66
+ * @param schema - The schema to validate
67
+ * @returns Object with valid flag and any error messages
68
+ */
69
+ export declare function validateRefs(schema: unknown): {
70
+ valid: boolean;
71
+ errors: string[];
72
+ };
73
+ //# sourceMappingURL=ref-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-resolver.d.ts","sourceRoot":"","sources":["../src/ref-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC7B;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAe1D;AA2PD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CA0B1D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrF;AAiCD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAoBA"}
@@ -0,0 +1,345 @@
1
+ /**
2
+ * JSON Schema $ref Resolver
3
+ *
4
+ * Resolves all $ref pointers in a JSON Schema, producing a self-contained schema.
5
+ * Handles internal references ($defs, definitions) and detects circular references.
6
+ *
7
+ * This resolver operates on in-memory schema objects and does not fetch external URLs.
8
+ * External references are flagged as warnings.
9
+ */
10
+ /**
11
+ * Resolve all $ref pointers in a JSON Schema
12
+ *
13
+ * Creates a self-contained schema by inlining all internal references.
14
+ * Does not modify the original schema.
15
+ *
16
+ * @param schema - The JSON Schema to resolve
17
+ * @returns The resolved schema and any warnings
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const schema = {
22
+ * type: 'object',
23
+ * properties: {
24
+ * user: { $ref: '#/$defs/User' }
25
+ * },
26
+ * $defs: {
27
+ * User: { type: 'object', properties: { name: { type: 'string' } } }
28
+ * }
29
+ * };
30
+ *
31
+ * const result = resolveRefs(schema);
32
+ * // result.schema.properties.user === { type: 'object', properties: { name: { type: 'string' } } }
33
+ * // result.warnings === []
34
+ * ```
35
+ */
36
+ export function resolveRefs(schema) {
37
+ const context = {
38
+ root: schema,
39
+ warnings: [],
40
+ resolving: new Set(),
41
+ cache: new Map(),
42
+ currentPath: '',
43
+ };
44
+ const resolved = resolveNode(schema, context);
45
+ return {
46
+ schema: resolved,
47
+ warnings: context.warnings,
48
+ };
49
+ }
50
+ /**
51
+ * Recursively resolve a schema node
52
+ */
53
+ function resolveNode(node, context) {
54
+ // Handle non-objects
55
+ if (!isObject(node)) {
56
+ return node;
57
+ }
58
+ const obj = node;
59
+ // Check if this is a $ref node
60
+ if (typeof obj['$ref'] === 'string') {
61
+ return resolveRef(obj['$ref'], obj, context);
62
+ }
63
+ // Recursively resolve all properties
64
+ const resolved = {};
65
+ for (const [key, value] of Object.entries(obj)) {
66
+ const previousPath = context.currentPath;
67
+ context.currentPath = `${context.currentPath}/${encodeJsonPointerSegment(key)}`;
68
+ if (Array.isArray(value)) {
69
+ resolved[key] = value.map((item, index) => {
70
+ const itemPath = context.currentPath;
71
+ context.currentPath = `${itemPath}/${index}`;
72
+ const resolvedItem = resolveNode(item, context);
73
+ context.currentPath = itemPath;
74
+ return resolvedItem;
75
+ });
76
+ }
77
+ else {
78
+ resolved[key] = resolveNode(value, context);
79
+ }
80
+ context.currentPath = previousPath;
81
+ }
82
+ return resolved;
83
+ }
84
+ /**
85
+ * Resolve a $ref pointer
86
+ */
87
+ function resolveRef(ref, refNode, context) {
88
+ // Check for external references
89
+ if (isExternalRef(ref)) {
90
+ context.warnings.push(`External reference not resolved: ${ref} at ${context.currentPath || '/'}`);
91
+ // Return the $ref node as-is for external refs
92
+ return refNode;
93
+ }
94
+ // Check for circular reference
95
+ if (context.resolving.has(ref)) {
96
+ context.warnings.push(`Circular reference detected: ${ref} at ${context.currentPath || '/'}`);
97
+ // Return a placeholder to break the cycle
98
+ return {
99
+ $circularRef: ref,
100
+ $comment: 'Circular reference - see original location',
101
+ };
102
+ }
103
+ // Check cache
104
+ if (context.cache.has(ref)) {
105
+ return context.cache.get(ref);
106
+ }
107
+ // Mark as currently resolving
108
+ context.resolving.add(ref);
109
+ try {
110
+ // Resolve the reference
111
+ const target = resolvePointer(ref, context.root);
112
+ if (target === undefined) {
113
+ context.warnings.push(`Reference not found: ${ref} at ${context.currentPath || '/'}`);
114
+ // Return the $ref node as-is if target not found
115
+ return refNode;
116
+ }
117
+ // Recursively resolve the target (it may contain more $refs)
118
+ const resolved = resolveNode(target, context);
119
+ // Merge any sibling properties from the $ref node
120
+ // JSON Schema allows properties alongside $ref in draft 2019-09+
121
+ const siblings = extractSiblingProperties(refNode);
122
+ const merged = mergeSiblings(resolved, siblings);
123
+ // Cache the result
124
+ context.cache.set(ref, merged);
125
+ return merged;
126
+ }
127
+ finally {
128
+ // Remove from resolving set
129
+ context.resolving.delete(ref);
130
+ }
131
+ }
132
+ /**
133
+ * Check if a reference is external (http://, https://, file://)
134
+ */
135
+ function isExternalRef(ref) {
136
+ return (ref.startsWith('http://') ||
137
+ ref.startsWith('https://') ||
138
+ ref.startsWith('file://') ||
139
+ // Relative file references (not starting with #)
140
+ (!ref.startsWith('#') &&
141
+ (ref.endsWith('.json') || ref.endsWith('.yaml') || ref.endsWith('.yml'))));
142
+ }
143
+ /**
144
+ * Resolve a JSON Pointer within a document
145
+ *
146
+ * Supports:
147
+ * - #/$defs/Name
148
+ * - #/definitions/Name
149
+ * - #/properties/field/items
150
+ *
151
+ * @param pointer - The JSON Pointer (e.g., '#/$defs/User')
152
+ * @param root - The root document
153
+ * @returns The resolved value or undefined if not found
154
+ */
155
+ function resolvePointer(pointer, root) {
156
+ // Handle empty or root pointer
157
+ if (pointer === '#' || pointer === '') {
158
+ return root;
159
+ }
160
+ // Remove the leading # if present
161
+ let path = pointer;
162
+ if (path.startsWith('#')) {
163
+ path = path.slice(1);
164
+ }
165
+ // Remove leading slash
166
+ if (path.startsWith('/')) {
167
+ path = path.slice(1);
168
+ }
169
+ // Handle empty path after normalization
170
+ if (!path) {
171
+ return root;
172
+ }
173
+ // Split into segments and navigate
174
+ const segments = path.split('/');
175
+ let current = root;
176
+ for (const segment of segments) {
177
+ if (!isObject(current) && !Array.isArray(current)) {
178
+ return undefined;
179
+ }
180
+ const decoded = decodeJsonPointerSegment(segment);
181
+ if (Array.isArray(current)) {
182
+ const index = parseInt(decoded, 10);
183
+ if (isNaN(index) || index < 0 || index >= current.length) {
184
+ return undefined;
185
+ }
186
+ current = current[index];
187
+ }
188
+ else {
189
+ const obj = current;
190
+ if (!(decoded in obj)) {
191
+ return undefined;
192
+ }
193
+ current = obj[decoded];
194
+ }
195
+ }
196
+ return current;
197
+ }
198
+ /**
199
+ * Decode a JSON Pointer segment (RFC 6901)
200
+ *
201
+ * ~0 -> ~
202
+ * ~1 -> /
203
+ */
204
+ function decodeJsonPointerSegment(segment) {
205
+ return segment.replace(/~1/g, '/').replace(/~0/g, '~');
206
+ }
207
+ /**
208
+ * Encode a JSON Pointer segment (RFC 6901)
209
+ *
210
+ * ~ -> ~0
211
+ * / -> ~1
212
+ */
213
+ function encodeJsonPointerSegment(segment) {
214
+ return segment.replace(/~/g, '~0').replace(/\//g, '~1');
215
+ }
216
+ /**
217
+ * Extract sibling properties from a $ref node
218
+ *
219
+ * In JSON Schema draft 2019-09+, properties alongside $ref are allowed
220
+ * and should be merged with the referenced schema.
221
+ */
222
+ function extractSiblingProperties(refNode) {
223
+ const siblings = {};
224
+ for (const [key, value] of Object.entries(refNode)) {
225
+ if (key !== '$ref') {
226
+ siblings[key] = value;
227
+ }
228
+ }
229
+ return siblings;
230
+ }
231
+ /**
232
+ * Merge sibling properties with a resolved schema
233
+ */
234
+ function mergeSiblings(resolved, siblings) {
235
+ // If no siblings, return as-is
236
+ if (Object.keys(siblings).length === 0) {
237
+ return resolved;
238
+ }
239
+ // If resolved is not an object, wrap in allOf
240
+ if (!isObject(resolved)) {
241
+ return {
242
+ allOf: [resolved, siblings],
243
+ };
244
+ }
245
+ // Merge properties, siblings override resolved
246
+ return {
247
+ ...resolved,
248
+ ...siblings,
249
+ };
250
+ }
251
+ /**
252
+ * Type guard for objects
253
+ */
254
+ function isObject(value) {
255
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
256
+ }
257
+ /**
258
+ * Check if a schema contains any unresolved $refs
259
+ *
260
+ * @param schema - The schema to check
261
+ * @returns True if the schema contains $ref pointers
262
+ */
263
+ export function hasUnresolvedRefs(schema) {
264
+ if (!isObject(schema)) {
265
+ return false;
266
+ }
267
+ const obj = schema;
268
+ // Check if this node is a $ref
269
+ if (typeof obj['$ref'] === 'string' && !obj['$circularRef']) {
270
+ return true;
271
+ }
272
+ // Check children
273
+ for (const value of Object.values(obj)) {
274
+ if (Array.isArray(value)) {
275
+ for (const item of value) {
276
+ if (hasUnresolvedRefs(item)) {
277
+ return true;
278
+ }
279
+ }
280
+ }
281
+ else if (hasUnresolvedRefs(value)) {
282
+ return true;
283
+ }
284
+ }
285
+ return false;
286
+ }
287
+ /**
288
+ * Extract all $ref pointers from a schema
289
+ *
290
+ * @param schema - The schema to analyze
291
+ * @returns Array of { pointer, path } objects
292
+ */
293
+ export function extractRefs(schema) {
294
+ const refs = [];
295
+ collectRefs(schema, '', refs);
296
+ return refs;
297
+ }
298
+ /**
299
+ * Recursively collect $refs
300
+ */
301
+ function collectRefs(node, path, refs) {
302
+ if (!isObject(node)) {
303
+ return;
304
+ }
305
+ const obj = node;
306
+ if (typeof obj['$ref'] === 'string') {
307
+ refs.push({ pointer: obj['$ref'], path: path || '/' });
308
+ }
309
+ for (const [key, value] of Object.entries(obj)) {
310
+ const childPath = `${path}/${encodeJsonPointerSegment(key)}`;
311
+ if (Array.isArray(value)) {
312
+ value.forEach((item, index) => {
313
+ collectRefs(item, `${childPath}/${index}`, refs);
314
+ });
315
+ }
316
+ else {
317
+ collectRefs(value, childPath, refs);
318
+ }
319
+ }
320
+ }
321
+ /**
322
+ * Validate that all internal references in a schema are resolvable
323
+ *
324
+ * @param schema - The schema to validate
325
+ * @returns Object with valid flag and any error messages
326
+ */
327
+ export function validateRefs(schema) {
328
+ const errors = [];
329
+ const refs = extractRefs(schema);
330
+ for (const { pointer, path } of refs) {
331
+ // Skip external refs for this validation
332
+ if (isExternalRef(pointer)) {
333
+ continue;
334
+ }
335
+ const resolved = resolvePointer(pointer, schema);
336
+ if (resolved === undefined) {
337
+ errors.push(`Invalid reference at ${path}: ${pointer} not found`);
338
+ }
339
+ }
340
+ return {
341
+ valid: errors.length === 0,
342
+ errors,
343
+ };
344
+ }
345
+ //# sourceMappingURL=ref-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-resolver.js","sourceRoot":"","sources":["../src/ref-resolver.ts"],"names":[],"mappings":"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"}