@auto-engineer/frontend-generator-react-graphql 0.8.13 → 0.9.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @auto-engineer/frontend-react-graphql-generator
2
2
 
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - add a new experience slice type
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @auto-engineer/ai-gateway@0.9.0
13
+ - @auto-engineer/message-bus@0.9.0
14
+
15
+ ## 0.8.14
16
+
17
+ ### Patch Changes
18
+
19
+ - Update flow to not require slice
20
+ - Updated dependencies
21
+ - @auto-engineer/ai-gateway@0.8.14
22
+ - @auto-engineer/message-bus@0.8.14
23
+
3
24
  ## 0.8.13
4
25
 
5
26
  ### Patch Changes
@@ -1,3 +1,10 @@
1
1
  import { IAScheme } from './types';
2
+ interface GqlOperation {
3
+ operationType: 'query' | 'mutation';
4
+ operationName: string;
5
+ raw: string;
6
+ }
7
+ export declare function mergeGraphQLQueries(operations: GqlOperation[]): GqlOperation[];
2
8
  export declare function writeGqlOperationsToFolder(iaScheme: IAScheme, outputDir: string): void;
9
+ export {};
3
10
  //# sourceMappingURL=scaffold-gql-operations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-gql-operations.d.ts","sourceRoot":"","sources":["../../src/scaffold-gql-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAgFnC,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAyB/E"}
1
+ {"version":3,"file":"scaffold-gql-operations.d.ts","sourceRoot":"","sources":["../../src/scaffold-gql-operations.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,UAAU,YAAY;IACpB,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAyID,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CA8D9E;AAWD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAiB/E"}
@@ -1,5 +1,6 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+ import { parse, print, Kind } from 'graphql';
3
4
  function extractOperationName(gql) {
4
5
  const match = gql.match(/(query|mutation)\s+(\w+)/);
5
6
  return match ? match[2] : 'UnknownOperation';
@@ -16,10 +17,10 @@ function isValidDataRequirement(req) {
16
17
  typeof req.details.gql === 'string');
17
18
  }
18
19
  function processDataRequirements(record, operations) {
19
- const dataReqs = record['data_requirements'];
20
- if (!Array.isArray(dataReqs))
20
+ const dataRequirements = record['data_requirements'];
21
+ if (!Array.isArray(dataRequirements))
21
22
  return;
22
- for (const req of dataReqs) {
23
+ for (const req of dataRequirements) {
23
24
  if (isValidDataRequirement(req)) {
24
25
  operations.push({
25
26
  operationType: req.type,
@@ -47,6 +48,121 @@ function extractGqlOperationsFromIAScheme(schema) {
47
48
  walk(schema, operations);
48
49
  return operations;
49
50
  }
51
+ function getFieldKey(selection) {
52
+ return selection.alias?.value ?? selection.name.value;
53
+ }
54
+ function processFieldSelection(fieldMap, selection) {
55
+ const key = getFieldKey(selection);
56
+ const existing = fieldMap.get(key);
57
+ if (existing !== undefined && existing.selectionSet !== undefined && selection.selectionSet !== undefined) {
58
+ // Merge nested selection sets
59
+ const mergedSelectionSet = mergeSelectionSets(existing.selectionSet, selection.selectionSet);
60
+ fieldMap.set(key, {
61
+ ...existing,
62
+ selectionSet: mergedSelectionSet,
63
+ });
64
+ }
65
+ else if (existing === undefined) {
66
+ // Add new field
67
+ fieldMap.set(key, selection);
68
+ }
69
+ }
70
+ function mergeSelectionSets(selectionSet1, selectionSet2) {
71
+ const fieldMap = new Map();
72
+ // Process first selection set
73
+ for (const selection of selectionSet1.selections) {
74
+ if (selection.kind === 'Field') {
75
+ const key = getFieldKey(selection);
76
+ fieldMap.set(key, selection);
77
+ }
78
+ }
79
+ // Process second selection set, merging nested selections
80
+ for (const selection of selectionSet2.selections) {
81
+ if (selection.kind === 'Field') {
82
+ processFieldSelection(fieldMap, selection);
83
+ }
84
+ }
85
+ return {
86
+ kind: Kind.SELECTION_SET,
87
+ selections: Array.from(fieldMap.values()),
88
+ };
89
+ }
90
+ function mergeOperations(operation1, operation2) {
91
+ const selectionSet1 = operation1.selectionSet;
92
+ const selectionSet2 = operation2.selectionSet;
93
+ if (selectionSet1 === undefined || selectionSet2 === undefined) {
94
+ throw new Error('Operations must have selection sets');
95
+ }
96
+ const mergedSelectionSet = mergeSelectionSets(selectionSet1, selectionSet2);
97
+ return {
98
+ ...operation1,
99
+ selectionSet: mergedSelectionSet,
100
+ };
101
+ }
102
+ function getOperationSignature(operation) {
103
+ const name = operation.name?.value ?? 'Anonymous';
104
+ const variables = operation.variableDefinitions
105
+ ? operation.variableDefinitions.map((v) => `${v.variable.name.value}: ${print(v.type)}`).join(', ')
106
+ : '';
107
+ return `${operation.operation}:${name}:(${variables})`;
108
+ }
109
+ export function mergeGraphQLQueries(operations) {
110
+ const operationGroups = new Map();
111
+ // Group operations by signature (operation type, name, and variables)
112
+ for (const op of operations) {
113
+ try {
114
+ const document = parse(op.raw);
115
+ const operation = document.definitions[0];
116
+ const signature = getOperationSignature(operation);
117
+ if (!operationGroups.has(signature)) {
118
+ operationGroups.set(signature, []);
119
+ }
120
+ operationGroups.get(signature).push(op);
121
+ }
122
+ catch {
123
+ // If parsing fails, keep the original operation
124
+ const fallbackSignature = `${op.operationType}:${op.operationName}:fallback:${Math.random()}`;
125
+ operationGroups.set(fallbackSignature, [op]);
126
+ }
127
+ }
128
+ const mergedOperations = [];
129
+ // Merge operations within each group
130
+ for (const [, group] of operationGroups) {
131
+ if (group.length === 1) {
132
+ mergedOperations.push(group[0]);
133
+ }
134
+ else {
135
+ try {
136
+ // Parse all operations in the group
137
+ const parsedOperations = group.map((op) => {
138
+ const document = parse(op.raw);
139
+ return document.definitions[0];
140
+ });
141
+ // Merge all operations in the group
142
+ let mergedOperation = parsedOperations[0];
143
+ for (let i = 1; i < parsedOperations.length; i++) {
144
+ mergedOperation = mergeOperations(mergedOperation, parsedOperations[i]);
145
+ }
146
+ // Create the merged document and print it
147
+ const mergedDocument = {
148
+ kind: Kind.DOCUMENT,
149
+ definitions: [mergedOperation],
150
+ };
151
+ const mergedRaw = print(mergedDocument);
152
+ mergedOperations.push({
153
+ operationType: group[0].operationType,
154
+ operationName: group[0].operationName,
155
+ raw: mergedRaw,
156
+ });
157
+ }
158
+ catch {
159
+ // If merging fails, keep the first operation from the group
160
+ mergedOperations.push(group[0]);
161
+ }
162
+ }
163
+ }
164
+ return mergedOperations;
165
+ }
50
166
  function buildFileContent(operations) {
51
167
  const header = `import { graphql } from '../gql';\n`;
52
168
  const entries = operations.map((op) => {
@@ -56,17 +172,10 @@ function buildFileContent(operations) {
56
172
  }
57
173
  export function writeGqlOperationsToFolder(iaScheme, outputDir) {
58
174
  const allOperations = extractGqlOperationsFromIAScheme(iaScheme);
59
- const uniqueSet = new Set();
60
- const uniqueOperations = [];
61
- for (const op of allOperations) {
62
- const key = `${op.operationType}:${op.operationName}:${op.raw}`;
63
- if (!uniqueSet.has(key)) {
64
- uniqueOperations.push(op);
65
- uniqueSet.add(key);
66
- }
67
- }
68
- const queries = uniqueOperations.filter((op) => op.operationType === 'query');
69
- const mutations = uniqueOperations.filter((op) => op.operationType === 'mutation');
175
+ // Use the new intelligent merging instead of simple deduplication
176
+ const mergedOperations = mergeGraphQLQueries(allOperations);
177
+ const queries = mergedOperations.filter((op) => op.operationType === 'query');
178
+ const mutations = mergedOperations.filter((op) => op.operationType === 'mutation');
70
179
  const graphqlDir = path.join(outputDir, 'graphql');
71
180
  fs.mkdirSync(graphqlDir, { recursive: true });
72
181
  const queriesPath = path.join(graphqlDir, 'queries.ts');
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-gql-operations.js","sourceRoot":"","sources":["../../src/scaffold-gql-operations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold-gql-operations.js","sourceRoot":"","sources":["../../src/scaffold-gql-operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAsE,IAAI,EAAE,MAAM,SAAS,CAAC;AAgBjH,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAC/C,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACb,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;QACjD,SAAS,IAAI,GAAG;QAChB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,GAAG,CAAC,OAAO,KAAK,IAAI;QACpB,KAAK,IAAI,GAAG,CAAC,OAAO;QACpB,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,QAAQ,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA+B,EAAE,UAA0B;IAC1F,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAAE,OAAO;IAE7C,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC;gBACd,aAAa,EAAE,GAAG,CAAC,IAAI;gBACvB,aAAa,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAQ,CAAC,GAAI,CAAC;gBACtD,GAAG,EAAE,GAAG,CAAC,OAAQ,CAAC,GAAI,CAAC,IAAI,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,GAAY,EAAE,UAA0B;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO;IAEpD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,gCAAgC,CAAC,MAAgB;IACxD,MAAM,UAAU,GAAmB,EAAE,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,SAAoB;IACvC,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACxD,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgC,EAAE,SAAoB;IACnF,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1G,8BAA8B;QAC9B,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;QAC7F,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;YAChB,GAAG,QAAQ;YACX,YAAY,EAAE,kBAAkB;SACjC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,gBAAgB;QAChB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,aAA+B,EAAE,aAA+B;IAC1F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE9C,8BAA8B;IAC9B,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,aAAa;QACxB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,UAAmC,EACnC,UAAmC;IAEnC,MAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC;IAC9C,MAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC;IAE9C,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAE5E,OAAO;QACL,GAAG,UAAU;QACb,YAAY,EAAE,kBAAkB;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAkC;IAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,IAAI,WAAW,CAAC;IAClD,MAAM,SAAS,GAAG,SAAS,CAAC,mBAAmB;QAC7C,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACnG,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,SAAS,CAAC,SAAS,IAAI,IAAI,KAAK,SAAS,GAAG,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAA0B;IAC5D,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE1D,sEAAsE;IACtE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAA4B,CAAC;YACrE,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAEnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,aAAa,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9F,eAAe,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAmB,EAAE,CAAC;IAE5C,qCAAqC;IACrC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,oCAAoC;gBACpC,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;oBACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC/B,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,CAA4B,CAAC;gBAC5D,CAAC,CAAC,CAAC;gBAEH,oCAAoC;gBACpC,IAAI,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjD,eAAe,GAAG,eAAe,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBAED,0CAA0C;gBAC1C,MAAM,cAAc,GAAiB;oBACnC,IAAI,EAAE,IAAI,CAAC,QAAQ;oBACnB,WAAW,EAAE,CAAC,eAAe,CAAC;iBAC/B,CAAC;gBAEF,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;gBAExC,gBAAgB,CAAC,IAAI,CAAC;oBACpB,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa;oBACrC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa;oBACrC,GAAG,EAAE,SAAS;iBACf,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;gBAC5D,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,UAA0B;IAClD,MAAM,MAAM,GAAG,qCAAqC,CAAC;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACpC,OAAO,kBAAkB,EAAE,CAAC,aAAa,kBAAkB,EAAE,CAAC,GAAG,QAAQ,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAkB,EAAE,SAAiB;IAC9E,MAAM,aAAa,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;IAEjE,kEAAkE;IAClE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,KAAK,OAAO,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC;IAEnF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE5D,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scaffold-gql-operations.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-gql-operations.specs.d.ts","sourceRoot":"","sources":["../../src/scaffold-gql-operations.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,195 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import { mergeGraphQLQueries } from './scaffold-gql-operations.js';
3
+ describe('GraphQL Query Field Merging', () => {
4
+ test('should merge identical queries with different field selections', () => {
5
+ const query1 = `
6
+ query QuestionnaireProgress($participantId: ID!) {
7
+ questionnaireProgress(participantId: $participantId) {
8
+ questionnaireId
9
+ status
10
+ answers {
11
+ questionId
12
+ value
13
+ }
14
+ }
15
+ }
16
+ `;
17
+ const query2 = `
18
+ query QuestionnaireProgress($participantId: ID!) {
19
+ questionnaireProgress(participantId: $participantId) {
20
+ questionnaireId
21
+ participantId
22
+ status
23
+ currentQuestionId
24
+ }
25
+ }
26
+ `;
27
+ const operations = [
28
+ {
29
+ operationType: 'query',
30
+ operationName: 'QuestionnaireProgress',
31
+ raw: query1.trim(),
32
+ },
33
+ {
34
+ operationType: 'query',
35
+ operationName: 'QuestionnaireProgress',
36
+ raw: query2.trim(),
37
+ },
38
+ ];
39
+ const merged = mergeGraphQLQueries(operations);
40
+ expect(merged).toHaveLength(1);
41
+ expect(merged[0].operationName).toBe('QuestionnaireProgress');
42
+ // Check that all fields from both queries are present
43
+ const mergedQuery = merged[0].raw;
44
+ expect(mergedQuery).toContain('questionnaireId');
45
+ expect(mergedQuery).toContain('participantId');
46
+ expect(mergedQuery).toContain('status');
47
+ expect(mergedQuery).toContain('currentQuestionId');
48
+ expect(mergedQuery).toContain('answers {');
49
+ expect(mergedQuery).toContain('questionId');
50
+ expect(mergedQuery).toContain('value');
51
+ });
52
+ test('should handle nested field merging correctly', () => {
53
+ const query1 = `
54
+ query UserProfile($id: ID!) {
55
+ user(id: $id) {
56
+ id
57
+ profile {
58
+ name
59
+ email
60
+ }
61
+ }
62
+ }
63
+ `;
64
+ const query2 = `
65
+ query UserProfile($id: ID!) {
66
+ user(id: $id) {
67
+ id
68
+ username
69
+ profile {
70
+ avatar
71
+ bio
72
+ }
73
+ }
74
+ }
75
+ `;
76
+ const operations = [
77
+ {
78
+ operationType: 'query',
79
+ operationName: 'UserProfile',
80
+ raw: query1.trim(),
81
+ },
82
+ {
83
+ operationType: 'query',
84
+ operationName: 'UserProfile',
85
+ raw: query2.trim(),
86
+ },
87
+ ];
88
+ const merged = mergeGraphQLQueries(operations);
89
+ expect(merged).toHaveLength(1);
90
+ const mergedQuery = merged[0].raw;
91
+ expect(mergedQuery).toContain('id');
92
+ expect(mergedQuery).toContain('username');
93
+ expect(mergedQuery).toContain('profile {');
94
+ expect(mergedQuery).toContain('name');
95
+ expect(mergedQuery).toContain('email');
96
+ expect(mergedQuery).toContain('avatar');
97
+ expect(mergedQuery).toContain('bio');
98
+ });
99
+ test('should not merge queries with different operation names', () => {
100
+ const query1 = `
101
+ query QuestionnaireProgress($participantId: ID!) {
102
+ questionnaireProgress(participantId: $participantId) {
103
+ questionnaireId
104
+ }
105
+ }
106
+ `;
107
+ const query2 = `
108
+ query UserProfile($id: ID!) {
109
+ user(id: $id) {
110
+ id
111
+ }
112
+ }
113
+ `;
114
+ const operations = [
115
+ {
116
+ operationType: 'query',
117
+ operationName: 'QuestionnaireProgress',
118
+ raw: query1.trim(),
119
+ },
120
+ {
121
+ operationType: 'query',
122
+ operationName: 'UserProfile',
123
+ raw: query2.trim(),
124
+ },
125
+ ];
126
+ const merged = mergeGraphQLQueries(operations);
127
+ expect(merged).toHaveLength(2);
128
+ expect(merged.map((op) => op.operationName)).toContain('QuestionnaireProgress');
129
+ expect(merged.map((op) => op.operationName)).toContain('UserProfile');
130
+ });
131
+ test('should not merge queries with different variables', () => {
132
+ const query1 = `
133
+ query QuestionnaireProgress($participantId: ID!) {
134
+ questionnaireProgress(participantId: $participantId) {
135
+ questionnaireId
136
+ }
137
+ }
138
+ `;
139
+ const query2 = `
140
+ query QuestionnaireProgress($userId: ID!) {
141
+ questionnaireProgress(participantId: $userId) {
142
+ questionnaireId
143
+ }
144
+ }
145
+ `;
146
+ const operations = [
147
+ {
148
+ operationType: 'query',
149
+ operationName: 'QuestionnaireProgress',
150
+ raw: query1.trim(),
151
+ },
152
+ {
153
+ operationType: 'query',
154
+ operationName: 'QuestionnaireProgress',
155
+ raw: query2.trim(),
156
+ },
157
+ ];
158
+ const merged = mergeGraphQLQueries(operations);
159
+ // Should not merge since variables are different
160
+ expect(merged).toHaveLength(2);
161
+ });
162
+ test('should handle mutations separately from queries', () => {
163
+ const query = `
164
+ query GetUser($id: ID!) {
165
+ user(id: $id) {
166
+ id
167
+ }
168
+ }
169
+ `;
170
+ const mutation = `
171
+ mutation CreateUser($input: CreateUserInput!) {
172
+ createUser(input: $input) {
173
+ id
174
+ }
175
+ }
176
+ `;
177
+ const operations = [
178
+ {
179
+ operationType: 'query',
180
+ operationName: 'GetUser',
181
+ raw: query.trim(),
182
+ },
183
+ {
184
+ operationType: 'mutation',
185
+ operationName: 'CreateUser',
186
+ raw: mutation.trim(),
187
+ },
188
+ ];
189
+ const merged = mergeGraphQLQueries(operations);
190
+ expect(merged).toHaveLength(2);
191
+ expect(merged.find((op) => op.operationType === 'query')).toBeDefined();
192
+ expect(merged.find((op) => op.operationType === 'mutation')).toBeDefined();
193
+ });
194
+ });
195
+ //# sourceMappingURL=scaffold-gql-operations.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-gql-operations.specs.js","sourceRoot":"","sources":["../../src/scaffold-gql-operations.specs.ts"],"names":[],"mappings":"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"}