urql-computed-exchange-plus 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintrc.js +58 -0
  3. package/.importsortrc +6 -0
  4. package/.prettierrc +12 -0
  5. package/CHANGELOG.md +50 -0
  6. package/LICENSE +24 -0
  7. package/README.md +367 -0
  8. package/jest.config.js +19 -0
  9. package/jest.integration.config.js +14 -0
  10. package/jest.performance.config.js +19 -0
  11. package/lib/async-computed.d.ts +16 -0
  12. package/lib/async-computed.js +68 -0
  13. package/lib/async-computed.js.map +1 -0
  14. package/lib/computed-exchange.d.ts +5 -0
  15. package/lib/computed-exchange.js +24 -0
  16. package/lib/computed-exchange.js.map +1 -0
  17. package/lib/create-entity.d.ts +2 -0
  18. package/lib/create-entity.js +7 -0
  19. package/lib/create-entity.js.map +1 -0
  20. package/lib/create-modern-entity.d.ts +2 -0
  21. package/lib/create-modern-entity.js +10 -0
  22. package/lib/create-modern-entity.js.map +1 -0
  23. package/lib/directive-utils.d.ts +6 -0
  24. package/lib/directive-utils.js +125 -0
  25. package/lib/directive-utils.js.map +1 -0
  26. package/lib/index.d.ts +6 -0
  27. package/lib/index.js +23 -0
  28. package/lib/index.js.map +1 -0
  29. package/lib/merge-entities.d.ts +2 -0
  30. package/lib/merge-entities.js +35 -0
  31. package/lib/merge-entities.js.map +1 -0
  32. package/lib/resolve-data.d.ts +2 -0
  33. package/lib/resolve-data.js +152 -0
  34. package/lib/resolve-data.js.map +1 -0
  35. package/lib/set-utils.d.ts +5 -0
  36. package/lib/set-utils.js +27 -0
  37. package/lib/set-utils.js.map +1 -0
  38. package/lib/tsconfig.tsbuildinfo +1 -0
  39. package/lib/types/augmented-operation-result.d.ts +6 -0
  40. package/lib/types/augmented-operation-result.js +3 -0
  41. package/lib/types/augmented-operation-result.js.map +1 -0
  42. package/lib/types/augmented-operation.d.ts +6 -0
  43. package/lib/types/augmented-operation.js +3 -0
  44. package/lib/types/augmented-operation.js.map +1 -0
  45. package/lib/types/entity.d.ts +13 -0
  46. package/lib/types/entity.js +3 -0
  47. package/lib/types/entity.js.map +1 -0
  48. package/lib/types/index.d.ts +4 -0
  49. package/lib/types/index.js +21 -0
  50. package/lib/types/index.js.map +1 -0
  51. package/lib/types/node-with-directives.d.ts +2 -0
  52. package/lib/types/node-with-directives.js +3 -0
  53. package/lib/types/node-with-directives.js.map +1 -0
  54. package/lib/types.d.ts +68 -0
  55. package/lib/types.js +18 -0
  56. package/lib/types.js.map +1 -0
  57. package/package.json +77 -0
  58. package/test/integration/computed-exchange.test.ts +541 -0
  59. package/test/performance/large-dataset.test.ts +66 -0
  60. package/test/utils/index.ts +2 -0
  61. package/test/utils/run-query.ts +15 -0
  62. package/test/utils/simple-mock-fetch.ts +75 -0
  63. package/tsconfig.build.json +4 -0
  64. package/tsconfig.json +29 -0
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computedExchange = computedExchange;
4
+ const wonka_1 = require("wonka");
5
+ const directive_utils_1 = require("./directive-utils");
6
+ const resolve_data_1 = require("./resolve-data");
7
+ function computedExchange({ entities }) {
8
+ return ({ forward }) => (op$) => (0, wonka_1.pipe)(op$, (0, wonka_1.map)((op) => {
9
+ const { query } = op;
10
+ const augmentedOp = op;
11
+ augmentedOp.originalQuery = query;
12
+ augmentedOp.mixedQuery = (0, directive_utils_1.addFragmentsFromDirectives)(query, entities);
13
+ augmentedOp.query = (0, directive_utils_1.replaceDirectivesByFragments)(query, entities);
14
+ return augmentedOp;
15
+ }), forward, (0, wonka_1.map)((res) => {
16
+ const { data } = res;
17
+ const augmentedRes = res;
18
+ augmentedRes.rawData = data;
19
+ augmentedRes.data = (0, resolve_data_1.resolveData)(data, augmentedRes.operation, entities);
20
+ augmentedRes.operation.query = augmentedRes.operation.originalQuery;
21
+ return res;
22
+ }));
23
+ }
24
+ //# sourceMappingURL=computed-exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed-exchange.js","sourceRoot":"","sources":["../src/computed-exchange.ts"],"names":[],"mappings":";;AAOA,4CAkCC;AAxCD,iCAAkC;AAElC,uDAA6F;AAC7F,iDAA6C;AAG7C,SAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAA0B;IACnE,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9B,IAAA,YAAI,EACF,GAAG,EACH,IAAA,WAAG,EAAC,CAAC,EAAE,EAAE,EAAE;QACT,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,EAAS,CAAC;QAE9B,WAAW,CAAC,aAAa,GAAG,KAAK,CAAC;QAKlC,WAAW,CAAC,UAAU,GAAG,IAAA,4CAA0B,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrE,WAAW,CAAC,KAAK,GAAG,IAAA,8CAA4B,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAElE,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC,EACF,OAAO,EACP,IAAA,WAAG,EAAC,CAAC,GAAG,EAAE,EAAE;QACV,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,MAAM,YAAY,GAAG,GAAU,CAAC;QAEhC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,YAAY,CAAC,IAAI,GAAG,IAAA,0BAAW,EAAC,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAKxE,YAAY,CAAC,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC;QAEpE,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Entity } from './types';
2
+ export declare function createEntity<T = any>(typeName: Entity<T>['typeName'], fields: Entity<T>['fields']): Entity<T>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEntity = createEntity;
4
+ function createEntity(typeName, fields) {
5
+ return { typeName, fields };
6
+ }
7
+ //# sourceMappingURL=create-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-entity.js","sourceRoot":"","sources":["../src/create-entity.ts"],"names":[],"mappings":";;AAEA,oCAKC;AALD,SAAgB,YAAY,CAC1B,QAA+B,EAC/B,MAA2B;IAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ModernEntity, EntityDefinition, GraphQLObject } from './types';
2
+ export declare function createModernEntity<T extends GraphQLObject = GraphQLObject>(typeName: string, computedProperties: EntityDefinition<T>): ModernEntity<T>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createModernEntity = createModernEntity;
4
+ function createModernEntity(typeName, computedProperties) {
5
+ return {
6
+ __typename: typeName,
7
+ computedProperties
8
+ };
9
+ }
10
+ //# sourceMappingURL=create-modern-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-modern-entity.js","sourceRoot":"","sources":["../src/create-modern-entity.ts"],"names":[],"mappings":";;AAKA,gDAQC;AARD,SAAgB,kBAAkB,CAChC,QAAgB,EAChB,kBAAuC;IAEvC,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ASTNode, DefinitionNode, DocumentNode } from 'graphql';
2
+ import { Entities } from './types';
3
+ export declare function getDirectiveType(directiveNode: any): string;
4
+ export declare function nodeHasComputedDirectives(node?: ASTNode): boolean;
5
+ export declare function replaceDirectivesByFragments(query: DefinitionNode | DocumentNode | undefined, entities: Entities, visitedNodes?: Set<string>): any;
6
+ export declare function addFragmentsFromDirectives(query: DefinitionNode | DocumentNode | undefined, entities: Entities, visitedNodes?: Set<string>): any;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDirectiveType = getDirectiveType;
4
+ exports.nodeHasComputedDirectives = nodeHasComputedDirectives;
5
+ exports.replaceDirectivesByFragments = replaceDirectivesByFragments;
6
+ exports.addFragmentsFromDirectives = addFragmentsFromDirectives;
7
+ const graphql_1 = require("graphql");
8
+ function flatten(arr) {
9
+ return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
10
+ }
11
+ function _isNodeWithDirectives(node) {
12
+ return node != null && node.directives != null;
13
+ }
14
+ function getDirectiveType(directiveNode) {
15
+ const typeName = directiveNode?.arguments?.[0]?.value?.value;
16
+ if (typeName == null) {
17
+ throw new Error('Invalid @computed directive found. No type specified');
18
+ }
19
+ return typeName;
20
+ }
21
+ function nodeHasComputedDirectives(node) {
22
+ if (!_isNodeWithDirectives(node)) {
23
+ return false;
24
+ }
25
+ return node.directives != null && node.directives.some((d) => d.name.value === 'computed');
26
+ }
27
+ function replaceDirectivesByFragments(query, entities, visitedNodes = new Set()) {
28
+ if (query == null) {
29
+ return null;
30
+ }
31
+ const replaceDirectiveByFragment = (node) => {
32
+ const computedDirective = node.directives?.find((d) => d.name.value === 'computed');
33
+ const directiveType = getDirectiveType(computedDirective);
34
+ const entityType = entities[directiveType];
35
+ if (entityType == null) {
36
+ throw new Error(`No entity found for type "${directiveType}"`);
37
+ }
38
+ const fieldName = node.name.value;
39
+ const entityField = entityType.fields[fieldName];
40
+ if (entityField == null) {
41
+ throw new Error(`No resolver found for @computed directive "${fieldName}" in type "${directiveType}"`);
42
+ }
43
+ const dependencyKey = `${directiveType}:${fieldName}`;
44
+ if (visitedNodes.has(dependencyKey)) {
45
+ return {
46
+ kind: 'InlineFragment',
47
+ typeCondition: {
48
+ kind: 'NamedType',
49
+ name: { kind: 'Name', value: directiveType },
50
+ },
51
+ selectionSet: {
52
+ kind: 'SelectionSet',
53
+ selections: [],
54
+ },
55
+ };
56
+ }
57
+ const newVisitedNodes = new Set(visitedNodes);
58
+ newVisitedNodes.add(dependencyKey);
59
+ return replaceDirectivesByFragments(entityField.dependencies?.definitions[0], entities, newVisitedNodes);
60
+ };
61
+ return (0, graphql_1.visit)(query, {
62
+ Field(node) {
63
+ if (!nodeHasComputedDirectives(node)) {
64
+ return undefined;
65
+ }
66
+ return replaceDirectiveByFragment(node);
67
+ },
68
+ Directive(node) {
69
+ if (node.name.value === 'computed') {
70
+ return null;
71
+ }
72
+ },
73
+ });
74
+ }
75
+ function addFragmentsFromDirectives(query, entities, visitedNodes = new Set()) {
76
+ if (query == null) {
77
+ return null;
78
+ }
79
+ const addFragmentToNode = (node) => {
80
+ const computedDirective = node.directives?.find((d) => d.name.value === 'computed');
81
+ const directiveType = getDirectiveType(computedDirective);
82
+ const entityType = entities[directiveType];
83
+ if (entityType == null) {
84
+ throw new Error(`No entity found for type "${directiveType}"`);
85
+ }
86
+ const fieldName = node.name.value;
87
+ const entityField = entityType.fields[fieldName];
88
+ if (entityField == null) {
89
+ throw new Error(`No resolver found for @computed directive "${fieldName}" in type "${directiveType}"`);
90
+ }
91
+ const dependencyKey = `${directiveType}:${fieldName}`;
92
+ if (visitedNodes.has(dependencyKey)) {
93
+ return {
94
+ kind: 'InlineFragment',
95
+ typeCondition: {
96
+ kind: 'NamedType',
97
+ name: { kind: 'Name', value: directiveType },
98
+ },
99
+ selectionSet: {
100
+ kind: 'SelectionSet',
101
+ selections: [],
102
+ },
103
+ };
104
+ }
105
+ const newVisitedNodes = new Set(visitedNodes);
106
+ newVisitedNodes.add(dependencyKey);
107
+ return addFragmentsFromDirectives(entityField.dependencies?.definitions[0], entities, newVisitedNodes);
108
+ };
109
+ const firstPass = (0, graphql_1.visit)(query, {
110
+ Field(node) {
111
+ if (!nodeHasComputedDirectives(node)) {
112
+ return undefined;
113
+ }
114
+ return [node, addFragmentToNode(node)];
115
+ },
116
+ });
117
+ return (0, graphql_1.visit)(firstPass, {
118
+ SelectionSet(node) {
119
+ const selections = [...node.selections];
120
+ node.selections = flatten(selections);
121
+ return node;
122
+ },
123
+ });
124
+ }
125
+ //# sourceMappingURL=directive-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directive-utils.js","sourceRoot":"","sources":["../src/directive-utils.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './computed-exchange';
2
+ export * from './merge-entities';
3
+ export * from './create-entity';
4
+ export * from './create-modern-entity';
5
+ export * from './types';
6
+ export * from './async-computed';
package/lib/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./computed-exchange"), exports);
18
+ __exportStar(require("./merge-entities"), exports);
19
+ __exportStar(require("./create-entity"), exports);
20
+ __exportStar(require("./create-modern-entity"), exports);
21
+ __exportStar(require("./types"), exports);
22
+ __exportStar(require("./async-computed"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,mDAAiC;AACjC,kDAAgC;AAChC,yDAAuC;AACvC,0CAAwB;AACxB,mDAAiC"}
@@ -0,0 +1,2 @@
1
+ import { Entities, Entity } from './types';
2
+ export declare function mergeEntities(...entities: Array<Entity>): Entities;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.mergeEntities = mergeEntities;
7
+ const fclone_1 = __importDefault(require("fclone"));
8
+ function _mergeFields(target, source) {
9
+ const targetCopy = (0, fclone_1.default)(target);
10
+ targetCopy.fields = Object.keys(source.fields).reduce((memo, key) => {
11
+ if (Object.prototype.hasOwnProperty.call(memo, key)) {
12
+ throw new Error(`Duplicated key "${key}" found when merging entities of type "${target.typeName}"`);
13
+ }
14
+ return { ...memo, [key]: source.fields[key] };
15
+ }, targetCopy.fields);
16
+ return targetCopy;
17
+ }
18
+ function mergeEntities(...entities) {
19
+ return entities.reduce((memo, entity) => {
20
+ const { typeName } = entity;
21
+ if (typeName == null) {
22
+ console.error('No typeName found for entity', entity);
23
+ throw new Error('No typeName found for entity');
24
+ }
25
+ const existingEntity = memo[typeName];
26
+ if (existingEntity == null) {
27
+ return { ...memo, [typeName]: entity };
28
+ }
29
+ return {
30
+ ...memo,
31
+ [typeName]: _mergeFields(existingEntity, entity),
32
+ };
33
+ }, {});
34
+ }
35
+ //# sourceMappingURL=merge-entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-entities.js","sourceRoot":"","sources":["../src/merge-entities.ts"],"names":[],"mappings":";;;;;AAoBA,sCAoBC;AAxCD,oDAA4B;AAI5B,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc;IAClD,MAAM,UAAU,GAAG,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC;IAElC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAClE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,0CAA0C,MAAM,CAAC,QAAQ,GAAG,CACnF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAChD,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAgB,aAAa,CAAC,GAAG,QAAuB;IACtD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAE5B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACzC,CAAC;QAED,OAAO;YACL,GAAG,IAAI;YACP,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC;SACjD,CAAC;IACJ,CAAC,EAAE,EAAc,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { AugmentedOperation, Entities } from './types';
2
+ export declare function resolveData(data: any, operation: AugmentedOperation, entities: Entities): any;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveData = resolveData;
7
+ const graphql_1 = require("graphql");
8
+ const graphql_anywhere_1 = __importDefault(require("graphql-anywhere"));
9
+ const directive_utils_1 = require("./directive-utils");
10
+ const set_utils_1 = require("./set-utils");
11
+ const types_1 = require("./types");
12
+ function _listDocumentComputedDirectives(doc) {
13
+ if (doc == null) {
14
+ return [];
15
+ }
16
+ const computedDirectives = new Set();
17
+ (0, graphql_1.visit)(doc, {
18
+ Field(node) {
19
+ if ((0, directive_utils_1.nodeHasComputedDirectives)(node)) {
20
+ const computedDirective = node.directives?.find((d) => d.name.value === 'computed');
21
+ const directiveType = (0, directive_utils_1.getDirectiveType)(computedDirective);
22
+ computedDirectives.add(`${directiveType}:${node.name.value}`);
23
+ }
24
+ },
25
+ });
26
+ return [...computedDirectives];
27
+ }
28
+ function _documentHasComputedDirectives(doc) {
29
+ return _listDocumentComputedDirectives(doc).length > 0;
30
+ }
31
+ function _buildDependencyGraph(entities) {
32
+ const graph = new Map();
33
+ for (const [typeName, entity] of Object.entries(entities)) {
34
+ if (!entity)
35
+ continue;
36
+ for (const [fieldName, field] of Object.entries(entity.fields)) {
37
+ const resolverId = `${typeName}:${fieldName}`;
38
+ const dependencies = _listDocumentComputedDirectives(field.dependencies);
39
+ graph.set(resolverId, new Set(dependencies));
40
+ }
41
+ }
42
+ return graph;
43
+ }
44
+ function _detectCircularDependencies(graph) {
45
+ const visited = new Set();
46
+ const recursionStack = new Set();
47
+ const cycles = [];
48
+ function dfs(node, path) {
49
+ if (recursionStack.has(node)) {
50
+ const cycleStart = path.indexOf(node);
51
+ const cycle = path.slice(cycleStart).concat(node);
52
+ cycles.push(cycle.join(' -> '));
53
+ return;
54
+ }
55
+ if (visited.has(node)) {
56
+ return;
57
+ }
58
+ visited.add(node);
59
+ recursionStack.add(node);
60
+ path.push(node);
61
+ const dependencies = graph.get(node) || new Set();
62
+ for (const dep of dependencies) {
63
+ dfs(dep, [...path]);
64
+ }
65
+ recursionStack.delete(node);
66
+ path.pop();
67
+ }
68
+ for (const node of graph.keys()) {
69
+ if (!visited.has(node)) {
70
+ dfs(node, []);
71
+ }
72
+ }
73
+ return cycles;
74
+ }
75
+ function resolveData(data, operation, entities) {
76
+ const { mixedQuery, originalQuery } = operation;
77
+ const dependencyGraph = _buildDependencyGraph(entities);
78
+ const cycles = _detectCircularDependencies(dependencyGraph);
79
+ if (cycles.length > 0) {
80
+ throw new types_1.CircularDependencyError(`Circular dependencies detected in computed properties:\n${cycles.map(cycle => ` - ${cycle}`).join('\n')}\n\nPlease review your entity definitions to remove circular references.`);
81
+ }
82
+ let pendingResolvers = new Set();
83
+ let resolvedResolvers = new Set();
84
+ const resolver = (fieldName, _root, _, __, info) => {
85
+ const root = _root == null ? {} : _root;
86
+ const { resultKey } = info;
87
+ const { __typename: typeName } = root;
88
+ const aliasValue = root[resultKey];
89
+ const nonAliasValue = root[fieldName];
90
+ const isAliasedField = aliasValue !== nonAliasValue;
91
+ if (aliasValue !== undefined || nonAliasValue !== undefined) {
92
+ return aliasValue || nonAliasValue;
93
+ }
94
+ const shouldUseEntity = entities[typeName]?.fields[fieldName] != null;
95
+ if (!shouldUseEntity) {
96
+ return isAliasedField ? aliasValue : nonAliasValue;
97
+ }
98
+ const { resolver, dependencies } = entities[typeName].fields[fieldName];
99
+ const resolverId = `${typeName}:${fieldName}`;
100
+ if (!_documentHasComputedDirectives(dependencies)) {
101
+ resolvedResolvers.add(resolverId);
102
+ try {
103
+ return resolver(root);
104
+ }
105
+ catch (error) {
106
+ console.warn(`Resolver for ${resolverId} failed:`, error);
107
+ return undefined;
108
+ }
109
+ }
110
+ const dependentResolvers = _listDocumentComputedDirectives(dependencies);
111
+ if (dependentResolvers.some((d) => !resolvedResolvers.has(d))) {
112
+ pendingResolvers.add(resolverId);
113
+ return undefined;
114
+ }
115
+ else {
116
+ resolvedResolvers.add(resolverId);
117
+ try {
118
+ return resolver(root);
119
+ }
120
+ catch (error) {
121
+ console.warn(`Resolver for ${resolverId} failed:`, error);
122
+ return undefined;
123
+ }
124
+ }
125
+ };
126
+ let resolvedData = (0, graphql_anywhere_1.default)(resolver, mixedQuery, data);
127
+ let prevPendingResolvers = new Set();
128
+ let prevResolvedResolvers = new Set();
129
+ let iterationCount = 0;
130
+ const maxIterations = 100;
131
+ while (pendingResolvers.size > 0 && iterationCount < maxIterations) {
132
+ iterationCount++;
133
+ prevResolvedResolvers = resolvedResolvers;
134
+ resolvedData = (0, graphql_anywhere_1.default)(resolver, mixedQuery, resolvedData);
135
+ prevPendingResolvers = pendingResolvers;
136
+ pendingResolvers = (0, set_utils_1.difference)(pendingResolvers, resolvedResolvers);
137
+ if ((0, set_utils_1.isEqual)(prevResolvedResolvers, resolvedResolvers) &&
138
+ (0, set_utils_1.isEqual)(prevPendingResolvers, pendingResolvers)) {
139
+ const pendingList = Array.from(pendingResolvers).join(', ');
140
+ const resolvedList = Array.from(resolvedResolvers).join(', ');
141
+ throw new types_1.CircularDependencyError(`Irresoluble dependency chain detected.\n` +
142
+ `Pending resolvers: ${pendingList}\n` +
143
+ `Resolved resolvers: ${resolvedList}\n` +
144
+ `This usually indicates a circular dependency or missing computed property definition.`);
145
+ }
146
+ }
147
+ if (iterationCount >= maxIterations) {
148
+ throw new types_1.MaxIterationsError(maxIterations);
149
+ }
150
+ return (0, graphql_anywhere_1.default)(resolver, originalQuery, resolvedData);
151
+ }
152
+ //# sourceMappingURL=resolve-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-data.js","sourceRoot":"","sources":["../src/resolve-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function union<T = any>(setA: Set<T>, setB: Set<T>): Set<T>;
2
+ export declare function difference<T = any>(setA: Set<T>, setB: Set<T>): Set<T>;
3
+ export declare function symmetricDifference<T = any>(setA: Set<T>, setB: Set<T>): Set<T>;
4
+ export declare function intersection<T = any>(setA: Set<T>, setB: Set<T>): Set<T>;
5
+ export declare function isEqual<T = any>(setA: Set<T>, setB: Set<T>): boolean;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.union = union;
4
+ exports.difference = difference;
5
+ exports.symmetricDifference = symmetricDifference;
6
+ exports.intersection = intersection;
7
+ exports.isEqual = isEqual;
8
+ function union(setA, setB) {
9
+ return new Set([...setA, ...setB]);
10
+ }
11
+ function difference(setA, setB) {
12
+ return new Set([...setA].filter((v) => !setB.has(v)));
13
+ }
14
+ function symmetricDifference(setA, setB) {
15
+ const firstHalf = new Set([...setA].filter((v) => !setB.has(v)));
16
+ const secondHalf = new Set([...setB].filter((v) => !setA.has(v)));
17
+ return union(firstHalf, secondHalf);
18
+ }
19
+ function intersection(setA, setB) {
20
+ const firstHalf = new Set([...setA].filter((v) => setB.has(v)));
21
+ const secondHalf = new Set([...setB].filter((v) => setA.has(v)));
22
+ return union(firstHalf, secondHalf);
23
+ }
24
+ function isEqual(setA, setB) {
25
+ return symmetricDifference(setA, setB).size === 0;
26
+ }
27
+ //# sourceMappingURL=set-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-utils.js","sourceRoot":"","sources":["../src/set-utils.ts"],"names":[],"mappings":";;AAAA,sBAEC;AAED,gCAEC;AAED,kDAIC;AAED,oCAIC;AAED,0BAEC;AAtBD,SAAgB,KAAK,CAAU,IAAY,EAAE,IAAY;IACvD,OAAO,IAAI,GAAG,CAAI,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,UAAU,CAAU,IAAY,EAAE,IAAY;IAC5D,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,mBAAmB,CAAU,IAAY,EAAE,IAAY;IACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,YAAY,CAAU,IAAY,EAAE,IAAY;IAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,OAAO,CAAU,IAAY,EAAE,IAAY;IACzD,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;AACpD,CAAC"}