This repository has been archived by the owner on Apr 17, 2023. It is now read-only.
/
GraphQLSchemaManager.ts
64 lines (55 loc) · 1.69 KB
/
GraphQLSchemaManager.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { Change, diff } from '@graphql-inspector/core';
import { buildSchema } from 'graphql';
import { GraphQLSchemaChangeTypes } from '../GraphQLSchemaChangeTypes';
import { SchemaProvider } from './SchemaProvider';
export interface SchemaManagerOptions {
provider: SchemaProvider
}
/**
* Manages GraphQL schemas
*
* @export
* @class GraphQLSchemaManager
*/
export class GraphQLSchemaManager {
public provider: SchemaProvider;
private previousSchemaText: string;
private currentSchemaText: string;
constructor(options: SchemaManagerOptions) {
this.provider = options.provider;
this.previousSchemaText = this.provider.getPreviousSchemaText();
this.currentSchemaText = this.provider.getCurrentSchemaText();
}
/**
* Get the difference between the current and previous schemas
*
* @returns {Change[]}
* @memberof GraphQLSchemaManager
*/
public getChanges(): Change[] {
let changes: Change[] = [];
if (!this.previousSchemaText || !this.previousSchemaText.length) {
return changes;
}
const oldSchema = buildSchema(this.previousSchemaText);
const newSchema = buildSchema(this.currentSchemaText);
if (oldSchema && newSchema) {
changes = diff(oldSchema, newSchema);
}
return this.getValidChangeTypes(changes);
}
public updateOldSchema() {
this.provider.updatePreviousSchema(this.currentSchemaText);
}
/**
* Filter only the allowed, non-breaking changes types
*
* @private
* @param {Change[]} changes
* @returns {Change[]}
* @memberof GraphQLSchemaManager
*/
private getValidChangeTypes(changes: Change[]): Change[] {
return changes.filter((c: Change) => !!GraphQLSchemaChangeTypes[c.type]);
}
}