@graphql-tools/stitching-directives 3.1.13 → 3.1.14-alpha-09de1d3da51074c5901decc7efd24f43af24378f

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. package/CHANGELOG.md +929 -0
  2. package/dist/index.cjs +1196 -0
  3. package/dist/index.d.cts +58 -0
  4. package/dist/index.d.ts +58 -0
  5. package/dist/index.js +1193 -0
  6. package/package.json +32 -42
  7. package/cjs/defaultStitchingDirectiveOptions.js +0 -10
  8. package/cjs/extractVariables.js +0 -52
  9. package/cjs/federationToStitchingSDL.js +0 -116
  10. package/cjs/getSourcePaths.js +0 -25
  11. package/cjs/index.js +0 -6
  12. package/cjs/package.json +0 -1
  13. package/cjs/parseMergeArgsExpr.js +0 -77
  14. package/cjs/pathsFromSelectionSet.js +0 -29
  15. package/cjs/preparseMergeArgsExpr.js +0 -31
  16. package/cjs/properties.js +0 -70
  17. package/cjs/stitchingDirectives.js +0 -78
  18. package/cjs/stitchingDirectivesTransformer.js +0 -490
  19. package/cjs/stitchingDirectivesValidator.js +0 -119
  20. package/cjs/types.js +0 -0
  21. package/esm/defaultStitchingDirectiveOptions.js +0 -7
  22. package/esm/extractVariables.js +0 -48
  23. package/esm/federationToStitchingSDL.js +0 -112
  24. package/esm/getSourcePaths.js +0 -21
  25. package/esm/index.js +0 -3
  26. package/esm/parseMergeArgsExpr.js +0 -73
  27. package/esm/pathsFromSelectionSet.js +0 -25
  28. package/esm/preparseMergeArgsExpr.js +0 -27
  29. package/esm/properties.js +0 -63
  30. package/esm/stitchingDirectives.js +0 -74
  31. package/esm/stitchingDirectivesTransformer.js +0 -486
  32. package/esm/stitchingDirectivesValidator.js +0 -115
  33. package/esm/types.js +0 -0
  34. package/typings/defaultStitchingDirectiveOptions.d.cts +0 -2
  35. package/typings/defaultStitchingDirectiveOptions.d.ts +0 -2
  36. package/typings/extractVariables.d.cts +0 -7
  37. package/typings/extractVariables.d.ts +0 -7
  38. package/typings/federationToStitchingSDL.d.cts +0 -2
  39. package/typings/federationToStitchingSDL.d.ts +0 -2
  40. package/typings/getSourcePaths.d.cts +0 -3
  41. package/typings/getSourcePaths.d.ts +0 -3
  42. package/typings/index.d.cts +0 -3
  43. package/typings/index.d.ts +0 -3
  44. package/typings/parseMergeArgsExpr.d.cts +0 -3
  45. package/typings/parseMergeArgsExpr.d.ts +0 -3
  46. package/typings/pathsFromSelectionSet.d.cts +0 -2
  47. package/typings/pathsFromSelectionSet.d.ts +0 -2
  48. package/typings/preparseMergeArgsExpr.d.cts +0 -6
  49. package/typings/preparseMergeArgsExpr.d.ts +0 -6
  50. package/typings/properties.d.cts +0 -5
  51. package/typings/properties.d.ts +0 -5
  52. package/typings/stitchingDirectives.d.cts +0 -19
  53. package/typings/stitchingDirectives.d.ts +0 -19
  54. package/typings/stitchingDirectivesTransformer.d.cts +0 -3
  55. package/typings/stitchingDirectivesTransformer.d.ts +0 -3
  56. package/typings/stitchingDirectivesValidator.d.cts +0 -3
  57. package/typings/stitchingDirectivesValidator.d.ts +0 -3
  58. package/typings/types.d.cts +0 -35
  59. package/typings/types.d.ts +0 -35
package/package.json CHANGED
@@ -1,61 +1,51 @@
1
1
  {
2
2
  "name": "@graphql-tools/stitching-directives",
3
- "version": "3.1.13",
3
+ "version": "3.1.14-alpha-09de1d3da51074c5901decc7efd24f43af24378f",
4
+ "type": "module",
4
5
  "description": "A set of utils for faster development of GraphQL tools",
5
- "sideEffects": false,
6
- "peerDependencies": {
7
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
8
- },
9
- "dependencies": {
10
- "@graphql-tools/delegate": "^10.1.2",
11
- "@graphql-tools/utils": "^10.5.6",
12
- "tslib": "^2.4.0"
13
- },
14
6
  "repository": {
15
7
  "type": "git",
16
- "url": "ardatan/graphql-tools",
8
+ "url": "graphql-hive/gateway",
17
9
  "directory": "packages/stitching-directives"
18
10
  },
19
11
  "license": "MIT",
20
12
  "engines": {
21
- "node": ">=16.0.0"
22
- },
23
- "main": "cjs/index.js",
24
- "module": "esm/index.js",
25
- "typings": "typings/index.d.ts",
26
- "typescript": {
27
- "definition": "typings/index.d.ts"
13
+ "node": ">=18.0.0"
28
14
  },
29
- "type": "module",
15
+ "main": "./dist/index.js",
30
16
  "exports": {
31
17
  ".": {
32
18
  "require": {
33
- "types": "./typings/index.d.cts",
34
- "default": "./cjs/index.js"
19
+ "types": "./dist/index.d.cts",
20
+ "default": "./dist/index.cjs"
35
21
  },
36
22
  "import": {
37
- "types": "./typings/index.d.ts",
38
- "default": "./esm/index.js"
39
- },
40
- "default": {
41
- "types": "./typings/index.d.ts",
42
- "default": "./esm/index.js"
43
- }
44
- },
45
- "./*": {
46
- "require": {
47
- "types": "./typings/*.d.cts",
48
- "default": "./cjs/*.js"
49
- },
50
- "import": {
51
- "types": "./typings/*.d.ts",
52
- "default": "./esm/*.js"
53
- },
54
- "default": {
55
- "types": "./typings/*.d.ts",
56
- "default": "./esm/*.js"
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
57
25
  }
58
26
  },
59
27
  "./package.json": "./package.json"
60
- }
28
+ },
29
+ "types": "./dist/index.d.ts",
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "scripts": {
34
+ "build": "pkgroll --clean-dist",
35
+ "prepack": "yarn build"
36
+ },
37
+ "peerDependencies": {
38
+ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
39
+ },
40
+ "dependencies": {
41
+ "@graphql-tools/delegate": "^10.1.3-alpha-09de1d3da51074c5901decc7efd24f43af24378f",
42
+ "@graphql-tools/utils": "^10.5.6",
43
+ "tslib": "^2.4.0"
44
+ },
45
+ "devDependencies": {
46
+ "@graphql-tools/schema": "^10.0.8",
47
+ "graphql": "^16.9.0",
48
+ "pkgroll": "2.5.1"
49
+ },
50
+ "sideEffects": false
61
51
  }
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultStitchingDirectiveOptions = void 0;
4
- exports.defaultStitchingDirectiveOptions = {
5
- keyDirectiveName: 'key',
6
- computedDirectiveName: 'computed',
7
- canonicalDirectiveName: 'canonical',
8
- mergeDirectiveName: 'merge',
9
- pathToDirectivesInExtensions: ['directives'],
10
- };
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extractVariables = void 0;
4
- const graphql_1 = require("graphql");
5
- function extractVariables(inputValue) {
6
- const path = [];
7
- const variablePaths = Object.create(null);
8
- const keyPathVisitor = {
9
- enter: (_node, key) => {
10
- if (typeof key === 'number') {
11
- path.push(key);
12
- }
13
- },
14
- leave: (_node, key) => {
15
- if (typeof key === 'number') {
16
- path.pop();
17
- }
18
- },
19
- };
20
- const fieldPathVisitor = {
21
- enter: (node) => {
22
- path.push(node.name.value);
23
- },
24
- leave: () => {
25
- path.pop();
26
- },
27
- };
28
- const variableVisitor = {
29
- enter: (node, key) => {
30
- if (typeof key === 'number') {
31
- variablePaths[node.name.value] = path.concat([key]);
32
- }
33
- else {
34
- variablePaths[node.name.value] = path.slice();
35
- }
36
- return {
37
- kind: graphql_1.Kind.NULL,
38
- };
39
- },
40
- };
41
- const newInputValue = (0, graphql_1.visit)(inputValue, {
42
- [graphql_1.Kind.OBJECT]: keyPathVisitor,
43
- [graphql_1.Kind.LIST]: keyPathVisitor,
44
- [graphql_1.Kind.OBJECT_FIELD]: fieldPathVisitor,
45
- [graphql_1.Kind.VARIABLE]: variableVisitor,
46
- });
47
- return {
48
- inputValue: newInputValue,
49
- variablePaths,
50
- };
51
- }
52
- exports.extractVariables = extractVariables;
@@ -1,116 +0,0 @@
1
- "use strict";
2
- // Taken from https://github.com/gmac/federation-to-stitching-sdl/blob/main/index.js
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.federationToStitchingSDL = void 0;
5
- const graphql_1 = require("graphql");
6
- const stitchingDirectives_js_1 = require("./stitchingDirectives.js");
7
- const extensionKind = /Extension$/;
8
- const entityKinds = [
9
- graphql_1.Kind.OBJECT_TYPE_DEFINITION,
10
- graphql_1.Kind.OBJECT_TYPE_EXTENSION,
11
- graphql_1.Kind.INTERFACE_TYPE_DEFINITION,
12
- graphql_1.Kind.INTERFACE_TYPE_EXTENSION,
13
- ];
14
- function isEntityKind(def) {
15
- return entityKinds.includes(def.kind);
16
- }
17
- function getQueryTypeDef(definitions) {
18
- const schemaDef = definitions.find(def => def.kind === graphql_1.Kind.SCHEMA_DEFINITION);
19
- const typeName = schemaDef
20
- ? schemaDef.operationTypes.find(({ operation }) => operation === 'query')?.type.name.value
21
- : 'Query';
22
- return definitions.find(def => def.kind === graphql_1.Kind.OBJECT_TYPE_DEFINITION && def.name.value === typeName);
23
- }
24
- // Federation services are actually fairly complex,
25
- // as the `buildFederatedSchema` helper does a fair amount
26
- // of hidden work to setup the Federation schema specification:
27
- // https://www.apollographql.com/docs/federation/federation-spec/#federation-schema-specification
28
- function federationToStitchingSDL(federationSDL, stitchingConfig = (0, stitchingDirectives_js_1.stitchingDirectives)()) {
29
- const doc = (0, graphql_1.parse)(federationSDL);
30
- const entityTypes = [];
31
- const baseTypeNames = doc.definitions.reduce((memo, typeDef) => {
32
- if (!extensionKind.test(typeDef.kind) && 'name' in typeDef && typeDef.name) {
33
- memo[typeDef.name.value] = true;
34
- }
35
- return memo;
36
- }, {});
37
- doc.definitions.forEach(typeDef => {
38
- // Un-extend all types (remove "extends" keywords)...
39
- // extended types are invalid GraphQL without a local base type to extend from.
40
- // Stitching merges flat types in lieu of hierarchical extensions.
41
- if (extensionKind.test(typeDef.kind) &&
42
- 'name' in typeDef &&
43
- typeDef.name &&
44
- !baseTypeNames[typeDef.name.value]) {
45
- typeDef.kind = typeDef.kind.replace(extensionKind, 'Definition');
46
- }
47
- if (!isEntityKind(typeDef))
48
- return;
49
- // Find object definitions with "@key" directives;
50
- // these are federated entities that get turned into merged types.
51
- const keyDirs = [];
52
- const otherDirs = [];
53
- typeDef.directives?.forEach(dir => {
54
- if (dir.name.value === 'key') {
55
- keyDirs.push(dir);
56
- }
57
- else {
58
- otherDirs.push(dir);
59
- }
60
- });
61
- if (!keyDirs.length)
62
- return;
63
- // Setup stitching MergedTypeConfig for all federated entities:
64
- const selectionSet = `{ ${keyDirs.map((dir) => dir.arguments[0].value.value).join(' ')} }`;
65
- const keyFields = (0, graphql_1.parse)(selectionSet).definitions[0].selectionSet.selections.map((sel) => sel.name.value);
66
- const keyDir = keyDirs[0];
67
- keyDir.name.value = stitchingConfig.keyDirective.name;
68
- keyDir.arguments[0].name.value = 'selectionSet';
69
- keyDir.arguments[0].value.value = selectionSet;
70
- typeDef.directives = [keyDir, ...otherDirs];
71
- // Remove non-key "@external" fields from the type...
72
- // the stitching query planner expects services to only publish their own fields.
73
- // This makes "@provides" moot because the query planner can automate the logic.
74
- typeDef.fields = typeDef.fields?.filter(fieldDef => {
75
- return (keyFields.includes(fieldDef.name.value) ||
76
- !fieldDef.directives?.find(dir => dir.name.value === 'external'));
77
- });
78
- // Discard remaining "@external" directives and any "@provides" directives
79
- typeDef.fields?.forEach((fieldDef) => {
80
- fieldDef.directives = fieldDef.directives.filter((dir) => !/^(external|provides)$/.test(dir.name.value));
81
- fieldDef.directives.forEach((dir) => {
82
- if (dir.name.value === 'requires') {
83
- dir.name.value = stitchingConfig.computedDirective.name;
84
- dir.arguments[0].name.value = 'selectionSet';
85
- dir.arguments[0].value.value = `{ ${dir.arguments[0].value.value} }`;
86
- }
87
- });
88
- });
89
- if (typeDef.kind === graphql_1.Kind.OBJECT_TYPE_DEFINITION ||
90
- typeDef.kind === graphql_1.Kind.OBJECT_TYPE_EXTENSION) {
91
- entityTypes.push(typeDef.name.value);
92
- }
93
- });
94
- // Federation service SDLs are incomplete because they omit the federation spec itself...
95
- // (https://www.apollographql.com/docs/federation/federation-spec/#federation-schema-specification)
96
- // To make federation SDLs into valid and parsable GraphQL schemas,
97
- // we must fill in the missing details from the specification.
98
- if (entityTypes.length) {
99
- const queryDef = getQueryTypeDef(doc.definitions);
100
- const entitiesSchema = (0, graphql_1.parse)(/* GraphQL */ `
101
- scalar _Any
102
- union _Entity = ${entityTypes.filter((v, i, a) => a.indexOf(v) === i).join(' | ')}
103
- type Query { _entities(representations: [_Any!]!): [_Entity]! @${stitchingConfig.mergeDirective.name} }
104
- `).definitions;
105
- doc.definitions.push(entitiesSchema[0]);
106
- doc.definitions.push(entitiesSchema[1]);
107
- if (queryDef) {
108
- queryDef.fields.push(entitiesSchema[2].fields[0]);
109
- }
110
- else {
111
- doc.definitions.push(entitiesSchema[2]);
112
- }
113
- }
114
- return [stitchingConfig.stitchingDirectivesTypeDefs, (0, graphql_1.print)(doc)].join('\n');
115
- }
116
- exports.federationToStitchingSDL = federationToStitchingSDL;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSourcePaths = void 0;
4
- const graphql_1 = require("graphql");
5
- const pathsFromSelectionSet_js_1 = require("./pathsFromSelectionSet.js");
6
- function getSourcePaths(mappingInstructions, selectionSet) {
7
- const sourcePaths = [];
8
- for (const mappingInstruction of mappingInstructions) {
9
- const { sourcePath } = mappingInstruction;
10
- if (sourcePath.length) {
11
- sourcePaths.push(sourcePath);
12
- continue;
13
- }
14
- if (selectionSet == null) {
15
- continue;
16
- }
17
- const paths = (0, pathsFromSelectionSet_js_1.pathsFromSelectionSet)(selectionSet);
18
- for (const path of paths) {
19
- sourcePaths.push(path);
20
- }
21
- sourcePaths.push([graphql_1.TypeNameMetaFieldDef.name]);
22
- }
23
- return sourcePaths;
24
- }
25
- exports.getSourcePaths = getSourcePaths;
package/cjs/index.js DELETED
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./stitchingDirectives.js"), exports);
5
- tslib_1.__exportStar(require("./types.js"), exports);
6
- tslib_1.__exportStar(require("./federationToStitchingSDL.js"), exports);
package/cjs/package.json DELETED
@@ -1 +0,0 @@
1
- {"type":"commonjs"}
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseMergeArgsExpr = void 0;
4
- const graphql_1 = require("graphql");
5
- const extractVariables_js_1 = require("./extractVariables.js");
6
- const getSourcePaths_js_1 = require("./getSourcePaths.js");
7
- const preparseMergeArgsExpr_js_1 = require("./preparseMergeArgsExpr.js");
8
- const properties_js_1 = require("./properties.js");
9
- function parseMergeArgsExpr(mergeArgsExpr, selectionSet) {
10
- const { mergeArgsExpr: newMergeArgsExpr, expansionExpressions } = (0, preparseMergeArgsExpr_js_1.preparseMergeArgsExpr)(mergeArgsExpr);
11
- const inputValue = (0, graphql_1.parseValue)(`{ ${newMergeArgsExpr} }`, { noLocation: true });
12
- const { inputValue: newInputValue, variablePaths } = (0, extractVariables_js_1.extractVariables)(inputValue);
13
- if (!Object.keys(expansionExpressions).length) {
14
- if (!Object.keys(variablePaths).length) {
15
- throw new Error('Merge arguments must declare a key.');
16
- }
17
- const mappingInstructions = getMappingInstructions(variablePaths);
18
- const usedProperties = (0, properties_js_1.propertyTreeFromPaths)((0, getSourcePaths_js_1.getSourcePaths)(mappingInstructions, selectionSet));
19
- return {
20
- args: (0, graphql_1.valueFromASTUntyped)(newInputValue),
21
- usedProperties,
22
- mappingInstructions,
23
- };
24
- }
25
- const expansionRegEx = new RegExp(`^${preparseMergeArgsExpr_js_1.EXPANSION_PREFIX}[0-9]+$`);
26
- for (const variableName in variablePaths) {
27
- if (!variableName.match(expansionRegEx)) {
28
- throw new Error('Expansions cannot be mixed with single key declarations.');
29
- }
30
- }
31
- const expansions = [];
32
- const sourcePaths = [];
33
- for (const variableName in expansionExpressions) {
34
- const str = expansionExpressions[variableName];
35
- const valuePath = variablePaths[variableName];
36
- const { inputValue: expansionInputValue, variablePaths: expansionVariablePaths } = (0, extractVariables_js_1.extractVariables)((0, graphql_1.parseValue)(`${str}`, { noLocation: true }));
37
- if (!Object.keys(expansionVariablePaths).length) {
38
- throw new Error('Merge arguments must declare a key.');
39
- }
40
- const mappingInstructions = getMappingInstructions(expansionVariablePaths);
41
- const value = (0, graphql_1.valueFromASTUntyped)(expansionInputValue);
42
- sourcePaths.push(...(0, getSourcePaths_js_1.getSourcePaths)(mappingInstructions, selectionSet));
43
- assertNotWithinList(valuePath);
44
- expansions.push({
45
- valuePath,
46
- value,
47
- mappingInstructions,
48
- });
49
- }
50
- const usedProperties = (0, properties_js_1.propertyTreeFromPaths)(sourcePaths);
51
- return {
52
- args: (0, graphql_1.valueFromASTUntyped)(newInputValue),
53
- usedProperties,
54
- expansions,
55
- };
56
- }
57
- exports.parseMergeArgsExpr = parseMergeArgsExpr;
58
- function getMappingInstructions(variablePaths) {
59
- const mappingInstructions = [];
60
- for (const keyPath in variablePaths) {
61
- const valuePath = variablePaths[keyPath];
62
- const splitKeyPath = keyPath.split(preparseMergeArgsExpr_js_1.KEY_DELIMITER).slice(1);
63
- assertNotWithinList(valuePath);
64
- mappingInstructions.push({
65
- destinationPath: valuePath,
66
- sourcePath: splitKeyPath,
67
- });
68
- }
69
- return mappingInstructions;
70
- }
71
- function assertNotWithinList(path) {
72
- for (const pathSegment of path) {
73
- if (typeof pathSegment === 'number') {
74
- throw new Error('Insertions cannot be made into a list.');
75
- }
76
- }
77
- }
@@ -1,29 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pathsFromSelectionSet = void 0;
4
- const graphql_1 = require("graphql");
5
- function pathsFromSelectionSet(selectionSet, path = []) {
6
- const paths = [];
7
- for (const selection of selectionSet.selections) {
8
- const additions = pathsFromSelection(selection, path) ?? [];
9
- for (const addition of additions) {
10
- paths.push(addition);
11
- }
12
- }
13
- return paths;
14
- }
15
- exports.pathsFromSelectionSet = pathsFromSelectionSet;
16
- function pathsFromSelection(selection, path) {
17
- if (selection.kind === graphql_1.Kind.FIELD) {
18
- const responseKey = selection.alias?.value ?? selection.name.value;
19
- if (selection.selectionSet) {
20
- return pathsFromSelectionSet(selection.selectionSet, path.concat([responseKey]));
21
- }
22
- else {
23
- return [path.concat([responseKey])];
24
- }
25
- }
26
- else if (selection.kind === graphql_1.Kind.INLINE_FRAGMENT) {
27
- return pathsFromSelectionSet(selection.selectionSet, path);
28
- }
29
- }
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.preparseMergeArgsExpr = exports.EXPANSION_PREFIX = exports.KEY_DELIMITER = void 0;
4
- exports.KEY_DELIMITER = '__dot__';
5
- exports.EXPANSION_PREFIX = '__exp';
6
- function preparseMergeArgsExpr(mergeArgsExpr) {
7
- const variableRegex = /\$[_A-Za-z][_A-Za-z0-9.]*/g;
8
- const dotRegex = /\./g;
9
- mergeArgsExpr = mergeArgsExpr.replace(variableRegex, variable => variable.replace(dotRegex, exports.KEY_DELIMITER));
10
- const segments = mergeArgsExpr.split('[[');
11
- const expansionExpressions = Object.create(null);
12
- if (segments.length === 1) {
13
- return { mergeArgsExpr, expansionExpressions };
14
- }
15
- let finalSegments = [segments[0]];
16
- for (let i = 1; i < segments.length; i++) {
17
- const additionalSegments = segments[i].split(']]');
18
- if (additionalSegments.length !== 2) {
19
- throw new Error(`Each opening "[[" must be matched by a closing "]]" without nesting.`);
20
- }
21
- finalSegments = finalSegments.concat(additionalSegments);
22
- }
23
- let finalMergeArgsExpr = finalSegments[0];
24
- for (let i = 1; i < finalSegments.length - 1; i += 2) {
25
- const variableName = `${exports.EXPANSION_PREFIX}${(i - 1) / 2 + 1}`;
26
- expansionExpressions[variableName] = finalSegments[i];
27
- finalMergeArgsExpr += `\$${variableName}${finalSegments[i + 1]}`;
28
- }
29
- return { mergeArgsExpr: finalMergeArgsExpr, expansionExpressions };
30
- }
31
- exports.preparseMergeArgsExpr = preparseMergeArgsExpr;
package/cjs/properties.js DELETED
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.propertyTreeFromPaths = exports.getProperties = exports.getProperty = exports.addProperty = void 0;
4
- function addProperty(object, path, value) {
5
- const initialSegment = path[0];
6
- if (path.length === 1) {
7
- object[initialSegment] = value;
8
- return;
9
- }
10
- let field = object[initialSegment];
11
- if (field != null) {
12
- addProperty(field, path.slice(1), value);
13
- return;
14
- }
15
- if (typeof path[1] === 'string') {
16
- field = Object.create(null);
17
- }
18
- else {
19
- field = [];
20
- }
21
- addProperty(field, path.slice(1), value);
22
- object[initialSegment] = field;
23
- }
24
- exports.addProperty = addProperty;
25
- function getProperty(object, path) {
26
- if (!path.length || object == null) {
27
- return object;
28
- }
29
- const newPath = path.slice();
30
- const key = newPath.shift();
31
- if (key == null) {
32
- return;
33
- }
34
- const prop = object[key];
35
- return getProperty(prop, newPath);
36
- }
37
- exports.getProperty = getProperty;
38
- function getProperties(object, propertyTree) {
39
- if (object == null) {
40
- return object;
41
- }
42
- const newObject = Object.create(null);
43
- for (const key in propertyTree) {
44
- const subKey = propertyTree[key];
45
- if (subKey == null) {
46
- newObject[key] = object[key];
47
- continue;
48
- }
49
- const prop = object[key];
50
- newObject[key] = deepMap(prop, function deepMapFn(item) {
51
- return getProperties(item, subKey);
52
- });
53
- }
54
- return newObject;
55
- }
56
- exports.getProperties = getProperties;
57
- function propertyTreeFromPaths(paths) {
58
- const propertyTree = Object.create(null);
59
- for (const path of paths) {
60
- addProperty(propertyTree, path, null);
61
- }
62
- return propertyTree;
63
- }
64
- exports.propertyTreeFromPaths = propertyTreeFromPaths;
65
- function deepMap(arrayOrItem, fn) {
66
- if (Array.isArray(arrayOrItem)) {
67
- return arrayOrItem.map(nestedArrayOrItem => deepMap(nestedArrayOrItem, fn));
68
- }
69
- return fn(arrayOrItem);
70
- }
@@ -1,78 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stitchingDirectives = void 0;
4
- const graphql_1 = require("graphql");
5
- const defaultStitchingDirectiveOptions_js_1 = require("./defaultStitchingDirectiveOptions.js");
6
- const stitchingDirectivesTransformer_js_1 = require("./stitchingDirectivesTransformer.js");
7
- const stitchingDirectivesValidator_js_1 = require("./stitchingDirectivesValidator.js");
8
- function stitchingDirectives(options = {}) {
9
- const finalOptions = {
10
- ...defaultStitchingDirectiveOptions_js_1.defaultStitchingDirectiveOptions,
11
- ...options,
12
- };
13
- const { keyDirectiveName, computedDirectiveName, mergeDirectiveName, canonicalDirectiveName } = finalOptions;
14
- const keyDirectiveTypeDefs = /* GraphQL */ `directive @${keyDirectiveName}(selectionSet: String!) on OBJECT`;
15
- const computedDirectiveTypeDefs = /* GraphQL */ `directive @${computedDirectiveName}(selectionSet: String!) on FIELD_DEFINITION`;
16
- const mergeDirectiveTypeDefs = /* GraphQL */ `directive @${mergeDirectiveName}(argsExpr: String, keyArg: String, keyField: String, key: [String!], additionalArgs: String) on FIELD_DEFINITION`;
17
- const canonicalDirectiveTypeDefs = /* GraphQL */ `directive @${canonicalDirectiveName} on OBJECT | INTERFACE | INPUT_OBJECT | UNION | ENUM | SCALAR | FIELD_DEFINITION | INPUT_FIELD_DEFINITION`;
18
- const keyDirective = new graphql_1.GraphQLDirective({
19
- name: keyDirectiveName,
20
- locations: ['OBJECT'],
21
- args: {
22
- selectionSet: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
23
- },
24
- });
25
- const computedDirective = new graphql_1.GraphQLDirective({
26
- name: computedDirectiveName,
27
- locations: ['FIELD_DEFINITION'],
28
- args: {
29
- selectionSet: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
30
- },
31
- });
32
- const mergeDirective = new graphql_1.GraphQLDirective({
33
- name: mergeDirectiveName,
34
- locations: ['FIELD_DEFINITION'],
35
- args: {
36
- argsExpr: { type: graphql_1.GraphQLString },
37
- keyArg: { type: graphql_1.GraphQLString },
38
- keyField: { type: graphql_1.GraphQLString },
39
- key: { type: new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(graphql_1.GraphQLString)) },
40
- additionalArgs: { type: graphql_1.GraphQLString },
41
- },
42
- });
43
- const canonicalDirective = new graphql_1.GraphQLDirective({
44
- name: canonicalDirectiveName,
45
- locations: [
46
- 'OBJECT',
47
- 'INTERFACE',
48
- 'INPUT_OBJECT',
49
- 'UNION',
50
- 'ENUM',
51
- 'SCALAR',
52
- 'FIELD_DEFINITION',
53
- 'INPUT_FIELD_DEFINITION',
54
- ],
55
- });
56
- const allStitchingDirectivesTypeDefs = [
57
- keyDirectiveTypeDefs,
58
- computedDirectiveTypeDefs,
59
- mergeDirectiveTypeDefs,
60
- canonicalDirectiveTypeDefs,
61
- ].join('\n');
62
- return {
63
- keyDirectiveTypeDefs,
64
- computedDirectiveTypeDefs,
65
- mergeDirectiveTypeDefs,
66
- canonicalDirectiveTypeDefs,
67
- stitchingDirectivesTypeDefs: allStitchingDirectivesTypeDefs, // for backwards compatibility
68
- allStitchingDirectivesTypeDefs,
69
- keyDirective,
70
- computedDirective,
71
- mergeDirective,
72
- canonicalDirective,
73
- allStitchingDirectives: [keyDirective, computedDirective, mergeDirective, canonicalDirective],
74
- stitchingDirectivesValidator: (0, stitchingDirectivesValidator_js_1.stitchingDirectivesValidator)(finalOptions),
75
- stitchingDirectivesTransformer: (0, stitchingDirectivesTransformer_js_1.stitchingDirectivesTransformer)(finalOptions),
76
- };
77
- }
78
- exports.stitchingDirectives = stitchingDirectives;