1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const code_file_loader_1 = require("@graphql-toolkit/code-file-loader");
|
5 | const git_loader_1 = require("@graphql-toolkit/git-loader");
|
6 | const github_loader_1 = require("@graphql-toolkit/github-loader");
|
7 | const apollo_engine_loader_1 = require("@graphql-toolkit/apollo-engine-loader");
|
8 | const prisma_loader_1 = require("@graphql-toolkit/prisma-loader");
|
9 | const core_1 = require("@graphql-inspector/core");
|
10 | const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
11 | const log_symbols_1 = tslib_1.__importDefault(require("log-symbols"));
|
12 | const DiffExtension = api => {
|
13 |
|
14 | api.loaders.schema.register(new code_file_loader_1.CodeFileLoader());
|
15 | api.loaders.schema.register(new git_loader_1.GitLoader());
|
16 | api.loaders.schema.register(new github_loader_1.GithubLoader());
|
17 | api.loaders.schema.register(new apollo_engine_loader_1.ApolloEngineLoader());
|
18 | api.loaders.schema.register(new prisma_loader_1.PrismaLoader());
|
19 | return {
|
20 | name: 'diff'
|
21 | };
|
22 | };
|
23 | function hasBreaking(changes) {
|
24 | return changes.some(c => c.criticality.level === core_1.CriticalityLevel.Breaking);
|
25 | }
|
26 | function renderChange(change) {
|
27 | return [getSymbol(change.criticality.level), chalk_1.default.bold(change.message)];
|
28 | }
|
29 | function getSymbol(level) {
|
30 | const symbols = {
|
31 | [core_1.CriticalityLevel.Dangerous]: log_symbols_1.default.warning,
|
32 | [core_1.CriticalityLevel.Breaking]: log_symbols_1.default.error,
|
33 | [core_1.CriticalityLevel.NonBreaking]: log_symbols_1.default.success
|
34 | };
|
35 | return symbols[level];
|
36 | }
|
37 | exports.plugin = {
|
38 | init({ program, loadProjectConfig, reportError }) {
|
39 | program
|
40 | .command('diff [baseSchema]')
|
41 | .action(async (baseSchemaPtr) => {
|
42 | try {
|
43 | const config = await loadProjectConfig({
|
44 | extensions: [DiffExtension]
|
45 | });
|
46 | if (!baseSchemaPtr) {
|
47 | const diffConfig = await config.extension('diff');
|
48 | baseSchemaPtr = diffConfig.baseSchema || 'git:origin/master:schema.graphql';
|
49 | }
|
50 | const [baseSchema, currentSchema] = await Promise.all([
|
51 | config.loadSchema(baseSchemaPtr),
|
52 | config.getSchema(),
|
53 | ]);
|
54 | const changes = core_1.diff(baseSchema, currentSchema);
|
55 | if (!changes.length) {
|
56 | console.log(log_symbols_1.default.success, 'No changes detected');
|
57 | }
|
58 | else {
|
59 | console.warn(log_symbols_1.default.warning, `Detected the following changes (${changes.length}) between schemas:\n`);
|
60 | changes.forEach(change => {
|
61 | console.log(...renderChange(change));
|
62 | });
|
63 | if (hasBreaking(changes)) {
|
64 | const breakingCount = changes.filter(c => c.criticality.level === core_1.CriticalityLevel.Breaking).length;
|
65 | throw `Detected ${breakingCount} breaking change${breakingCount > 1 ? 's' : ''}\n`;
|
66 | }
|
67 | else {
|
68 | console.log(log_symbols_1.default.success, 'No breaking changes detected\n');
|
69 | }
|
70 | process.exit(0);
|
71 | }
|
72 | }
|
73 | catch (e) {
|
74 | reportError(e);
|
75 | }
|
76 | });
|
77 | }
|
78 | };
|
79 |
|
\ | No newline at end of file |