@contractual/differs.openapi 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (C) 2025 Omer Morad
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,24 @@
1
+ /**
2
+ * OpenAPI Differ
3
+ *
4
+ * Compares two OpenAPI specifications and detects breaking changes.
5
+ * Supports OpenAPI 3.0 and 3.1.
6
+ */
7
+ import type { DiffResult } from '@contractual/types';
8
+ /**
9
+ * Diff two OpenAPI specification files
10
+ *
11
+ * @param oldSpecPath - Path to the old/base OpenAPI spec file
12
+ * @param newSpecPath - Path to the new/changed OpenAPI spec file
13
+ * @returns DiffResult with classified changes and suggested bump
14
+ */
15
+ export declare function diffOpenApi(oldSpecPath: string, newSpecPath: string): Promise<DiffResult>;
16
+ /**
17
+ * Diff two resolved OpenAPI spec objects directly
18
+ *
19
+ * @param oldSpec - The old/base OpenAPI spec object (fully resolved)
20
+ * @param newSpec - The new/changed OpenAPI spec object (fully resolved)
21
+ * @returns DiffResult with classified changes and suggested bump
22
+ */
23
+ export declare function diffOpenApiObjects(oldSpec: Record<string, unknown>, newSpec: Record<string, unknown>): DiffResult;
24
+ //# sourceMappingURL=differ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAK/F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,UAAU,CAGZ"}
package/dist/differ.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * OpenAPI Differ
3
+ *
4
+ * Compares two OpenAPI specifications and detects breaking changes.
5
+ * Supports OpenAPI 3.0 and 3.1.
6
+ */
7
+ import { assembleResult } from '@contractual/differs.core';
8
+ import { resolveOpenApiSpec } from './resolver.js';
9
+ import { diffStructural } from './structural.js';
10
+ /**
11
+ * Diff two OpenAPI specification files
12
+ *
13
+ * @param oldSpecPath - Path to the old/base OpenAPI spec file
14
+ * @param newSpecPath - Path to the new/changed OpenAPI spec file
15
+ * @returns DiffResult with classified changes and suggested bump
16
+ */
17
+ export async function diffOpenApi(oldSpecPath, newSpecPath) {
18
+ const oldSpec = await resolveOpenApiSpec(oldSpecPath);
19
+ const newSpec = await resolveOpenApiSpec(newSpecPath);
20
+ return diffOpenApiObjects(oldSpec, newSpec);
21
+ }
22
+ /**
23
+ * Diff two resolved OpenAPI spec objects directly
24
+ *
25
+ * @param oldSpec - The old/base OpenAPI spec object (fully resolved)
26
+ * @param newSpec - The new/changed OpenAPI spec object (fully resolved)
27
+ * @returns DiffResult with classified changes and suggested bump
28
+ */
29
+ export function diffOpenApiObjects(oldSpec, newSpec) {
30
+ const rawChanges = diffStructural(oldSpec, newSpec);
31
+ return assembleResult(rawChanges, newSpec);
32
+ }
33
+ //# sourceMappingURL=differ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.js","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,WAAmB;IACxE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAEtD,OAAO,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAgC,EAChC,OAAgC;IAEhC,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { diffOpenApi, diffOpenApiObjects } from './differ.js';
2
+ export { resolveOpenApiSpec } from './resolver.js';
3
+ export { diffStructural } from './structural.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { diffOpenApi, diffOpenApiObjects } from './differ.js';
2
+ export { resolveOpenApiSpec } from './resolver.js';
3
+ export { diffStructural } from './structural.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * OpenAPI spec resolver using @redocly/openapi-core
3
+ *
4
+ * Handles both OpenAPI 3.0 and 3.1 specifications.
5
+ * Resolves all $ref pointers and produces fully dereferenced documents.
6
+ */
7
+ /**
8
+ * Resolve an OpenAPI spec file to a fully dereferenced object
9
+ *
10
+ * @param specPath - Absolute or relative path to the OpenAPI spec file
11
+ * @returns The fully resolved OpenAPI document as a plain object
12
+ */
13
+ export declare function resolveOpenApiSpec(specPath: string): Promise<Record<string, unknown>>;
14
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkB3F"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * OpenAPI spec resolver using @redocly/openapi-core
3
+ *
4
+ * Handles both OpenAPI 3.0 and 3.1 specifications.
5
+ * Resolves all $ref pointers and produces fully dereferenced documents.
6
+ */
7
+ /**
8
+ * Resolve an OpenAPI spec file to a fully dereferenced object
9
+ *
10
+ * @param specPath - Absolute or relative path to the OpenAPI spec file
11
+ * @returns The fully resolved OpenAPI document as a plain object
12
+ */
13
+ export async function resolveOpenApiSpec(specPath) {
14
+ let bundle;
15
+ let loadConfig;
16
+ try {
17
+ const redocly = await import('@redocly/openapi-core');
18
+ bundle = redocly.bundle;
19
+ loadConfig = redocly.loadConfig;
20
+ }
21
+ catch {
22
+ throw new Error('OpenAPI diffing requires @redocly/openapi-core. ' +
23
+ 'Install it with: npm install @redocly/openapi-core');
24
+ }
25
+ const config = await loadConfig();
26
+ const result = await bundle({ ref: specPath, config, dereference: true });
27
+ return result.bundle.parsed;
28
+ }
29
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,IAAI,MAAqD,CAAC;IAC1D,IAAI,UAA6D,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACxB,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,kDAAkD;YAChD,oDAAoD,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAiC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * OpenAPI structural differ
3
+ *
4
+ * Compares the structural layer of two OpenAPI specs:
5
+ * paths, operations, parameters, request bodies, responses.
6
+ * Schema-level diffing is delegated to @contractual/differs.core walker.
7
+ */
8
+ import type { RawChange } from '@contractual/types';
9
+ /**
10
+ * Diff the structural layer of two resolved OpenAPI specs
11
+ */
12
+ export declare function diffStructural(oldSpec: Record<string, unknown>, newSpec: Record<string, unknown>): RawChange[];
13
+ //# sourceMappingURL=structural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../src/structural.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAQhE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,SAAS,EAAE,CAmCb"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * OpenAPI structural differ
3
+ *
4
+ * Compares the structural layer of two OpenAPI specs:
5
+ * paths, operations, parameters, request bodies, responses.
6
+ * Schema-level diffing is delegated to @contractual/differs.core walker.
7
+ */
8
+ import { walk, escapeJsonPointer } from '@contractual/differs.core';
9
+ const HTTP_METHODS = ['get', 'put', 'post', 'delete', 'patch', 'options', 'head', 'trace'];
10
+ /**
11
+ * Diff the structural layer of two resolved OpenAPI specs
12
+ */
13
+ export function diffStructural(oldSpec, newSpec) {
14
+ const changes = [];
15
+ const oldPaths = (oldSpec.paths ?? {});
16
+ const newPaths = (newSpec.paths ?? {});
17
+ // Diff paths
18
+ for (const path of Object.keys(oldPaths)) {
19
+ const escapedPath = escapeJsonPointer(path);
20
+ if (!(path in newPaths)) {
21
+ changes.push({
22
+ path: `/paths/${escapedPath}`,
23
+ type: 'path-removed',
24
+ oldValue: path,
25
+ });
26
+ continue;
27
+ }
28
+ // Diff operations within matching paths
29
+ changes.push(...diffOperations(oldPaths[path], newPaths[path], path));
30
+ }
31
+ for (const path of Object.keys(newPaths)) {
32
+ if (!(path in oldPaths)) {
33
+ const escapedPath = escapeJsonPointer(path);
34
+ changes.push({
35
+ path: `/paths/${escapedPath}`,
36
+ type: 'path-added',
37
+ newValue: path,
38
+ });
39
+ }
40
+ }
41
+ return changes;
42
+ }
43
+ /**
44
+ * Diff operations (HTTP methods) within a path
45
+ */
46
+ function diffOperations(oldPathItem, newPathItem, apiPath) {
47
+ const changes = [];
48
+ const escapedPath = escapeJsonPointer(apiPath);
49
+ for (const method of HTTP_METHODS) {
50
+ const oldOp = oldPathItem[method];
51
+ const newOp = newPathItem[method];
52
+ if (oldOp && !newOp) {
53
+ changes.push({
54
+ path: `/paths/${escapedPath}/${method}`,
55
+ type: 'operation-removed',
56
+ oldValue: `${method.toUpperCase()} ${apiPath}`,
57
+ });
58
+ }
59
+ else if (!oldOp && newOp) {
60
+ changes.push({
61
+ path: `/paths/${escapedPath}/${method}`,
62
+ type: 'operation-added',
63
+ newValue: `${method.toUpperCase()} ${apiPath}`,
64
+ });
65
+ }
66
+ else if (oldOp && newOp) {
67
+ // Both exist — diff parameters, request body, responses at schema level
68
+ const basePath = `/paths/${escapedPath}/${method}`;
69
+ changes.push(...diffParameters(oldOp, newOp, basePath));
70
+ changes.push(...diffRequestBody(oldOp, newOp, basePath));
71
+ changes.push(...diffResponses(oldOp, newOp, basePath));
72
+ }
73
+ }
74
+ return changes;
75
+ }
76
+ /**
77
+ * Diff parameters between two operations
78
+ */
79
+ function diffParameters(oldOp, newOp, basePath) {
80
+ const changes = [];
81
+ const oldParams = (oldOp.parameters ?? []);
82
+ const newParams = (newOp.parameters ?? []);
83
+ // Index by "in+name" for matching
84
+ const oldByKey = new Map(oldParams.map((p) => [`${p.in}:${p.name}`, p]));
85
+ const newByKey = new Map(newParams.map((p) => [`${p.in}:${p.name}`, p]));
86
+ for (const [key, oldParam] of oldByKey) {
87
+ if (!newByKey.has(key)) {
88
+ changes.push({
89
+ path: `${basePath}/parameters/${oldParam.name}`,
90
+ type: 'parameter-removed',
91
+ oldValue: key,
92
+ });
93
+ }
94
+ else {
95
+ const newParam = newByKey.get(key);
96
+ // Check required change
97
+ if (oldParam.required !== newParam.required) {
98
+ changes.push({
99
+ path: `${basePath}/parameters/${oldParam.name}/required`,
100
+ type: 'parameter-required-changed',
101
+ oldValue: oldParam.required,
102
+ newValue: newParam.required,
103
+ });
104
+ }
105
+ // Diff parameter schemas using core walker
106
+ if (oldParam.schema && newParam.schema) {
107
+ const schemaChanges = walk(oldParam.schema, newParam.schema, `${basePath}/parameters/${oldParam.name}/schema`);
108
+ changes.push(...schemaChanges);
109
+ }
110
+ }
111
+ }
112
+ for (const [key, newParam] of newByKey) {
113
+ if (!oldByKey.has(key)) {
114
+ changes.push({
115
+ path: `${basePath}/parameters/${newParam.name}`,
116
+ type: 'parameter-added',
117
+ newValue: key,
118
+ });
119
+ }
120
+ }
121
+ return changes;
122
+ }
123
+ /**
124
+ * Extract the primary schema from a content map (prefers application/json)
125
+ */
126
+ function extractSchema(content) {
127
+ if (!content)
128
+ return undefined;
129
+ // Prefer application/json, then first available
130
+ const jsonContent = content['application/json'];
131
+ if (jsonContent?.schema)
132
+ return jsonContent.schema;
133
+ for (const mediaType of Object.values(content)) {
134
+ const mt = mediaType;
135
+ if (mt?.schema)
136
+ return mt.schema;
137
+ }
138
+ return undefined;
139
+ }
140
+ /**
141
+ * Diff request bodies between two operations
142
+ */
143
+ function diffRequestBody(oldOp, newOp, basePath) {
144
+ const changes = [];
145
+ const oldBody = oldOp.requestBody;
146
+ const newBody = newOp.requestBody;
147
+ if (oldBody && !newBody) {
148
+ changes.push({
149
+ path: `${basePath}/requestBody`,
150
+ type: 'request-body-removed',
151
+ });
152
+ }
153
+ else if (!oldBody && newBody) {
154
+ changes.push({
155
+ path: `${basePath}/requestBody`,
156
+ type: 'request-body-added',
157
+ });
158
+ }
159
+ else if (oldBody && newBody) {
160
+ const oldSchema = extractSchema(oldBody.content);
161
+ const newSchema = extractSchema(newBody.content);
162
+ if (oldSchema && newSchema) {
163
+ const schemaChanges = walk(oldSchema, newSchema, `${basePath}/requestBody/content/schema`);
164
+ changes.push(...schemaChanges);
165
+ }
166
+ }
167
+ return changes;
168
+ }
169
+ /**
170
+ * Diff responses between two operations
171
+ */
172
+ function diffResponses(oldOp, newOp, basePath) {
173
+ const changes = [];
174
+ const oldResponses = (oldOp.responses ?? {});
175
+ const newResponses = (newOp.responses ?? {});
176
+ for (const statusCode of Object.keys(oldResponses)) {
177
+ if (!(statusCode in newResponses)) {
178
+ changes.push({
179
+ path: `${basePath}/responses/${statusCode}`,
180
+ type: 'response-removed',
181
+ oldValue: statusCode,
182
+ });
183
+ }
184
+ else {
185
+ // Diff response schemas
186
+ const oldSchema = extractSchema(oldResponses[statusCode].content);
187
+ const newSchema = extractSchema(newResponses[statusCode].content);
188
+ if (oldSchema && newSchema) {
189
+ const schemaChanges = walk(oldSchema, newSchema, `${basePath}/responses/${statusCode}/content/schema`);
190
+ changes.push(...schemaChanges);
191
+ }
192
+ }
193
+ }
194
+ for (const statusCode of Object.keys(newResponses)) {
195
+ if (!(statusCode in oldResponses)) {
196
+ changes.push({
197
+ path: `${basePath}/responses/${statusCode}`,
198
+ type: 'response-added',
199
+ newValue: statusCode,
200
+ });
201
+ }
202
+ }
203
+ return changes;
204
+ }
205
+ //# sourceMappingURL=structural.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural.js","sourceRoot":"","sources":["../src/structural.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@contractual/differs.openapi",
3
+ "private": false,
4
+ "version": "0.1.0-dev.1",
5
+ "description": "OpenAPI 3.0/3.1 breaking change detection for Contractual",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/contractual-dev/contractual.git",
19
+ "directory": "packages/differs.openapi"
20
+ },
21
+ "engines": {
22
+ "node": ">=20.0.0"
23
+ },
24
+ "scripts": {
25
+ "prebuild": "rimraf dist",
26
+ "build": "tsc -p tsconfig.build.json"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md"
31
+ ],
32
+ "dependencies": {
33
+ "@contractual/differs.core": "0.1.0-dev.1",
34
+ "@contractual/types": "0.1.0-dev.1"
35
+ },
36
+ "peerDependencies": {
37
+ "@redocly/openapi-core": "^1.0.0"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "@redocly/openapi-core": {
41
+ "optional": true
42
+ }
43
+ },
44
+ "devDependencies": {
45
+ "@redocly/openapi-core": "^1.0.0",
46
+ "rimraf": "^5.0.5"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public",
50
+ "provenance": true
51
+ },
52
+ "gitHead": "9370397e0aa15062baf62aa5ce07d93329339165"
53
+ }