@graphitation/apollo-react-relay-duct-tape-compiler 1.5.6 → 1.6.1

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 (29) hide show
  1. package/CHANGELOG.md +20 -2
  2. package/lib/relayCompilerLanguagePlugin.d.ts.map +1 -1
  3. package/lib/relayCompilerLanguagePlugin.js +7 -6
  4. package/lib/relayCompilerLanguagePlugin.js.map +3 -3
  5. package/lib/relayCompilerLanguagePlugin.mjs +7 -6
  6. package/lib/relayCompilerLanguagePlugin.mjs.map +2 -2
  7. package/lib/typescriptTransforms/TypeScriptGenerator.d.ts +8 -0
  8. package/lib/typescriptTransforms/TypeScriptGenerator.d.ts.map +1 -0
  9. package/lib/typescriptTransforms/TypeScriptGenerator.js +925 -0
  10. package/lib/typescriptTransforms/TypeScriptGenerator.js.map +7 -0
  11. package/lib/typescriptTransforms/TypeScriptGenerator.mjs +904 -0
  12. package/lib/typescriptTransforms/TypeScriptGenerator.mjs.map +7 -0
  13. package/lib/typescriptTransforms/TypeScriptTypeTransformers.d.ts +28 -0
  14. package/lib/typescriptTransforms/TypeScriptTypeTransformers.d.ts.map +1 -0
  15. package/lib/typescriptTransforms/TypeScriptTypeTransformers.js +163 -0
  16. package/lib/typescriptTransforms/TypeScriptTypeTransformers.js.map +7 -0
  17. package/lib/typescriptTransforms/TypeScriptTypeTransformers.mjs +134 -0
  18. package/lib/typescriptTransforms/TypeScriptTypeTransformers.mjs.map +7 -0
  19. package/lib/typescriptTransforms/addAnyTypeCast.d.ts +6 -0
  20. package/lib/typescriptTransforms/addAnyTypeCast.d.ts.map +1 -0
  21. package/lib/typescriptTransforms/addAnyTypeCast.js +62 -0
  22. package/lib/typescriptTransforms/addAnyTypeCast.js.map +7 -0
  23. package/lib/typescriptTransforms/addAnyTypeCast.mjs +33 -0
  24. package/lib/typescriptTransforms/addAnyTypeCast.mjs.map +7 -0
  25. package/lib/typescriptTransforms/ambient.d.js +1 -0
  26. package/lib/typescriptTransforms/ambient.d.js.map +7 -0
  27. package/lib/typescriptTransforms/ambient.d.mjs +0 -0
  28. package/lib/typescriptTransforms/ambient.d.mjs.map +7 -0
  29. package/package.json +4 -5
@@ -0,0 +1,904 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src/typescriptTransforms/TypeScriptGenerator.ts
22
+ import {
23
+ IRVisitor
24
+ } from "relay-compiler";
25
+ import * as FlattenTransform from "relay-compiler/lib/transforms/FlattenTransform";
26
+ import * as MaskTransform from "relay-compiler/lib/transforms/MaskTransform";
27
+ import * as MatchTransform from "relay-compiler/lib/transforms/MatchTransform";
28
+ import * as RefetchableFragmentTransform from "relay-compiler/lib/transforms/RefetchableFragmentTransform";
29
+ import * as RelayDirectiveTransform from "relay-compiler/lib/transforms/RelayDirectiveTransform";
30
+ import * as ts from "typescript";
31
+ import {
32
+ transformInputType,
33
+ transformScalarType
34
+ } from "./TypeScriptTypeTransformers.mjs";
35
+ var REF_TYPE = " $refType";
36
+ var FRAGMENT_REFS = " $fragmentRefs";
37
+ var DATA_REF = " $data";
38
+ var FRAGMENT_REFS_TYPE_NAME = "FragmentRefs";
39
+ var DIRECTIVE_NAME = "raw_response_type";
40
+ var generate = (schema, node, options) => {
41
+ const ast = aggregateRuntimeImports(
42
+ IRVisitor.visit(node, createVisitor(schema, options))
43
+ );
44
+ const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
45
+ const resultFile = ts.createSourceFile(
46
+ "graphql-def.ts",
47
+ "",
48
+ ts.ScriptTarget.Latest,
49
+ false,
50
+ ts.ScriptKind.TS
51
+ );
52
+ const fullProgramAst = ts.factory.updateSourceFile(resultFile, ast);
53
+ return printer.printNode(ts.EmitHint.SourceFile, fullProgramAst, resultFile);
54
+ };
55
+ function aggregateRuntimeImports(ast) {
56
+ const importNodes = ast.filter(
57
+ (declaration) => ts.isImportDeclaration(declaration)
58
+ );
59
+ const runtimeImports = importNodes.filter(
60
+ (importDeclaration) => importDeclaration.moduleSpecifier.text === "relay-runtime"
61
+ );
62
+ if (runtimeImports.length > 1) {
63
+ const namedImports = [];
64
+ runtimeImports.map((node) => {
65
+ node.importClause.namedBindings.elements.map(
66
+ (element) => {
67
+ namedImports.push(element.name.text);
68
+ }
69
+ );
70
+ });
71
+ const importSpecifiers = [];
72
+ namedImports.map((namedImport) => {
73
+ const specifier = ts.factory.createImportSpecifier(
74
+ false,
75
+ void 0,
76
+ ts.factory.createIdentifier(namedImport)
77
+ );
78
+ importSpecifiers.push(specifier);
79
+ });
80
+ const namedBindings = ts.factory.createNamedImports(importSpecifiers);
81
+ const aggregatedRuntimeImportDeclaration = ts.factory.createImportDeclaration(
82
+ void 0,
83
+ ts.factory.createImportClause(false, void 0, namedBindings),
84
+ ts.factory.createStringLiteral("relay-runtime")
85
+ );
86
+ const aggregatedRuntimeImportAST = ast.reduce(
87
+ (prev, curr) => {
88
+ if (!ts.isImportDeclaration(curr))
89
+ prev.push(curr);
90
+ return prev;
91
+ },
92
+ [aggregatedRuntimeImportDeclaration]
93
+ );
94
+ return aggregatedRuntimeImportAST;
95
+ } else {
96
+ return ast;
97
+ }
98
+ }
99
+ function nullThrows(obj) {
100
+ if (obj == null) {
101
+ throw new Error("Obj is null");
102
+ }
103
+ return obj;
104
+ }
105
+ function makeProp(schema, selection, state, unmasked, concreteType) {
106
+ let { value } = selection;
107
+ const { key, schemaName, conditional, nodeType, nodeSelections } = selection;
108
+ if (schemaName === "__typename" && concreteType) {
109
+ value = ts.factory.createLiteralTypeNode(
110
+ ts.factory.createStringLiteral(concreteType)
111
+ );
112
+ } else if (nodeType) {
113
+ value = transformScalarType(
114
+ schema,
115
+ nodeType,
116
+ state,
117
+ selectionsToAST(
118
+ schema,
119
+ [Array.from(nullThrows(nodeSelections).values())],
120
+ state,
121
+ unmasked
122
+ )
123
+ );
124
+ }
125
+ const typeProperty = objectTypeProperty(key, value, {
126
+ optional: conditional
127
+ });
128
+ return typeProperty;
129
+ }
130
+ var isTypenameSelection = (selection) => selection.schemaName === "__typename";
131
+ var hasTypenameSelection = (selections) => selections.some(isTypenameSelection);
132
+ var onlySelectsTypename = (selections) => selections.every(isTypenameSelection);
133
+ function selectionsToAST(schema, selections, state, unmasked, fragmentTypeName) {
134
+ const baseFields = /* @__PURE__ */ new Map();
135
+ const byConcreteType = {};
136
+ flattenArray(selections).forEach((selection) => {
137
+ const { concreteType } = selection;
138
+ if (concreteType) {
139
+ byConcreteType[concreteType] = byConcreteType[concreteType] || [];
140
+ byConcreteType[concreteType].push(selection);
141
+ } else {
142
+ const previousSel = baseFields.get(selection.key);
143
+ baseFields.set(
144
+ selection.key,
145
+ previousSel ? mergeSelection(selection, previousSel) : selection
146
+ );
147
+ }
148
+ });
149
+ const types = [];
150
+ if (Object.keys(byConcreteType).length > 0 && onlySelectsTypename(Array.from(baseFields.values())) && (hasTypenameSelection(Array.from(baseFields.values())) || Object.keys(byConcreteType).every(
151
+ (type) => hasTypenameSelection(byConcreteType[type])
152
+ ))) {
153
+ const typenameAliases = /* @__PURE__ */ new Set();
154
+ for (const concreteType in byConcreteType) {
155
+ types.push(
156
+ groupRefs([
157
+ ...Array.from(baseFields.values()),
158
+ ...byConcreteType[concreteType]
159
+ ]).map((selection) => {
160
+ if (selection.schemaName === "__typename") {
161
+ typenameAliases.add(selection.key);
162
+ }
163
+ return makeProp(schema, selection, state, unmasked, concreteType);
164
+ })
165
+ );
166
+ }
167
+ types.push(
168
+ Array.from(typenameAliases).map((typenameAlias) => {
169
+ const otherProp = objectTypeProperty(
170
+ typenameAlias,
171
+ ts.factory.createLiteralTypeNode(
172
+ ts.factory.createStringLiteral("%other")
173
+ )
174
+ );
175
+ const otherPropWithComment = ts.addSyntheticLeadingComment(
176
+ otherProp,
177
+ ts.SyntaxKind.MultiLineCommentTrivia,
178
+ "This will never be '%other', but we need some\nvalue in case none of the concrete values match.",
179
+ true
180
+ );
181
+ return otherPropWithComment;
182
+ })
183
+ );
184
+ } else {
185
+ let selectionMap = selectionsToMap(Array.from(baseFields.values()));
186
+ for (const concreteType in byConcreteType) {
187
+ selectionMap = mergeSelections(
188
+ selectionMap,
189
+ selectionsToMap(
190
+ byConcreteType[concreteType].map((sel) => __spreadProps(__spreadValues({}, sel), {
191
+ conditional: true
192
+ }))
193
+ )
194
+ );
195
+ }
196
+ const selectionMapValues = groupRefs(Array.from(selectionMap.values())).map(
197
+ (sel) => isTypenameSelection(sel) && sel.concreteType ? makeProp(
198
+ schema,
199
+ __spreadProps(__spreadValues({}, sel), {
200
+ conditional: false
201
+ }),
202
+ state,
203
+ unmasked,
204
+ sel.concreteType
205
+ ) : makeProp(schema, sel, state, unmasked)
206
+ );
207
+ types.push(selectionMapValues);
208
+ }
209
+ const typeElements = types.map((props) => {
210
+ if (fragmentTypeName) {
211
+ props.push(
212
+ objectTypeProperty(
213
+ REF_TYPE,
214
+ ts.factory.createLiteralTypeNode(
215
+ ts.factory.createStringLiteral(fragmentTypeName)
216
+ )
217
+ )
218
+ );
219
+ }
220
+ return unmasked ? ts.factory.createTypeLiteralNode(props) : exactObjectTypeAnnotation(props);
221
+ });
222
+ if (typeElements.length === 1) {
223
+ return typeElements[0];
224
+ }
225
+ return ts.factory.createUnionTypeNode(typeElements);
226
+ }
227
+ function exactObjectTypeAnnotation(properties) {
228
+ return ts.factory.createTypeLiteralNode(properties);
229
+ }
230
+ var idRegex = /^[$a-zA-Z_][$a-z0-9A-Z_]*$/;
231
+ function createInexactOptionalType(type) {
232
+ if (ts.isUnionTypeNode(type)) {
233
+ return ts.factory.updateUnionTypeNode(
234
+ type,
235
+ ts.factory.createNodeArray([
236
+ ...type.types,
237
+ ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)
238
+ ])
239
+ );
240
+ } else {
241
+ return ts.factory.createUnionTypeNode([
242
+ type,
243
+ ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)
244
+ ]);
245
+ }
246
+ }
247
+ function objectTypeProperty(propertyName, type, options = {}) {
248
+ const { optional, readonly = true } = options;
249
+ const modifiers = readonly ? [ts.factory.createToken(ts.SyntaxKind.ReadonlyKeyword)] : void 0;
250
+ return ts.factory.createPropertySignature(
251
+ modifiers,
252
+ idRegex.test(propertyName) ? ts.factory.createIdentifier(propertyName) : ts.factory.createStringLiteral(propertyName),
253
+ optional ? ts.factory.createToken(ts.SyntaxKind.QuestionToken) : void 0,
254
+ optional ? createInexactOptionalType(type) : type
255
+ );
256
+ }
257
+ function mergeSelection(a, b, shouldSetConditional = true) {
258
+ if (!a) {
259
+ if (shouldSetConditional) {
260
+ return __spreadProps(__spreadValues({}, b), {
261
+ conditional: true
262
+ });
263
+ }
264
+ return b;
265
+ }
266
+ return __spreadProps(__spreadValues({}, a), {
267
+ nodeSelections: a.nodeSelections ? mergeSelections(
268
+ a.nodeSelections,
269
+ nullThrows(b.nodeSelections),
270
+ shouldSetConditional
271
+ ) : null,
272
+ conditional: a.conditional && b.conditional
273
+ });
274
+ }
275
+ function mergeSelections(a, b, shouldSetConditional = true) {
276
+ const merged = /* @__PURE__ */ new Map();
277
+ for (const [key, value] of Array.from(a.entries())) {
278
+ merged.set(key, value);
279
+ }
280
+ for (const [key, value] of Array.from(b.entries())) {
281
+ merged.set(key, mergeSelection(a.get(key), value, shouldSetConditional));
282
+ }
283
+ return merged;
284
+ }
285
+ function isPlural(node) {
286
+ return Boolean(node.metadata && node.metadata.plural);
287
+ }
288
+ function exportType(name, type) {
289
+ return ts.factory.createTypeAliasDeclaration(
290
+ [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
291
+ ts.factory.createIdentifier(name),
292
+ void 0,
293
+ type
294
+ );
295
+ }
296
+ function importTypes(names, fromModule) {
297
+ return names && ts.factory.createImportDeclaration(
298
+ void 0,
299
+ ts.factory.createImportClause(
300
+ false,
301
+ void 0,
302
+ ts.factory.createNamedImports(
303
+ names.map(
304
+ (name) => ts.factory.createImportSpecifier(
305
+ false,
306
+ void 0,
307
+ ts.factory.createIdentifier(name)
308
+ )
309
+ )
310
+ )
311
+ ),
312
+ ts.factory.createStringLiteral(fromModule)
313
+ );
314
+ }
315
+ function createVisitor(schema, options) {
316
+ const state = {
317
+ customScalars: options.customScalars,
318
+ enumsHasteModule: options.enumsHasteModule,
319
+ existingFragmentNames: options.existingFragmentNames,
320
+ generatedFragments: /* @__PURE__ */ new Set(),
321
+ generatedInputObjectTypes: {},
322
+ optionalInputFields: options.optionalInputFields,
323
+ usedEnums: {},
324
+ usedFragments: /* @__PURE__ */ new Set(),
325
+ useHaste: options.useHaste,
326
+ useSingleArtifactDirectory: options.useSingleArtifactDirectory,
327
+ noFutureProofEnums: options.noFutureProofEnums,
328
+ matchFields: /* @__PURE__ */ new Map(),
329
+ runtimeImports: /* @__PURE__ */ new Set()
330
+ };
331
+ return {
332
+ leave: {
333
+ Root(node) {
334
+ const inputVariablesType = generateInputVariablesType(
335
+ schema,
336
+ node,
337
+ state
338
+ );
339
+ const inputObjectTypes = generateInputObjectTypes(state);
340
+ const responseType = exportType(
341
+ `${node.name}Response`,
342
+ selectionsToAST(
343
+ schema,
344
+ /* $FlowFixMe: selections have already been transformed */
345
+ node.selections,
346
+ state,
347
+ false
348
+ )
349
+ );
350
+ const operationTypes = [
351
+ objectTypeProperty(
352
+ "response",
353
+ ts.factory.createTypeReferenceNode(responseType.name, void 0)
354
+ ),
355
+ objectTypeProperty(
356
+ "variables",
357
+ ts.factory.createTypeReferenceNode(
358
+ inputVariablesType.name,
359
+ void 0
360
+ )
361
+ )
362
+ ];
363
+ let rawResponseType;
364
+ const { normalizationIR } = options;
365
+ if (normalizationIR && node.directives.some((d) => d.name === DIRECTIVE_NAME)) {
366
+ rawResponseType = IRVisitor.visit(
367
+ normalizationIR,
368
+ createRawResponseTypeVisitor(schema, state)
369
+ );
370
+ }
371
+ const nodes = [];
372
+ if (state.runtimeImports.size) {
373
+ nodes.push(
374
+ importTypes(
375
+ Array.from(state.runtimeImports).sort(),
376
+ "relay-runtime"
377
+ )
378
+ );
379
+ }
380
+ nodes.push(
381
+ ...getFragmentRefsTypeImport(state),
382
+ ...getEnumDefinitions(schema, state),
383
+ ...inputObjectTypes,
384
+ inputVariablesType,
385
+ responseType
386
+ );
387
+ if (rawResponseType) {
388
+ for (const [key, ast] of state.matchFields) {
389
+ nodes.push(exportType(key, ast));
390
+ }
391
+ operationTypes.push(
392
+ objectTypeProperty(
393
+ "rawResponse",
394
+ ts.factory.createTypeReferenceNode(
395
+ `${node.name}RawResponse`,
396
+ void 0
397
+ )
398
+ )
399
+ );
400
+ nodes.push(rawResponseType);
401
+ }
402
+ nodes.push(
403
+ exportType(node.name, exactObjectTypeAnnotation(operationTypes))
404
+ );
405
+ return nodes;
406
+ },
407
+ Fragment(node) {
408
+ const flattenedSelections = flattenArray(
409
+ /* $FlowFixMe: selections have already been transformed */
410
+ node.selections
411
+ );
412
+ const numConcreteSelections = flattenedSelections.filter(
413
+ (s) => s.concreteType
414
+ ).length;
415
+ const selections = flattenedSelections.map((selection) => {
416
+ if (numConcreteSelections <= 1 && isTypenameSelection(selection) && !schema.isAbstractType(node.type)) {
417
+ return [
418
+ __spreadProps(__spreadValues({}, selection), {
419
+ concreteType: schema.getTypeString(node.type)
420
+ })
421
+ ];
422
+ }
423
+ return [selection];
424
+ });
425
+ state.generatedFragments.add(node.name);
426
+ const dataTypeName = getDataTypeName(node.name);
427
+ const dataType = ts.factory.createTypeReferenceNode(
428
+ node.name,
429
+ void 0
430
+ );
431
+ const refTypeName = getRefTypeName(node.name);
432
+ const refTypeDataProperty = objectTypeProperty(
433
+ DATA_REF,
434
+ ts.factory.createTypeReferenceNode(dataTypeName, void 0),
435
+ { optional: true }
436
+ );
437
+ const refTypeFragmentRefProperty = objectTypeProperty(
438
+ FRAGMENT_REFS,
439
+ ts.factory.createTypeReferenceNode(FRAGMENT_REFS_TYPE_NAME, [
440
+ ts.factory.createLiteralTypeNode(
441
+ ts.factory.createStringLiteral(node.name)
442
+ )
443
+ ])
444
+ );
445
+ const isPluralFragment = isPlural(node);
446
+ const refType = exactObjectTypeAnnotation([
447
+ refTypeDataProperty,
448
+ refTypeFragmentRefProperty
449
+ ]);
450
+ const unmasked = node.metadata != null && node.metadata.mask === false;
451
+ const baseType = selectionsToAST(
452
+ schema,
453
+ selections,
454
+ state,
455
+ unmasked,
456
+ unmasked ? void 0 : node.name
457
+ );
458
+ const type = isPlural(node) ? ts.factory.createTypeReferenceNode(
459
+ ts.factory.createIdentifier("ReadonlyArray"),
460
+ [baseType]
461
+ ) : baseType;
462
+ state.runtimeImports.add("FragmentRefs");
463
+ return [
464
+ importTypes(Array.from(state.runtimeImports).sort(), "relay-runtime"),
465
+ ...getEnumDefinitions(schema, state),
466
+ exportType(node.name, type),
467
+ exportType(dataTypeName, dataType),
468
+ exportType(
469
+ refTypeName,
470
+ isPluralFragment ? ts.factory.createTypeReferenceNode(
471
+ ts.factory.createIdentifier("ReadonlyArray"),
472
+ [refType]
473
+ ) : refType
474
+ )
475
+ ];
476
+ },
477
+ InlineFragment(node) {
478
+ return flattenArray(
479
+ /* $FlowFixMe: selections have already been transformed */
480
+ node.selections
481
+ ).map((typeSelection) => {
482
+ return schema.isAbstractType(node.typeCondition) ? __spreadProps(__spreadValues({}, typeSelection), {
483
+ conditional: true
484
+ }) : __spreadProps(__spreadValues({}, typeSelection), {
485
+ concreteType: schema.getTypeString(node.typeCondition)
486
+ });
487
+ });
488
+ },
489
+ Condition(node) {
490
+ return flattenArray(
491
+ /* $FlowFixMe: selections have already been transformed */
492
+ node.selections
493
+ ).map((selection) => {
494
+ return __spreadProps(__spreadValues({}, selection), {
495
+ conditional: true
496
+ });
497
+ });
498
+ },
499
+ // TODO: Why not inline it like others?
500
+ ScalarField(node) {
501
+ return visitScalarField(schema, node, state);
502
+ },
503
+ LinkedField: visitLinkedField,
504
+ ModuleImport(node) {
505
+ return [
506
+ {
507
+ key: "__fragmentPropName",
508
+ conditional: true,
509
+ value: transformScalarType(
510
+ schema,
511
+ schema.expectStringType(),
512
+ state
513
+ )
514
+ },
515
+ {
516
+ key: "__module_component",
517
+ conditional: true,
518
+ value: transformScalarType(
519
+ schema,
520
+ schema.expectStringType(),
521
+ state
522
+ )
523
+ },
524
+ {
525
+ key: "__fragments_" + node.name,
526
+ ref: node.name
527
+ }
528
+ ];
529
+ },
530
+ FragmentSpread(node) {
531
+ state.usedFragments.add(node.name);
532
+ return [
533
+ {
534
+ key: "__fragments_" + node.name,
535
+ ref: node.name
536
+ }
537
+ ];
538
+ }
539
+ }
540
+ };
541
+ }
542
+ function visitScalarField(schema, node, state) {
543
+ return [
544
+ {
545
+ key: node.alias || node.name,
546
+ schemaName: node.name,
547
+ value: transformScalarType(schema, node.type, state)
548
+ }
549
+ ];
550
+ }
551
+ function visitLinkedField(node) {
552
+ return [
553
+ {
554
+ key: node.alias || node.name,
555
+ schemaName: node.name,
556
+ nodeType: node.type,
557
+ nodeSelections: selectionsToMap(
558
+ flattenArray(
559
+ /* $FlowFixMe: selections have already been transformed */
560
+ node.selections
561
+ ),
562
+ /*
563
+ * append concreteType to key so overlapping fields with different
564
+ * concreteTypes don't get overwritten by each other
565
+ */
566
+ true
567
+ )
568
+ }
569
+ ];
570
+ }
571
+ function makeRawResponseProp(schema, {
572
+ key,
573
+ schemaName,
574
+ value,
575
+ conditional,
576
+ nodeType,
577
+ nodeSelections,
578
+ kind
579
+ }, state, concreteType) {
580
+ if (kind === "ModuleImport") {
581
+ throw new Error(
582
+ "relay-compiler-language-typescript does not support @module yet"
583
+ );
584
+ }
585
+ if (schemaName === "__typename" && concreteType) {
586
+ value = ts.factory.createLiteralTypeNode(
587
+ ts.factory.createStringLiteral(concreteType)
588
+ );
589
+ } else if (nodeType) {
590
+ value = transformScalarType(
591
+ schema,
592
+ nodeType,
593
+ state,
594
+ selectionsToRawResponseBabel(
595
+ schema,
596
+ [Array.from(nullThrows(nodeSelections).values())],
597
+ state,
598
+ schema.isAbstractType(nodeType) || schema.isWrapper(nodeType) ? null : schema.getTypeString(nodeType)
599
+ )
600
+ );
601
+ }
602
+ const typeProperty = objectTypeProperty(key, value, {
603
+ optional: conditional
604
+ });
605
+ return typeProperty;
606
+ }
607
+ function selectionsToMap(selections, appendType) {
608
+ const map = /* @__PURE__ */ new Map();
609
+ selections.forEach((selection) => {
610
+ const key = appendType && selection.concreteType ? `${selection.key}::${selection.concreteType}` : selection.key;
611
+ const previousSel = map.get(key);
612
+ map.set(
613
+ key,
614
+ previousSel ? mergeSelection(previousSel, selection) : selection
615
+ );
616
+ });
617
+ return map;
618
+ }
619
+ function selectionsToRawResponseBabel(schema, selections, state, nodeTypeName) {
620
+ const baseFields = [];
621
+ const byConcreteType = {};
622
+ flattenArray(selections).forEach((selection) => {
623
+ const { concreteType } = selection;
624
+ if (concreteType) {
625
+ byConcreteType[concreteType] = byConcreteType[concreteType] || [];
626
+ byConcreteType[concreteType].push(selection);
627
+ } else {
628
+ baseFields.push(selection);
629
+ }
630
+ });
631
+ const types = [];
632
+ if (Object.keys(byConcreteType).length) {
633
+ const baseFieldsMap = selectionsToMap(baseFields);
634
+ for (const concreteType in byConcreteType) {
635
+ const mergedSelections = Array.from(
636
+ mergeSelections(
637
+ baseFieldsMap,
638
+ selectionsToMap(byConcreteType[concreteType]),
639
+ false
640
+ ).values()
641
+ );
642
+ types.push(
643
+ exactObjectTypeAnnotation(
644
+ mergedSelections.map(
645
+ (selection) => makeRawResponseProp(schema, selection, state, concreteType)
646
+ )
647
+ )
648
+ );
649
+ appendLocal3DPayload(
650
+ types,
651
+ mergedSelections,
652
+ schema,
653
+ state,
654
+ concreteType
655
+ );
656
+ }
657
+ }
658
+ if (baseFields.length > 0) {
659
+ types.push(
660
+ exactObjectTypeAnnotation(
661
+ baseFields.map(
662
+ (selection) => makeRawResponseProp(schema, selection, state, nodeTypeName)
663
+ )
664
+ )
665
+ );
666
+ appendLocal3DPayload(types, baseFields, schema, state, nodeTypeName);
667
+ }
668
+ return ts.factory.createUnionTypeNode(types);
669
+ }
670
+ function appendLocal3DPayload(types, selections, schema, state, currentType) {
671
+ const moduleImport = selections.find((sel) => sel.kind === "ModuleImport");
672
+ if (moduleImport) {
673
+ state.runtimeImports.add("Local3DPayload");
674
+ types.push(
675
+ ts.factory.createTypeReferenceNode(
676
+ ts.factory.createIdentifier("Local3DPayload"),
677
+ [
678
+ stringLiteralTypeAnnotation(moduleImport.documentName),
679
+ exactObjectTypeAnnotation(
680
+ selections.filter((sel) => sel.schemaName !== "js").map(
681
+ (selection) => makeRawResponseProp(schema, selection, state, currentType)
682
+ )
683
+ )
684
+ ]
685
+ )
686
+ );
687
+ }
688
+ }
689
+ function createRawResponseTypeVisitor(schema, state) {
690
+ return {
691
+ leave: {
692
+ Root(node) {
693
+ return exportType(
694
+ `${node.name}RawResponse`,
695
+ selectionsToRawResponseBabel(
696
+ schema,
697
+ /* $FlowFixMe: selections have already been transformed */
698
+ node.selections,
699
+ state,
700
+ null
701
+ )
702
+ );
703
+ },
704
+ InlineFragment(node) {
705
+ const typeCondition = node.typeCondition;
706
+ return flattenArray(
707
+ /* $FlowFixMe: selections have already been transformed */
708
+ node.selections
709
+ ).map((typeSelection) => {
710
+ return schema.isAbstractType(typeCondition) ? typeSelection : __spreadProps(__spreadValues({}, typeSelection), {
711
+ concreteType: schema.getTypeString(typeCondition)
712
+ });
713
+ });
714
+ },
715
+ ScalarField(node) {
716
+ return visitScalarField(schema, node, state);
717
+ },
718
+ ClientExtension(node) {
719
+ return flattenArray(
720
+ /* $FlowFixMe: selections have already been transformed */
721
+ node.selections
722
+ ).map((sel) => __spreadProps(__spreadValues({}, sel), {
723
+ conditional: true
724
+ }));
725
+ },
726
+ LinkedField: visitLinkedField,
727
+ Condition(node) {
728
+ return flattenArray(
729
+ /* $FlowFixMe: selections have already been transformed */
730
+ node.selections
731
+ );
732
+ },
733
+ Defer(node) {
734
+ return flattenArray(
735
+ /* $FlowFixMe: selections have already been transformed */
736
+ node.selections
737
+ );
738
+ },
739
+ Stream(node) {
740
+ return flattenArray(
741
+ /* $FlowFixMe: selections have already been transformed */
742
+ node.selections
743
+ );
744
+ },
745
+ ModuleImport(node) {
746
+ return visitRawResponseModuleImport(schema, node, state);
747
+ },
748
+ FragmentSpread(_node) {
749
+ throw new Error(
750
+ "A fragment spread is found when traversing the AST, make sure you are passing the codegen IR"
751
+ );
752
+ }
753
+ }
754
+ };
755
+ }
756
+ function visitRawResponseModuleImport(schema, node, state) {
757
+ const { selections, name: key } = node;
758
+ const moduleSelections = selections.filter((sel) => sel.length && sel[0].schemaName === "js").map((arr) => arr[0]);
759
+ if (!state.matchFields.has(key)) {
760
+ const ast = selectionsToRawResponseBabel(
761
+ schema,
762
+ node.selections.filter(
763
+ (sel) => sel.length > 1 || sel[0].schemaName !== "js"
764
+ ),
765
+ state,
766
+ null
767
+ );
768
+ state.matchFields.set(key, ast);
769
+ }
770
+ return [
771
+ ...moduleSelections,
772
+ {
773
+ key,
774
+ kind: "ModuleImport",
775
+ documentName: node.documentName
776
+ }
777
+ ];
778
+ }
779
+ function flattenArray(arrayOfArrays) {
780
+ const result = [];
781
+ arrayOfArrays.forEach((array) => result.push(...array));
782
+ return result;
783
+ }
784
+ function generateInputObjectTypes(state) {
785
+ return Object.keys(state.generatedInputObjectTypes).map((typeIdentifier) => {
786
+ const inputObjectType = state.generatedInputObjectTypes[typeIdentifier];
787
+ if (inputObjectType === "pending") {
788
+ throw new Error(
789
+ "TypeScriptGenerator: Expected input object type to have been defined before calling `generateInputObjectTypes`"
790
+ );
791
+ } else {
792
+ return exportType(typeIdentifier, inputObjectType);
793
+ }
794
+ });
795
+ }
796
+ function generateInputVariablesType(schema, node, state) {
797
+ return exportType(
798
+ `${node.name}Variables`,
799
+ exactObjectTypeAnnotation(
800
+ node.argumentDefinitions.map((arg) => {
801
+ return objectTypeProperty(
802
+ arg.name,
803
+ transformInputType(schema, arg.type, state),
804
+ { readonly: false, optional: !schema.isNonNull(arg.type) }
805
+ );
806
+ })
807
+ )
808
+ );
809
+ }
810
+ function groupRefs(props) {
811
+ const result = [];
812
+ const refs = [];
813
+ props.forEach((prop) => {
814
+ if (prop.ref) {
815
+ refs.push(prop.ref);
816
+ } else {
817
+ result.push(prop);
818
+ }
819
+ });
820
+ if (refs.length > 0) {
821
+ const refTypes = ts.factory.createUnionTypeNode(
822
+ refs.map(
823
+ (ref) => ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(ref))
824
+ )
825
+ );
826
+ result.push({
827
+ key: FRAGMENT_REFS,
828
+ conditional: false,
829
+ value: ts.factory.createTypeReferenceNode(FRAGMENT_REFS_TYPE_NAME, [
830
+ refTypes
831
+ ])
832
+ });
833
+ }
834
+ return result;
835
+ }
836
+ function getFragmentRefsTypeImport(state) {
837
+ if (state.usedFragments.size > 0) {
838
+ return [
839
+ ts.factory.createImportDeclaration(
840
+ void 0,
841
+ ts.factory.createImportClause(
842
+ false,
843
+ void 0,
844
+ ts.factory.createNamedImports([
845
+ ts.factory.createImportSpecifier(
846
+ false,
847
+ void 0,
848
+ ts.factory.createIdentifier("FragmentRefs")
849
+ )
850
+ ])
851
+ ),
852
+ ts.factory.createStringLiteral("relay-runtime")
853
+ )
854
+ ];
855
+ }
856
+ return [];
857
+ }
858
+ function getEnumDefinitions(schema, { enumsHasteModule, usedEnums, noFutureProofEnums }) {
859
+ const enumNames = Object.keys(usedEnums).sort();
860
+ if (enumNames.length === 0) {
861
+ return [];
862
+ }
863
+ if (typeof enumsHasteModule === "string") {
864
+ return [importTypes(enumNames, enumsHasteModule)];
865
+ }
866
+ if (typeof enumsHasteModule === "function") {
867
+ return enumNames.map(
868
+ (enumName) => importTypes([enumName], enumsHasteModule(enumName))
869
+ );
870
+ }
871
+ return enumNames.map((name) => {
872
+ const values = [...schema.getEnumValues(usedEnums[name])];
873
+ values.sort();
874
+ if (!noFutureProofEnums) {
875
+ values.push("%future added value");
876
+ }
877
+ return exportType(
878
+ name,
879
+ ts.factory.createUnionTypeNode(
880
+ values.map((value) => stringLiteralTypeAnnotation(value))
881
+ )
882
+ );
883
+ });
884
+ }
885
+ function stringLiteralTypeAnnotation(name) {
886
+ return ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(name));
887
+ }
888
+ function getRefTypeName(name) {
889
+ return `${name}$key`;
890
+ }
891
+ function getDataTypeName(name) {
892
+ return `${name}$data`;
893
+ }
894
+ var transforms = [
895
+ RelayDirectiveTransform.transform,
896
+ MaskTransform.transform,
897
+ MatchTransform.transform,
898
+ FlattenTransform.transformWithOptions({}),
899
+ RefetchableFragmentTransform.transform
900
+ ];
901
+ export {
902
+ generate,
903
+ transforms
904
+ };