UNPKG

graphql-gene

Version:

Generates automatically an executable schema out of your ORM models

1 lines 11.6 kB
{"version":3,"file":"defaultResolver.cjs","sources":["../src/defaultResolver.ts"],"sourcesContent":["import {\n AND_OR_OPERATORS,\n BASIC_GRAPHQL_TYPE_VALUES,\n PAGE_ARG_DEFAULT,\n PER_PAGE_ARG_DEFAULT,\n QUERY_ORDER_VALUES,\n} from './constants'\nimport type { FieldLines, TypeDefLines } from './types'\nimport { createTypeDefLines, getDefaultFieldLinesObject, getReturnTypeName } from './utils'\n\nexport const VALID_RETURN_TYPES_FOR_WHERE = [\n 'String',\n 'Int',\n 'Float',\n 'Boolean',\n 'Date',\n 'DateTime',\n] as const\n\nexport function populateArgsDefForDefaultResolver(options: {\n fieldLineConfig: FieldLines[string]\n graphqlType: string\n fieldKey: string\n isList: boolean\n}) {\n const whereOptionsInputName = getWhereOptionsInputName(options.graphqlType, options.fieldKey)\n const orderEnumName = getQueryOrderEnumName(options.graphqlType, options.fieldKey)\n\n const argsDef = {\n ...(options.isList\n ? {\n page: 'Int',\n perPage: 'Int',\n }\n : { id: 'String' }),\n locale: 'String',\n where: whereOptionsInputName,\n order: `[${orderEnumName}!]`,\n }\n Object.entries(argsDef).forEach(([argKey, argDef]) => {\n options.fieldLineConfig.argsDef[argKey] =\n options.fieldLineConfig.argsDef[argKey] || new Set<string>([])\n\n let def = argDef\n // Set default values\n if (argKey === 'page') def += ` = ${PAGE_ARG_DEFAULT}`\n if (argKey === 'perPage') def += ` = ${PER_PAGE_ARG_DEFAULT}`\n\n options.fieldLineConfig.argsDef[argKey].add(def)\n })\n}\n\nexport function getWhereOptionsInputName<TType extends string, TField extends string>(\n typeName: TType,\n fieldName: TField\n) {\n return generateGraphqlTypeName(typeName, fieldName, 'WhereOptions')\n}\n\nexport function getQueryOrderEnumName<TType extends string, TField extends string>(\n typeName: TType,\n fieldName: TField\n) {\n return generateGraphqlTypeName(typeName, fieldName, 'SelectOrder')\n}\n\nexport function generateGraphqlTypeName<\n TType extends string,\n TField extends string,\n TSuffix extends string,\n>(typeName: string, fieldName: string, suffix: TSuffix) {\n const pascal = (name: string) => `${name[0].toUpperCase()}${name.substring(1)}`\n return [typeName, suffix, fieldName]\n .map(pascal)\n .join('') as `${Capitalize<TType>}${Capitalize<TSuffix>}${Capitalize<TField>}`\n}\n\nexport function getOperatorInputName(\n graphqlType: (typeof VALID_RETURN_TYPES_FOR_WHERE)[number]\n): `GeneOperator${string}Input` {\n return `GeneOperator${graphqlType}Input`\n}\n\nexport function generateOperatorInputLines(\n graphqlType: (typeof VALID_RETURN_TYPES_FOR_WHERE)[number]\n): FieldLines {\n const fieldDefs = {\n eq: graphqlType,\n ne: graphqlType,\n in: `[${graphqlType}]`,\n notIn: `[${graphqlType}]`,\n null: 'Boolean',\n\n ...(graphqlType === 'String'\n ? {\n like: graphqlType,\n notLike: graphqlType,\n }\n : ['Int', 'Float', 'Date', 'DateTime'].includes(graphqlType)\n ? {\n lt: graphqlType,\n lte: graphqlType,\n gt: graphqlType,\n gte: graphqlType,\n }\n : {}),\n }\n\n const lines: FieldLines = {}\n Object.entries(fieldDefs).forEach(([key, typeDef]) => {\n lines[key] = { ...getDefaultFieldLinesObject(), ...lines[key], typeDef }\n })\n return lines\n}\n\nexport function generateDefaultQueryFilterTypeDefs(options: {\n typeDefLines: TypeDefLines\n graphqlType: string\n fieldKey: string\n fieldType: string\n}) {\n const whereOptionsInputName = getWhereOptionsInputName(options.graphqlType, options.fieldKey)\n const orderEnumName = getQueryOrderEnumName(options.graphqlType, options.fieldKey)\n\n const hasWhereInputDefined = whereOptionsInputName in options.typeDefLines\n const hasOrderEnumDefined = orderEnumName in options.typeDefLines\n\n if (hasWhereInputDefined && hasOrderEnumDefined) return\n\n if (!hasWhereInputDefined) {\n createTypeDefLines(options.typeDefLines, 'input', whereOptionsInputName)\n\n // Add \"and\" and \"or\" operators\n AND_OR_OPERATORS.forEach(operator => {\n options.typeDefLines[whereOptionsInputName].lines[operator] = {\n ...getDefaultFieldLinesObject(),\n ...options.typeDefLines[whereOptionsInputName].lines[operator],\n }\n options.typeDefLines[whereOptionsInputName].lines[operator].typeDef =\n `[${whereOptionsInputName}!]`\n })\n }\n if (!hasOrderEnumDefined) {\n createTypeDefLines(options.typeDefLines, 'enum', orderEnumName)\n }\n\n if (options.fieldType && BASIC_GRAPHQL_TYPE_VALUES.includes(options.fieldType as 'ID')) return\n\n if (!(options.fieldType in options.typeDefLines)) {\n throw new Error(`Cannot find \"${options.fieldType}\" definition used as \"returnType\".`)\n }\n\n const findValidInputType = (type: string) => {\n return VALID_RETURN_TYPES_FOR_WHERE.find(validType => validType === getReturnTypeName(type))\n }\n const operatorInputsToGenerate = new Set<\n [string, NonNullable<ReturnType<typeof findValidInputType>>]\n >([])\n\n Object.entries(options.typeDefLines[options.fieldType].lines).forEach(\n ([returnFieldKey, returnFieldConfig]) => {\n // Where Options Input\n options.typeDefLines[whereOptionsInputName].lines[returnFieldKey] = {\n ...getDefaultFieldLinesObject(),\n ...options.typeDefLines[whereOptionsInputName].lines[returnFieldKey],\n }\n\n const returnFieldType = { ...getDefaultFieldLinesObject(), ...returnFieldConfig }\n\n const validInputType = findValidInputType(returnFieldType.typeDef)\n let whereTypeDef = ''\n\n if (validInputType) {\n const operatorInputName = getOperatorInputName(validInputType)\n operatorInputsToGenerate.add([operatorInputName, validInputType])\n whereTypeDef = operatorInputName\n }\n // If the return type is another Graphql Type because the field is an association\n else if (returnFieldType.typeDef in options.typeDefLines) {\n for (const key in options.typeDefLines[returnFieldType.typeDef].lines) {\n if (key === 'id') {\n const validInputType = findValidInputType(\n options.typeDefLines[returnFieldType.typeDef].lines[key].typeDef\n )\n if (validInputType) {\n const operatorInputName = getOperatorInputName(validInputType)\n operatorInputsToGenerate.add([operatorInputName, validInputType])\n whereTypeDef = operatorInputName\n }\n break\n }\n }\n }\n\n operatorInputsToGenerate.forEach(([operatorInputName, validInputType]) => {\n if (!(operatorInputName in options.typeDefLines)) {\n createTypeDefLines(options.typeDefLines, 'input', operatorInputName)\n\n options.typeDefLines[operatorInputName].lines = generateOperatorInputLines(validInputType)\n }\n })\n\n if (!whereTypeDef) {\n delete options.typeDefLines[whereOptionsInputName].lines[returnFieldKey]\n } else {\n options.typeDefLines[whereOptionsInputName].lines[returnFieldKey].typeDef = whereTypeDef\n }\n\n // Query Order Enum\n QUERY_ORDER_VALUES.forEach(orderValue => {\n const key = `${returnFieldKey}_${orderValue}`\n options.typeDefLines[orderEnumName].lines[key] = getDefaultFieldLinesObject()\n })\n }\n )\n}\n"],"names":["VALID_RETURN_TYPES_FOR_WHERE","populateArgsDefForDefaultResolver","options","whereOptionsInputName","getWhereOptionsInputName","orderEnumName","getQueryOrderEnumName","argsDef","argKey","argDef","def","PAGE_ARG_DEFAULT","PER_PAGE_ARG_DEFAULT","typeName","fieldName","generateGraphqlTypeName","suffix","pascal","name","getOperatorInputName","graphqlType","generateOperatorInputLines","fieldDefs","lines","key","typeDef","getDefaultFieldLinesObject","generateDefaultQueryFilterTypeDefs","hasWhereInputDefined","hasOrderEnumDefined","createTypeDefLines","AND_OR_OPERATORS","operator","BASIC_GRAPHQL_TYPE_VALUES","findValidInputType","type","validType","getReturnTypeName","operatorInputsToGenerate","returnFieldKey","returnFieldConfig","returnFieldType","validInputType","whereTypeDef","operatorInputName","QUERY_ORDER_VALUES","orderValue"],"mappings":"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"}