UNPKG

11.2 kBJavaScriptView Raw
1"use strict";
2var __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}));
9var __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});
14var __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};
21Object.defineProperty(exports, "__esModule", { value: true });
22exports.Helpers = void 0;
23const graphql_1 = require("graphql");
24const change_case_1 = require("change-case");
25const Inflector = __importStar(require("inflected"));
26const printing_1 = require("apollo-codegen-core/lib/utilities/printing");
27const language_1 = require("./language");
28const graphql_2 = require("apollo-codegen-core/lib/utilities/graphql");
29const collectAndMergeFields_1 = require("apollo-codegen-core/lib/compiler/visitors/collectAndMergeFields");
30const 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};
37class 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}
223exports.Helpers = Helpers;
224function 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}
232function makeUniqueName(proposedName, properties) {
233 for (let name = proposedName;; name += "_") {
234 if (properties.every(prop => prop.propertyName != name)) {
235 return name;
236 }
237 }
238}
239function 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}
248function 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//# sourceMappingURL=helpers.js.map
\No newline at end of file