diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0193948..5706812 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,12 +12,11 @@ jobs: - "18" - "16" - "14" - - "12" steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index b1b94de..817b9b7 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -13,6 +13,7 @@ "@graphql-tools/json-file-loader": "^7.4.3", "@graphql-tools/load": "^7.7.4", "@graphql-tools/url-loader": "^7.13.9", + "@graphql-tools/utils": "^9.0.1", "@highlightjs/cdn-assets": "^11.6.0", "chalk": "^4.1.2", "diff2html": "^3.4.18", @@ -660,6 +661,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/batch-execute/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/delegate": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.3.tgz", @@ -676,6 +688,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/delegate/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/graphql-file-loader": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.2.tgz", @@ -691,6 +714,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/import": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.3.tgz", @@ -704,6 +738,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/json-file-loader": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.3.tgz", @@ -718,6 +763,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/load": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.7.4.tgz", @@ -732,6 +788,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/merge": { "version": "8.3.3", "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.3.tgz", @@ -744,6 +811,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/schema": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.1.tgz", @@ -758,6 +836,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/url-loader": { "version": "7.13.9", "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.13.9.tgz", @@ -783,7 +872,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/utils": { + "node_modules/@graphql-tools/url-loader/node_modules/@graphql-tools/utils": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", @@ -794,6 +883,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/utils": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.0.1.tgz", + "integrity": "sha512-z6FimVa5E44bHKmqK0/uMp9hHvHo2Tkt9A5rlLb40ReD/8IFKehSXLzM4b2N1vcP7mSsbXIdDK9Aoc8jT/he1Q==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/wrap": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.0.4.tgz", @@ -809,6 +909,17 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/wrap/node_modules/@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@highlightjs/cdn-assets": { "version": "11.6.0", "resolved": "https://registry.npmjs.org/@highlightjs/cdn-assets/-/cdn-assets-11.6.0.tgz", @@ -5495,6 +5606,16 @@ "dataloader": "2.1.0", "tslib": "^2.4.0", "value-or-promise": "1.0.11" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/delegate": { @@ -5508,6 +5629,16 @@ "dataloader": "2.1.0", "tslib": "~2.4.0", "value-or-promise": "1.0.11" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/graphql-file-loader": { @@ -5520,6 +5651,16 @@ "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/import": { @@ -5530,6 +5671,16 @@ "@graphql-tools/utils": "8.10.0", "resolve-from": "5.0.0", "tslib": "^2.4.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/json-file-loader": { @@ -5541,6 +5692,16 @@ "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/load": { @@ -5552,6 +5713,16 @@ "@graphql-tools/utils": "8.10.0", "p-limit": "3.1.0", "tslib": "^2.4.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/merge": { @@ -5561,6 +5732,16 @@ "requires": { "@graphql-tools/utils": "8.10.0", "tslib": "^2.4.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/schema": { @@ -5572,6 +5753,16 @@ "@graphql-tools/utils": "8.10.0", "tslib": "^2.4.0", "value-or-promise": "1.0.11" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/url-loader": { @@ -5594,12 +5785,22 @@ "tslib": "^2.4.0", "value-or-promise": "^1.0.11", "ws": "^8.3.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@graphql-tools/utils": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", - "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.0.1.tgz", + "integrity": "sha512-z6FimVa5E44bHKmqK0/uMp9hHvHo2Tkt9A5rlLb40ReD/8IFKehSXLzM4b2N1vcP7mSsbXIdDK9Aoc8jT/he1Q==", "requires": { "tslib": "^2.4.0" } @@ -5614,6 +5815,16 @@ "@graphql-tools/utils": "8.10.0", "tslib": "^2.4.0", "value-or-promise": "1.0.11" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg==", + "requires": { + "tslib": "^2.4.0" + } + } } }, "@highlightjs/cdn-assets": { diff --git a/package.json b/package.json index 061f408..3ff7cde 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@graphql-tools/json-file-loader": "^7.4.3", "@graphql-tools/load": "^7.7.4", "@graphql-tools/url-loader": "^7.13.9", + "@graphql-tools/utils": "^9.0.1", "@highlightjs/cdn-assets": "^11.6.0", "chalk": "^4.1.2", "diff2html": "^3.4.18", diff --git a/src/__tests__/diff.test.ts b/src/__tests__/diff.test.ts index 713243a..43090e8 100644 --- a/src/__tests__/diff.test.ts +++ b/src/__tests__/diff.test.ts @@ -191,6 +191,19 @@ describe("getDiff", () => { } }); + it("returns the diff between two schemas with changed directives", async () => { + const result = await getDiff( + path.join(__dirname, "fixtures/localSchemaDirective.graphql"), + path.join(__dirname, "fixtures/localSchemaDirectiveChanged.graphql") + ); + + expect(result).toBeDefined(); + + if (result) { + expect(result.diff).toMatch(/@test\(name: "TEST"\)/); + } + }); + it("returns dangerous changes", async () => { const result = await getDiff( path.join(__dirname, "fixtures/localSchema.graphql"), diff --git a/src/__tests__/fixtures/localSchemaDirective.graphql b/src/__tests__/fixtures/localSchemaDirective.graphql new file mode 100644 index 0000000..8d2ddaa --- /dev/null +++ b/src/__tests__/fixtures/localSchemaDirective.graphql @@ -0,0 +1,5 @@ +directive @test(name: String!) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | INPUT_FIELD_DEFINITION | ENUM | INPUT_OBJECT + +type Query { + test: String +} diff --git a/src/__tests__/fixtures/localSchemaDirectiveChanged.graphql b/src/__tests__/fixtures/localSchemaDirectiveChanged.graphql new file mode 100644 index 0000000..f170590 --- /dev/null +++ b/src/__tests__/fixtures/localSchemaDirectiveChanged.graphql @@ -0,0 +1,5 @@ +directive @test(name: String!) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | INPUT_FIELD_DEFINITION | ENUM | INPUT_OBJECT + +type Query @test(name: "TEST") { + test: String +} diff --git a/src/diff.ts b/src/diff.ts index 8199d8c..fbc3dec 100644 --- a/src/diff.ts +++ b/src/diff.ts @@ -1,5 +1,4 @@ import { - printSchema, findBreakingChanges, findDangerousChanges, DangerousChange, @@ -10,6 +9,7 @@ import disparity from "disparity"; import { loadSchema } from "@graphql-tools/load"; import { UrlLoader } from "@graphql-tools/url-loader"; import { JsonFileLoader } from "@graphql-tools/json-file-loader"; +import { printSchemaWithDirectives } from "@graphql-tools/utils"; import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader"; import fetch from "node-fetch"; @@ -70,8 +70,8 @@ export async function getDiff( } const [leftSchemaSDL, rightSchemaSDL] = [ - printSchema(leftSchema), - printSchema(rightSchema), + printSchemaWithDirectives(leftSchema), + printSchemaWithDirectives(rightSchema), ]; if (leftSchemaSDL === rightSchemaSDL) {