UNPKG

3.54 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const code_file_loader_1 = require("@graphql-toolkit/code-file-loader");
5const git_loader_1 = require("@graphql-toolkit/git-loader");
6const github_loader_1 = require("@graphql-toolkit/github-loader");
7const apollo_engine_loader_1 = require("@graphql-toolkit/apollo-engine-loader");
8const prisma_loader_1 = require("@graphql-toolkit/prisma-loader");
9const core_1 = require("@graphql-inspector/core");
10const chalk_1 = tslib_1.__importDefault(require("chalk"));
11const log_symbols_1 = tslib_1.__importDefault(require("log-symbols"));
12const DiffExtension = api => {
13 // Schema
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};
23function hasBreaking(changes) {
24 return changes.some(c => c.criticality.level === core_1.CriticalityLevel.Breaking);
25}
26function renderChange(change) {
27 return [getSymbol(change.criticality.level), chalk_1.default.bold(change.message)];
28}
29function 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}
37exports.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//# sourceMappingURL=index.js.map
\No newline at end of file