1 | "use strict";
|
2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3 | if (k2 === undefined) k2 = k;
|
4 | Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
5 | }) : (function(o, m, k, k2) {
|
6 | if (k2 === undefined) k2 = k;
|
7 | o[k2] = m[k];
|
8 | }));
|
9 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
10 | Object.defineProperty(o, "default", { enumerable: true, value: v });
|
11 | }) : function(o, v) {
|
12 | o["default"] = v;
|
13 | });
|
14 | var __importStar = (this && this.__importStar) || function (mod) {
|
15 | if (mod && mod.__esModule) return mod;
|
16 | var result = {};
|
17 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
18 | __setModuleDefault(result, mod);
|
19 | return result;
|
20 | };
|
21 | Object.defineProperty(exports, "__esModule", { value: true });
|
22 | exports.Helpers = void 0;
|
23 | const graphql_1 = require("graphql");
|
24 | const change_case_1 = require("change-case");
|
25 | const Inflector = __importStar(require("inflected"));
|
26 | const printing_1 = require("apollo-codegen-core/lib/utilities/printing");
|
27 | const language_1 = require("./language");
|
28 | const graphql_2 = require("apollo-codegen-core/lib/utilities/graphql");
|
29 | const collectAndMergeFields_1 = require("apollo-codegen-core/lib/compiler/visitors/collectAndMergeFields");
|
30 | const builtInScalarMap = {
|
31 | [graphql_1.GraphQLString.name]: "String",
|
32 | [graphql_1.GraphQLInt.name]: "Int",
|
33 | [graphql_1.GraphQLFloat.name]: "Double",
|
34 | [graphql_1.GraphQLBoolean.name]: "Bool",
|
35 | [graphql_1.GraphQLID.name]: "GraphQLID"
|
36 | };
|
37 | class Helpers {
|
38 | constructor(options) {
|
39 | this.options = options;
|
40 | }
|
41 | typeNameFromGraphQLType(type, unmodifiedTypeName, isOptional) {
|
42 | if (graphql_1.isNonNullType(type)) {
|
43 | return this.typeNameFromGraphQLType(type.ofType, unmodifiedTypeName, false);
|
44 | }
|
45 | else if (isOptional === undefined) {
|
46 | isOptional = true;
|
47 | }
|
48 | let typeName;
|
49 | if (graphql_1.isListType(type)) {
|
50 | typeName =
|
51 | "[" +
|
52 | this.typeNameFromGraphQLType(type.ofType, unmodifiedTypeName) +
|
53 | "]";
|
54 | }
|
55 | else if (graphql_1.isScalarType(type)) {
|
56 | typeName = this.typeNameForScalarType(type);
|
57 | }
|
58 | else {
|
59 | typeName = unmodifiedTypeName || type.name;
|
60 | }
|
61 | return isOptional ? typeName + "?" : typeName;
|
62 | }
|
63 | typeNameForScalarType(type) {
|
64 | return (builtInScalarMap[type.name] ||
|
65 | (this.options.passthroughCustomScalars
|
66 | ? this.options.customScalarsPrefix + type.name
|
67 | : graphql_1.GraphQLString.name));
|
68 | }
|
69 | fieldTypeEnum(type, structName) {
|
70 | if (graphql_1.isNonNullType(type)) {
|
71 | return language_1.swift `.nonNull(${this.fieldTypeEnum(type.ofType, structName)})`;
|
72 | }
|
73 | else if (graphql_1.isListType(type)) {
|
74 | return language_1.swift `.list(${this.fieldTypeEnum(type.ofType, structName)})`;
|
75 | }
|
76 | else if (graphql_1.isScalarType(type)) {
|
77 | return language_1.swift `.scalar(${this.typeNameForScalarType(type)}.self)`;
|
78 | }
|
79 | else if (graphql_1.isEnumType(type)) {
|
80 | return language_1.swift `.scalar(${type.name}.self)`;
|
81 | }
|
82 | else if (graphql_1.isCompositeType(type)) {
|
83 | return language_1.swift `.object(${structName}.selections)`;
|
84 | }
|
85 | else {
|
86 | throw new Error(`Unknown field type: ${type}`);
|
87 | }
|
88 | }
|
89 | enumCaseName(name) {
|
90 | return camelCase(name);
|
91 | }
|
92 | enumDotCaseName(name) {
|
93 | return language_1.swift `.${language_1.SwiftSource.memberName(camelCase(name))}`;
|
94 | }
|
95 | operationClassName(name) {
|
96 | return pascalCase(name);
|
97 | }
|
98 | structNameForPropertyName(propertyName) {
|
99 | return pascalCase(Inflector.singularize(propertyName));
|
100 | }
|
101 | structNameForFragmentName(fragmentName) {
|
102 | return pascalCase(fragmentName);
|
103 | }
|
104 | structNameForVariant(variant) {
|
105 | return ("As" + variant.possibleTypes.map(type => pascalCase(type.name)).join("Or"));
|
106 | }
|
107 | internalParameterName(propertyName, properties) {
|
108 | return language_1.SwiftSource.isValidParameterName(propertyName)
|
109 | ? propertyName
|
110 | : makeUniqueName(`_${propertyName}`, properties);
|
111 | }
|
112 | propertyFromField(field, namespace) {
|
113 | const { responseKey, isConditional } = field;
|
114 | const propertyName = graphql_2.isMetaFieldName(responseKey)
|
115 | ? responseKey
|
116 | : camelCase(responseKey);
|
117 | const structName = printing_1.join([namespace, this.structNameForPropertyName(responseKey)], ".");
|
118 | let type = field.type;
|
119 | if (isConditional && graphql_1.isNonNullType(type)) {
|
120 | type = type.ofType;
|
121 | }
|
122 | const isOptional = !graphql_1.isNonNullType(type);
|
123 | const unmodifiedType = graphql_1.getNamedType(field.type);
|
124 | const unmodifiedTypeName = graphql_1.isCompositeType(unmodifiedType)
|
125 | ? structName
|
126 | : unmodifiedType.name;
|
127 | const typeName = this.typeNameFromGraphQLType(type, unmodifiedTypeName);
|
128 | return Object.assign({}, field, {
|
129 | responseKey,
|
130 | propertyName,
|
131 | typeName,
|
132 | structName,
|
133 | isOptional
|
134 | });
|
135 | }
|
136 | propertyFromVariant(variant) {
|
137 | const structName = this.structNameForVariant(variant);
|
138 | return Object.assign(variant, {
|
139 | propertyName: camelCase(structName),
|
140 | typeName: structName + "?",
|
141 | structName
|
142 | });
|
143 | }
|
144 | propertyFromFragmentSpread(fragmentSpread, isConditional) {
|
145 | const structName = this.structNameForFragmentName(fragmentSpread.fragmentName);
|
146 | return Object.assign({}, fragmentSpread, {
|
147 | propertyName: camelCase(fragmentSpread.fragmentName),
|
148 | typeName: isConditional ? structName + "?" : structName,
|
149 | structName,
|
150 | isConditional
|
151 | });
|
152 | }
|
153 | propertyFromInputField(field) {
|
154 | return Object.assign({}, field, {
|
155 | propertyName: camelCase(field.name),
|
156 | typeName: this.typeNameFromGraphQLType(field.type),
|
157 | isOptional: !graphql_1.isNonNullType(field.type)
|
158 | });
|
159 | }
|
160 | propertiesForSelectionSet(selectionSet, namespace) {
|
161 | const properties = collectAndMergeFields_1.collectAndMergeFields(selectionSet, true)
|
162 | .filter(field => field.name !== "__typename")
|
163 | .map(field => this.propertyFromField(field, namespace));
|
164 | if (selectionSet.selections.some(selection => selection.kind === "FragmentSpread") &&
|
165 | properties.some(property => graphql_1.isCompositeType(graphql_1.getNamedType(property.type)))) {
|
166 | return undefined;
|
167 | }
|
168 | return properties;
|
169 | }
|
170 | dictionaryLiteralForFieldArguments(args) {
|
171 | function expressionFromValue(value) {
|
172 | if (value === null) {
|
173 | return language_1.swift `nil`;
|
174 | }
|
175 | else if (value.kind === "Variable") {
|
176 | return language_1.swift `GraphQLVariable(${language_1.SwiftSource.string(value.variableName)})`;
|
177 | }
|
178 | else if (Array.isArray(value)) {
|
179 | return (language_1.SwiftSource.wrap(language_1.swift `[`, language_1.SwiftSource.join(value.map(expressionFromValue), ", "), language_1.swift `]`) || language_1.swift `[]`);
|
180 | }
|
181 | else if (typeof value === "object") {
|
182 | return (language_1.SwiftSource.wrap(language_1.swift `[`, language_1.SwiftSource.join(Object.entries(value).map(([key, value]) => {
|
183 | return language_1.swift `${language_1.SwiftSource.string(key)}: ${expressionFromValue(value)}`;
|
184 | }), ", "), language_1.swift `]`) || language_1.swift `[:]`);
|
185 | }
|
186 | else if (typeof value === "string") {
|
187 | return language_1.SwiftSource.string(value);
|
188 | }
|
189 | else {
|
190 | return new language_1.SwiftSource(JSON.stringify(value));
|
191 | }
|
192 | }
|
193 | return (language_1.SwiftSource.wrap(language_1.swift `[`, language_1.SwiftSource.join(args.map(arg => {
|
194 | return language_1.swift `${language_1.SwiftSource.string(arg.name)}: ${expressionFromValue(arg.value)}`;
|
195 | }), ", "), language_1.swift `]`) || language_1.swift `[:]`);
|
196 | }
|
197 | mapExpressionForType(type, isConditional = false, makeExpression, expression, inputTypeName, outputTypeName) {
|
198 | let isOptional;
|
199 | if (graphql_1.isNonNullType(type)) {
|
200 | isOptional = !!isConditional;
|
201 | type = type.ofType;
|
202 | }
|
203 | else {
|
204 | isOptional = true;
|
205 | }
|
206 | if (graphql_1.isListType(type)) {
|
207 | const elementType = type.ofType;
|
208 | if (isOptional) {
|
209 | return language_1.swift `${expression}.flatMap { ${makeClosureSignature(this.typeNameFromGraphQLType(type, inputTypeName, false), this.typeNameFromGraphQLType(type, outputTypeName, false))} value.map { ${makeClosureSignature(this.typeNameFromGraphQLType(elementType, inputTypeName), this.typeNameFromGraphQLType(elementType, outputTypeName))} ${this.mapExpressionForType(elementType, undefined, makeExpression, language_1.swift `value`, inputTypeName, outputTypeName)} } }`;
|
210 | }
|
211 | else {
|
212 | return language_1.swift `${expression}.map { ${makeClosureSignature(this.typeNameFromGraphQLType(elementType, inputTypeName), this.typeNameFromGraphQLType(elementType, outputTypeName))} ${this.mapExpressionForType(elementType, undefined, makeExpression, language_1.swift `value`, inputTypeName, outputTypeName)} }`;
|
213 | }
|
214 | }
|
215 | else if (isOptional) {
|
216 | return language_1.swift `${expression}.flatMap { ${makeClosureSignature(this.typeNameFromGraphQLType(type, inputTypeName, false), this.typeNameFromGraphQLType(type, outputTypeName, false))} ${makeExpression(language_1.swift `value`)} }`;
|
217 | }
|
218 | else {
|
219 | return makeExpression(expression);
|
220 | }
|
221 | }
|
222 | }
|
223 | exports.Helpers = Helpers;
|
224 | function makeClosureSignature(parameterTypeName, returnTypeName) {
|
225 | let closureSignature = language_1.swift `(value: ${parameterTypeName})`;
|
226 | if (returnTypeName) {
|
227 | closureSignature.append(language_1.swift ` -> ${returnTypeName}`);
|
228 | }
|
229 | closureSignature.append(language_1.swift ` in`);
|
230 | return closureSignature;
|
231 | }
|
232 | function makeUniqueName(proposedName, properties) {
|
233 | for (let name = proposedName;; name += "_") {
|
234 | if (properties.every(prop => prop.propertyName != name)) {
|
235 | return name;
|
236 | }
|
237 | }
|
238 | }
|
239 | function camelCase(value) {
|
240 | const [_, prefix, middle, suffix] = value.match(/^(_*)(.*?)(_*)$/) || [
|
241 | "",
|
242 | "",
|
243 | value,
|
244 | ""
|
245 | ];
|
246 | return `${prefix}${change_case_1.camelCase(middle)}${suffix}`;
|
247 | }
|
248 | function pascalCase(value) {
|
249 | const [_, prefix, middle, suffix] = value.match(/^(_*)(.*?)(_*)$/) || [
|
250 | "",
|
251 | "",
|
252 | value,
|
253 | ""
|
254 | ];
|
255 | return `${prefix}${change_case_1.pascalCase(middle)}${suffix}`;
|
256 | }
|
257 |
|
\ | No newline at end of file |