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