UNPKG

apollo-codegen-swift

Version:
262 lines 11.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Helpers = void 0; const graphql_1 = require("graphql"); const change_case_1 = require("change-case"); const Inflector = __importStar(require("inflected")); const printing_1 = require("apollo-codegen-core/lib/utilities/printing"); const language_1 = require("./language"); const graphql_2 = require("apollo-codegen-core/lib/utilities/graphql"); const collectAndMergeFields_1 = require("apollo-codegen-core/lib/compiler/visitors/collectAndMergeFields"); const builtInScalarMap = { [graphql_1.GraphQLString.name]: "String", [graphql_1.GraphQLInt.name]: "Int", [graphql_1.GraphQLFloat.name]: "Double", [graphql_1.GraphQLBoolean.name]: "Bool", [graphql_1.GraphQLID.name]: "GraphQLID", }; class Helpers { constructor(options) { this.options = options; } typeNameFromGraphQLType(type, unmodifiedTypeName, isOptional) { if ((0, graphql_1.isNonNullType)(type)) { return this.typeNameFromGraphQLType(type.ofType, unmodifiedTypeName, false); } else if (isOptional === undefined) { isOptional = true; } let typeName; if ((0, graphql_1.isListType)(type)) { typeName = "[" + this.typeNameFromGraphQLType(type.ofType, unmodifiedTypeName) + "]"; } else if ((0, graphql_1.isScalarType)(type)) { typeName = this.typeNameForScalarType(type); } else { typeName = unmodifiedTypeName || type.name; } return isOptional ? typeName + "?" : typeName; } typeNameForScalarType(type) { return (builtInScalarMap[type.name] || (this.options.passthroughCustomScalars ? this.options.customScalarsPrefix + type.name : graphql_1.GraphQLString.name)); } fieldTypeEnum(type, structName) { if ((0, graphql_1.isNonNullType)(type)) { return (0, language_1.swift) `.nonNull(${this.fieldTypeEnum(type.ofType, structName)})`; } else if ((0, graphql_1.isListType)(type)) { return (0, language_1.swift) `.list(${this.fieldTypeEnum(type.ofType, structName)})`; } else if ((0, graphql_1.isScalarType)(type)) { return (0, language_1.swift) `.scalar(${this.typeNameForScalarType(type)}.self)`; } else if ((0, graphql_1.isEnumType)(type)) { return (0, language_1.swift) `.scalar(${type.name}.self)`; } else if ((0, graphql_1.isCompositeType)(type)) { return (0, language_1.swift) `.object(${structName}.selections)`; } else { throw new Error(`Unknown field type: ${type}`); } } enumCaseName(name) { return camelCase(name); } enumDotCaseName(name) { return (0, language_1.swift) `.${language_1.SwiftSource.memberName(camelCase(name))}`; } operationClassName(name) { return pascalCase(name); } structNameForPropertyName(propertyName) { return pascalCase(Inflector.singularize(propertyName)); } structNameForFragmentName(fragmentName) { return pascalCase(fragmentName); } structNameForVariant(variant) { return ("As" + variant.possibleTypes.map((type) => pascalCase(type.name)).join("Or")); } internalParameterName(propertyName, properties) { return language_1.SwiftSource.isValidParameterName(propertyName) ? propertyName : makeUniqueName(`_${propertyName}`, properties); } propertyFromField(field, namespace) { const { responseKey, isConditional } = field; const propertyName = (0, graphql_2.isMetaFieldName)(responseKey) ? responseKey : camelCase(responseKey); const structName = (0, printing_1.join)([namespace, this.structNameForPropertyName(responseKey)], "."); let type = field.type; if (isConditional && (0, graphql_1.isNonNullType)(type)) { type = type.ofType; } const isOptional = !(0, graphql_1.isNonNullType)(type); const unmodifiedType = (0, graphql_1.getNamedType)(field.type); const unmodifiedTypeName = (0, graphql_1.isCompositeType)(unmodifiedType) ? structName : unmodifiedType.name; const typeName = this.typeNameFromGraphQLType(type, unmodifiedTypeName); return Object.assign({}, field, { responseKey, propertyName, typeName, structName, isOptional, }); } propertyFromVariant(variant) { const structName = this.structNameForVariant(variant); return Object.assign(variant, { propertyName: camelCase(structName), typeName: structName + "?", structName, }); } propertyFromFragmentSpread(fragmentSpread, isConditional) { const structName = this.structNameForFragmentName(fragmentSpread.fragmentName); return Object.assign({}, fragmentSpread, { propertyName: camelCase(fragmentSpread.fragmentName), typeName: isConditional ? structName + "?" : structName, structName, isConditional, }); } propertyFromInputField(field) { return Object.assign({}, field, { propertyName: camelCase(field.name), typeName: this.typeNameFromGraphQLType(field.type), isOptional: !(0, graphql_1.isNonNullType)(field.type), }); } propertiesForSelectionSet(selectionSet, namespace) { const properties = (0, collectAndMergeFields_1.collectAndMergeFields)(selectionSet, true) .filter((field) => field.name !== "__typename") .map((field) => this.propertyFromField(field, namespace)); if (selectionSet.selections.some((selection) => selection.kind === "FragmentSpread") && properties.some((property) => (0, graphql_1.isCompositeType)((0, graphql_1.getNamedType)(property.type)))) { return undefined; } return properties; } dictionaryLiteralForFieldArguments(args) { function expressionFromValue(value) { if (value === null) { return (0, language_1.swift) `nil`; } else if (value.kind === "Variable") { return (0, language_1.swift) `GraphQLVariable(${language_1.SwiftSource.string(value.variableName)})`; } else if (Array.isArray(value)) { return (language_1.SwiftSource.wrap((0, language_1.swift) `[`, language_1.SwiftSource.join(value.map(expressionFromValue), ", "), (0, language_1.swift) `]`) || (0, language_1.swift) `[]`); } else if (typeof value === "object") { return (language_1.SwiftSource.wrap((0, language_1.swift) `[`, language_1.SwiftSource.join(Object.entries(value).map(([key, value]) => { return (0, language_1.swift) `${language_1.SwiftSource.string(key)}: ${expressionFromValue(value)}`; }), ", "), (0, language_1.swift) `]`) || (0, language_1.swift) `[:]`); } else if (typeof value === "string") { return language_1.SwiftSource.string(value); } else { return new language_1.SwiftSource(JSON.stringify(value)); } } return (language_1.SwiftSource.wrap((0, language_1.swift) `[`, language_1.SwiftSource.join(args.map((arg) => { return (0, language_1.swift) `${language_1.SwiftSource.string(arg.name)}: ${expressionFromValue(arg.value)}`; }), ", "), (0, language_1.swift) `]`) || (0, language_1.swift) `[:]`); } mapExpressionForType(type, isConditional = false, makeExpression, expression, inputTypeName, outputTypeName) { let isOptional; if ((0, graphql_1.isNonNullType)(type)) { isOptional = !!isConditional; type = type.ofType; } else { isOptional = true; } if ((0, graphql_1.isListType)(type)) { const elementType = type.ofType; if (isOptional) { return (0, 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, (0, language_1.swift) `value`, inputTypeName, outputTypeName)} } }`; } else { return (0, language_1.swift) `${expression}.map { ${makeClosureSignature(this.typeNameFromGraphQLType(elementType, inputTypeName), this.typeNameFromGraphQLType(elementType, outputTypeName))} ${this.mapExpressionForType(elementType, undefined, makeExpression, (0, language_1.swift) `value`, inputTypeName, outputTypeName)} }`; } } else if (isOptional) { return (0, language_1.swift) `${expression}.flatMap { ${makeClosureSignature(this.typeNameFromGraphQLType(type, inputTypeName, false), this.typeNameFromGraphQLType(type, outputTypeName, false))} ${makeExpression((0, language_1.swift) `value`)} }`; } else { return makeExpression(expression); } } } exports.Helpers = Helpers; function makeClosureSignature(parameterTypeName, returnTypeName) { let closureSignature = (0, language_1.swift) `(value: ${parameterTypeName})`; if (returnTypeName) { closureSignature.append((0, language_1.swift) ` -> ${returnTypeName}`); } closureSignature.append((0, language_1.swift) ` in`); return closureSignature; } function makeUniqueName(proposedName, properties) { for (let name = proposedName;; name += "_") { if (properties.every((prop) => prop.propertyName != name)) { return name; } } } function camelCase(value) { const [_, prefix, middle, suffix] = value.match(/^(_*)(.*?)(_*)$/) || [ "", "", value, "", ]; return `${prefix}${(0, change_case_1.camelCase)(middle)}${suffix}`; } function pascalCase(value) { const [_, prefix, middle, suffix] = value.match(/^(_*)(.*?)(_*)$/) || [ "", "", value, "", ]; return `${prefix}${(0, change_case_1.pascalCase)(middle)}${suffix}`; } //# sourceMappingURL=helpers.js.map