graphile-build-pg 4.9.1 → 4.11.2

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 (76) hide show
  1. package/README.md +1 -0
  2. package/node8plus/plugins/PageInfoStartEndCursor.js +2 -2
  3. package/node8plus/plugins/PageInfoStartEndCursor.js.flow +6 -2
  4. package/node8plus/plugins/PageInfoStartEndCursor.js.map +1 -1
  5. package/node8plus/plugins/PgAllRows.js +1 -1
  6. package/node8plus/plugins/PgAllRows.js.flow +6 -3
  7. package/node8plus/plugins/PgAllRows.js.map +1 -1
  8. package/node8plus/plugins/PgBackwardRelationPlugin.js +2 -2
  9. package/node8plus/plugins/PgBackwardRelationPlugin.js.flow +8 -2
  10. package/node8plus/plugins/PgBackwardRelationPlugin.js.map +1 -1
  11. package/node8plus/plugins/PgBasicsPlugin.js +1 -1
  12. package/node8plus/plugins/PgBasicsPlugin.js.flow +1 -1
  13. package/node8plus/plugins/PgBasicsPlugin.js.map +1 -1
  14. package/node8plus/plugins/PgConditionComputedColumnPlugin.js +1 -1
  15. package/node8plus/plugins/PgConditionComputedColumnPlugin.js.flow +4 -1
  16. package/node8plus/plugins/PgConditionComputedColumnPlugin.js.map +1 -1
  17. package/node8plus/plugins/PgConnectionArgCondition.js +3 -3
  18. package/node8plus/plugins/PgConnectionArgCondition.js.flow +11 -3
  19. package/node8plus/plugins/PgConnectionArgCondition.js.map +1 -1
  20. package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js +5 -5
  21. package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js.flow +20 -7
  22. package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js.map +1 -1
  23. package/node8plus/plugins/PgConnectionArgOrderBy.js +2 -2
  24. package/node8plus/plugins/PgConnectionArgOrderBy.js.flow +8 -2
  25. package/node8plus/plugins/PgConnectionArgOrderBy.js.map +1 -1
  26. package/node8plus/plugins/PgConnectionTotalCount.js +1 -1
  27. package/node8plus/plugins/PgConnectionTotalCount.js.flow +4 -1
  28. package/node8plus/plugins/PgConnectionTotalCount.js.map +1 -1
  29. package/node8plus/plugins/PgForwardRelationPlugin.js +1 -1
  30. package/node8plus/plugins/PgForwardRelationPlugin.js.flow +4 -1
  31. package/node8plus/plugins/PgForwardRelationPlugin.js.map +1 -1
  32. package/node8plus/plugins/PgIntrospectionPlugin.d.ts +1 -0
  33. package/node8plus/plugins/PgIntrospectionPlugin.js +182 -159
  34. package/node8plus/plugins/PgIntrospectionPlugin.js.flow +218 -198
  35. package/node8plus/plugins/PgIntrospectionPlugin.js.map +1 -1
  36. package/node8plus/plugins/PgJWTPlugin.js +1 -1
  37. package/node8plus/plugins/PgJWTPlugin.js.flow +3 -1
  38. package/node8plus/plugins/PgJWTPlugin.js.map +1 -1
  39. package/node8plus/plugins/PgMutationCreatePlugin.js +7 -7
  40. package/node8plus/plugins/PgMutationCreatePlugin.js.flow +26 -7
  41. package/node8plus/plugins/PgMutationCreatePlugin.js.map +1 -1
  42. package/node8plus/plugins/PgMutationPayloadEdgePlugin.js +2 -2
  43. package/node8plus/plugins/PgMutationPayloadEdgePlugin.js.flow +8 -2
  44. package/node8plus/plugins/PgMutationPayloadEdgePlugin.js.map +1 -1
  45. package/node8plus/plugins/PgMutationUpdateDeletePlugin.js +11 -11
  46. package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.flow +40 -11
  47. package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.map +1 -1
  48. package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js +6 -6
  49. package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.flow +24 -6
  50. package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.map +1 -1
  51. package/node8plus/plugins/PgRecordReturnTypesPlugin.js +1 -1
  52. package/node8plus/plugins/PgRecordReturnTypesPlugin.js.flow +6 -3
  53. package/node8plus/plugins/PgRecordReturnTypesPlugin.js.map +1 -1
  54. package/node8plus/plugins/PgRowNode.js +2 -2
  55. package/node8plus/plugins/PgRowNode.js.flow +8 -2
  56. package/node8plus/plugins/PgRowNode.js.map +1 -1
  57. package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js +6 -6
  58. package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.flow +24 -6
  59. package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.map +1 -1
  60. package/node8plus/plugins/PgTablesPlugin.js +13 -13
  61. package/node8plus/plugins/PgTablesPlugin.js.flow +56 -20
  62. package/node8plus/plugins/PgTablesPlugin.js.map +1 -1
  63. package/node8plus/plugins/PgTypesPlugin.js +62 -78
  64. package/node8plus/plugins/PgTypesPlugin.js.flow +193 -76
  65. package/node8plus/plugins/PgTypesPlugin.js.map +1 -1
  66. package/node8plus/plugins/makeProcField.js +3 -3
  67. package/node8plus/plugins/makeProcField.js.flow +16 -7
  68. package/node8plus/plugins/makeProcField.js.map +1 -1
  69. package/node8plus/plugins/viaTemporaryTable.js +1 -1
  70. package/node8plus/plugins/viaTemporaryTable.js.flow +8 -4
  71. package/node8plus/plugins/viaTemporaryTable.js.map +1 -1
  72. package/node8plus/postgresInterval.js +12 -33
  73. package/node8plus/postgresInterval.js.flow +22 -51
  74. package/node8plus/postgresInterval.js.map +1 -1
  75. package/package.json +9 -9
  76. package/res/watch-fixtures.sql +1 -1
@@ -481,9 +481,12 @@ export default function makeProcField(
481
481
  GraphQLObjectType,
482
482
  {
483
483
  name: inflection.functionPayloadType(proc),
484
- description: `The output of our \`${inflection.functionMutationName(
485
- proc
486
- )}\` mutation.`,
484
+ description: build.wrapDescription(
485
+ `The output of our \`${inflection.functionMutationName(
486
+ proc
487
+ )}\` mutation.`,
488
+ "type"
489
+ ),
487
490
  fields: ({ fieldWithHooks }) => {
488
491
  return Object.assign(
489
492
  {},
@@ -538,9 +541,12 @@ export default function makeProcField(
538
541
  GraphQLInputObjectType,
539
542
  {
540
543
  name: inflection.functionInputType(proc),
541
- description: `All input for the \`${inflection.functionMutationName(
542
- proc
543
- )}\` mutation.`,
544
+ description: build.wrapDescription(
545
+ `All input for the \`${inflection.functionMutationName(
546
+ proc
547
+ )}\` mutation.`,
548
+ "type"
549
+ ),
544
550
  fields: {
545
551
  clientMutationId: {
546
552
  type: GraphQLString,
@@ -584,7 +590,10 @@ export default function makeProcField(
584
590
  : isMutation
585
591
  ? null
586
592
  : isTableLike && proc.returnsSet
587
- ? `Reads and enables pagination through a set of \`${TableType.name}\`.`
593
+ ? build.wrapDescription(
594
+ `Reads and enables pagination through a set of \`${TableType.name}\`.`,
595
+ "field"
596
+ )
588
597
  : null,
589
598
  type: nullableIf(
590
599
  GraphQLNonNull,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/makeProcField.js"],"names":["nullableIf","GraphQLNonNull","condition","Type","firstValue","obj","firstKey","k","makeProcField","fieldName","proc","build","fieldWithHooks","computed","isMutation","isRootQuery","forceList","pgIntrospectionResultsByKind","introspectionResultsByKind","pgGetGqlTypeByTypeIdAndModifier","pgGetGqlInputTypeByTypeIdAndModifier","getTypeByName","pgSql","sql","parseResolveInfo","getSafeAliasFromResolveInfo","getSafeAliasFromAlias","gql2pg","pg2gql","newWithHooks","pgStrictFunctions","strictFunctions","pgTweakFragmentForTypeAndModifier","graphql","GraphQLList","GraphQLString","GraphQLObjectType","GraphQLInputObjectType","getNamedType","isCompositeType","inflection","pgQueryFromResolveData","queryFromResolveData","pgAddStartEndCursor","addStartEndCursor","pgViaTemporaryTable","viaTemporaryTable","describePgEntity","sqlCommentByAddingTags","pgField","options","subscriptions","pgForbidSetofFunctionsToReturnNull","pgPrepareAndRun","Error","sliceAmount","argNames","argTypeIds","reduce","prev","_","idx","argModes","length","push","argTypes","typeId","typeById","argModesWithOutput","outputArgNames","includes","outputArgTypes","requiredArgCount","Math","max","argDefaultsNum","variantFromName","name","_type","match","variantFromTags","tags","variant","parseInt","notNullArgCount","isStrict","argGqlTypes","map","type","id","hint","class","chalk","bold","green","rawReturnType","returnTypeId","returnType","isPgArray","arrayItemType","returnTypeTable","classById","classId","fieldScope","payloadTypeScope","pgFieldIntrospection","pgIntrospection","returnFirstValueAsValue","TableType","isTableLike","isRecordLike","returnsSet","innerType","isPgFieldSimpleCollection","ConnectionType","connection","isPgFieldConnection","pgFieldIntrospectionTable","pgIntrospectionTable","RecordType","recordFunctionReturnType","recordFunctionConnection","connectionTypeName","scalarFunctionConnection","addDataGenerator","getDataFromParsedResolveInfoFragment","addArgDataGenerator","addPgCursorPrefix","pgCursorPrefix","literal","makeMutationCall","parsedResolveInfoFragment","ReturnType","implicitArgs","args","rawArgs","input","sqlArgValues","haveNames","argIndex","argName","gqlArgName","argument","value","sqlValue","sqlArgName","identifier","unshift","fragment","functionCall","namespace","join","makeQuery","sqlMutationQuery","functionAlias","parentQueryBuilder","resolveContext","resolveInfo","resolveData","isConnection","query","useAsterisk","language","withPagination","withPaginationAsFields","asJson","asJsonAggregate","addNullCase","innerQueryBuilder","select","primaryKeyConstraint","selectIdentifiers","context","rootValue","pgQuery","queryBuilder","parentTableAlias","getTableAlias","Symbol","alias","PayloadType","memo","resultFieldName","functionMutationResultFieldName","isNotVoid","String","functionPayloadType","description","functionMutationName","fields","Object","assign","clientMutationId","resolve","data","pgType","__origin","isMutationPayload","InputType","functionInputType","isMutationInput","scalarAwarePg2gql","v","notNull","_args","liveRecord","safeAlias","makeRecordLive","record","__identifiers","_record","records","pgClient","queryResultRows","intermediateIdentifier","isVoid","isPgRecord","isPgClass","namespaceName","e","text","values","compile","debugSql","enabled","queryResult","rows","row","result","fv"],"mappings":"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","sourcesContent":["// @flow\nconst nullableIf = (GraphQLNonNull, condition, Type) =>\n condition ? Type : new GraphQLNonNull(Type);\n\nimport type { Build, FieldWithHooksFunction } from \"graphile-build\";\nimport type { PgProc } from \"./PgIntrospectionPlugin\";\nimport type { SQL } from \"pg-sql2\";\nimport debugSql from \"./debugSql\";\nimport chalk from \"chalk\";\n\nconst firstValue = obj => {\n let firstKey;\n for (const k in obj) {\n if (k[0] !== \"_\" && k[1] !== \"_\") {\n firstKey = k;\n }\n }\n return obj[firstKey];\n};\n\nexport default function makeProcField(\n fieldName: string,\n proc: PgProc,\n build: {| ...Build |},\n {\n fieldWithHooks,\n computed = false,\n isMutation = false,\n isRootQuery = false,\n forceList = false,\n }: {\n fieldWithHooks: FieldWithHooksFunction,\n computed?: boolean,\n isMutation?: boolean,\n isRootQuery?: boolean,\n forceList?: boolean,\n }\n) {\n const {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgGetGqlTypeByTypeIdAndModifier,\n pgGetGqlInputTypeByTypeIdAndModifier,\n getTypeByName,\n pgSql: sql,\n parseResolveInfo,\n getSafeAliasFromResolveInfo,\n getSafeAliasFromAlias,\n gql2pg,\n pg2gql,\n newWithHooks,\n pgStrictFunctions: strictFunctions,\n pgTweakFragmentForTypeAndModifier,\n graphql: {\n GraphQLNonNull,\n GraphQLList,\n GraphQLString,\n GraphQLObjectType,\n GraphQLInputObjectType,\n getNamedType,\n isCompositeType,\n },\n inflection,\n pgQueryFromResolveData: queryFromResolveData,\n pgAddStartEndCursor: addStartEndCursor,\n pgViaTemporaryTable: viaTemporaryTable,\n describePgEntity,\n sqlCommentByAddingTags,\n pgField,\n options: {\n subscriptions = false,\n pgForbidSetofFunctionsToReturnNull = false,\n },\n pgPrepareAndRun,\n } = build;\n\n if (computed && isMutation) {\n throw new Error(\"Mutation procedure cannot be computed\");\n }\n const sliceAmount = computed ? 1 : 0;\n const argNames = proc.argTypeIds.reduce((prev, _, idx) => {\n if (\n idx >= sliceAmount && // Was a .slice() call\n (proc.argModes.length === 0 || // all args are `in`\n proc.argModes[idx] === \"i\" || // this arg is `in`\n proc.argModes[idx] === \"b\") // this arg is `inout`\n ) {\n prev.push(proc.argNames[idx] || \"\");\n }\n return prev;\n }, []);\n const argTypes = proc.argTypeIds.reduce((prev, typeId, idx) => {\n if (\n idx >= sliceAmount && // Was a .slice() call\n (proc.argModes.length === 0 || // all args are `in`\n proc.argModes[idx] === \"i\" || // this arg is `in`\n proc.argModes[idx] === \"b\") // this arg is `inout`\n ) {\n prev.push(introspectionResultsByKind.typeById[typeId]);\n }\n return prev;\n }, []);\n const argModesWithOutput = [\n \"o\", // OUT,\n \"b\", // INOUT\n \"t\", // TABLE\n ];\n const outputArgNames = proc.argTypeIds.reduce((prev, _, idx) => {\n if (argModesWithOutput.includes(proc.argModes[idx])) {\n prev.push(proc.argNames[idx] || \"\");\n }\n return prev;\n }, []);\n const outputArgTypes = proc.argTypeIds.reduce((prev, typeId, idx) => {\n if (argModesWithOutput.includes(proc.argModes[idx])) {\n prev.push(introspectionResultsByKind.typeById[typeId]);\n }\n return prev;\n }, []);\n const requiredArgCount = Math.max(0, argNames.length - proc.argDefaultsNum);\n const variantFromName = (name, _type) => {\n if (name.match(/(_p|P)atch$/)) {\n return \"patch\";\n }\n return null;\n };\n const variantFromTags = (tags, idx) => {\n const variant = tags[`arg${idx}variant`];\n if (variant && variant.match && variant.match(/^[0-9]+$/)) {\n return parseInt(variant, 10);\n }\n return variant;\n };\n const notNullArgCount =\n proc.isStrict || strictFunctions ? requiredArgCount : 0;\n const argGqlTypes = argTypes.map((type, idx) => {\n // TODO: PG10 doesn't support the equivalent of pg_attribute.atttypemod on function return values, but maybe a later version might\n const variant =\n variantFromTags(proc.tags, idx) || variantFromName(argNames[idx], type);\n const Type = pgGetGqlInputTypeByTypeIdAndModifier(type.id, variant);\n if (!Type) {\n const hint = type.class\n ? `; this might be because no INSERT column privileges are granted on ${describePgEntity(\n type.class\n )}. You can use 'Smart Comments' to tell PostGraphile to instead use the \"${chalk.bold.green(\n \"base\"\n )}\" input type which includes all columns:\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n [`arg${idx}variant`]: \"base\",\n }\n )}\\n`\n : \"\";\n throw new Error(\n `Could not determine type for argument ${idx} ('${\n argNames[idx]\n }') of function ${describePgEntity(proc)}${hint}`\n );\n }\n if (idx >= notNullArgCount) {\n return Type;\n } else {\n return new GraphQLNonNull(Type);\n }\n });\n\n const rawReturnType = introspectionResultsByKind.typeById[proc.returnTypeId];\n const returnType = rawReturnType.isPgArray\n ? rawReturnType.arrayItemType\n : rawReturnType;\n const returnTypeTable =\n introspectionResultsByKind.classById[returnType.classId];\n if (!returnType) {\n throw new Error(\n `Could not determine return type for function '${proc.name}'`\n );\n }\n let type;\n const fieldScope = {};\n const payloadTypeScope = {};\n fieldScope.pgFieldIntrospection = proc;\n payloadTypeScope.pgIntrospection = proc;\n let returnFirstValueAsValue = false;\n const TableType =\n returnTypeTable &&\n pgGetGqlTypeByTypeIdAndModifier(returnTypeTable.type.id, null);\n\n const isTableLike: boolean =\n (TableType && isCompositeType(TableType)) || false;\n const isRecordLike = returnType.id === \"2249\";\n if (isTableLike) {\n if (proc.returnsSet) {\n if (isMutation) {\n const innerType = pgForbidSetofFunctionsToReturnNull\n ? new GraphQLNonNull(TableType)\n : TableType;\n type = new GraphQLList(innerType);\n } else if (forceList) {\n const innerType = pgForbidSetofFunctionsToReturnNull\n ? new GraphQLNonNull(TableType)\n : TableType;\n type = new GraphQLList(innerType);\n fieldScope.isPgFieldSimpleCollection = true;\n } else {\n const ConnectionType = getTypeByName(\n inflection.connection(TableType.name)\n );\n if (!ConnectionType) {\n throw new Error(\n `Do not have a connection type '${inflection.connection(\n TableType.name\n )}' for '${TableType.name}' so cannot create procedure field`\n );\n }\n type = ConnectionType;\n fieldScope.isPgFieldConnection = true;\n }\n fieldScope.pgFieldIntrospectionTable = returnTypeTable;\n payloadTypeScope.pgIntrospectionTable = returnTypeTable;\n } else {\n type = TableType;\n if (rawReturnType.isPgArray) {\n // Not implementing pgForbidSetofFunctionsToReturnNull here because it's not a set\n type = new GraphQLList(type);\n }\n fieldScope.pgFieldIntrospectionTable = returnTypeTable;\n payloadTypeScope.pgIntrospectionTable = returnTypeTable;\n }\n } else if (isRecordLike) {\n const RecordType = getTypeByName(inflection.recordFunctionReturnType(proc));\n if (!RecordType) {\n throw new Error(\n `Do not have a record type '${inflection.recordFunctionReturnType(\n proc\n )}' for '${proc.name}' so cannot create procedure field`\n );\n }\n if (proc.returnsSet) {\n if (isMutation) {\n type = new GraphQLList(RecordType);\n } else if (forceList) {\n type = new GraphQLList(RecordType);\n fieldScope.isPgFieldSimpleCollection = true;\n } else {\n const ConnectionType = getTypeByName(\n inflection.recordFunctionConnection(proc)\n );\n if (!ConnectionType) {\n throw new Error(\n `Do not have a connection type '${inflection.recordFunctionConnection(\n proc\n )}' for '${RecordType.name}' so cannot create procedure field`\n );\n }\n type = ConnectionType;\n fieldScope.isPgFieldConnection = true;\n }\n } else {\n type = RecordType;\n if (rawReturnType.isPgArray) {\n type = new GraphQLList(type);\n }\n }\n } else {\n // TODO: PG10 doesn't support the equivalent of pg_attribute.atttypemod on function return values, but maybe a later version might\n const Type =\n pgGetGqlTypeByTypeIdAndModifier(returnType.id, null) || GraphQLString;\n\n if (proc.returnsSet) {\n const connectionTypeName = inflection.scalarFunctionConnection(proc);\n const ConnectionType = getTypeByName(connectionTypeName);\n if (isMutation) {\n // Cannot return a connection because it would have to run the mutation again\n type = new GraphQLList(Type);\n returnFirstValueAsValue = true;\n } else if (forceList || !ConnectionType) {\n type = new GraphQLList(Type);\n returnFirstValueAsValue = true;\n fieldScope.isPgFieldSimpleCollection = true;\n } else {\n type = ConnectionType;\n fieldScope.isPgFieldConnection = true;\n // We don't return the first value as the value here because it gets\n // sent down into PgScalarFunctionConnectionPlugin so the relevant\n // EdgeType can return cursor / node; i.e. we might want to add an\n // `__cursor` field so we can't just use a scalar.\n }\n } else {\n returnFirstValueAsValue = true;\n type = Type;\n if (rawReturnType.isPgArray) {\n type = new GraphQLList(type);\n }\n }\n }\n return fieldWithHooks(\n fieldName,\n ({\n addDataGenerator,\n getDataFromParsedResolveInfoFragment,\n addArgDataGenerator,\n }) => {\n if (\n proc.returnsSet &&\n !isTableLike &&\n !returnFirstValueAsValue &&\n !isMutation\n ) {\n // Natural ordering\n addArgDataGenerator(function addPgCursorPrefix() {\n return {\n pgCursorPrefix: sql.literal(\"natural\"),\n };\n });\n }\n function makeMutationCall(\n parsedResolveInfoFragment,\n ReturnType,\n { implicitArgs = [] } = {}\n ): SQL {\n const { args: rawArgs = {} } = parsedResolveInfoFragment;\n const args = isMutation ? rawArgs.input : rawArgs;\n const sqlArgValues = [];\n let haveNames = true;\n for (let argIndex = argNames.length - 1; argIndex >= 0; argIndex--) {\n const argName = argNames[argIndex];\n const gqlArgName = inflection.argument(argName, argIndex);\n const value = args[gqlArgName];\n const variant =\n variantFromTags(proc.tags, argIndex) ||\n variantFromName(argNames[argIndex], type);\n\n const sqlValue = gql2pg(value, argTypes[argIndex], variant);\n\n if (argIndex + 1 > requiredArgCount && haveNames && value == null) {\n // No need to pass argument to function\n continue;\n } else if (argIndex + 1 > requiredArgCount && haveNames) {\n const sqlArgName = argName ? sql.identifier(argName) : null;\n if (sqlArgName) {\n sqlArgValues.unshift(sql.fragment`${sqlArgName} := ${sqlValue}`);\n } else {\n haveNames = false;\n sqlArgValues.unshift(sqlValue);\n }\n } else {\n sqlArgValues.unshift(sqlValue);\n }\n }\n const functionCall = sql.fragment`${sql.identifier(\n proc.namespace.name,\n proc.name\n )}(${sql.join([...implicitArgs, ...sqlArgValues], \", \")})`;\n return rawReturnType.isPgArray\n ? sql.fragment`unnest(${functionCall})`\n : functionCall;\n }\n function makeQuery(\n parsedResolveInfoFragment,\n ReturnType,\n sqlMutationQuery,\n functionAlias,\n parentQueryBuilder,\n resolveContext,\n resolveInfo\n ) {\n const resolveData = getDataFromParsedResolveInfoFragment(\n parsedResolveInfoFragment,\n ReturnType\n );\n const isConnection = !forceList && !isMutation && proc.returnsSet;\n const query = queryFromResolveData(\n sqlMutationQuery,\n functionAlias,\n resolveData,\n {\n useAsterisk:\n !isMutation &&\n (isTableLike || isRecordLike) &&\n (forceList || proc.returnsSet || rawReturnType.isPgArray) && // only bother with lists\n proc.language !== \"sql\", // sql functions can be inlined, so GRANTs still apply\n withPagination: isConnection,\n withPaginationAsFields: isConnection && !computed,\n asJson:\n computed &&\n (forceList || (!proc.returnsSet && !returnFirstValueAsValue)),\n asJsonAggregate:\n computed &&\n (forceList || (!proc.returnsSet && rawReturnType.isPgArray)),\n addNullCase:\n !proc.returnsSet &&\n !rawReturnType.isPgArray &&\n (isTableLike || isRecordLike),\n },\n innerQueryBuilder => {\n innerQueryBuilder.parentQueryBuilder = parentQueryBuilder;\n if (!isTableLike) {\n if (returnTypeTable) {\n innerQueryBuilder.select(\n pgTweakFragmentForTypeAndModifier(\n sql.fragment`${functionAlias}`,\n returnTypeTable.type,\n null,\n resolveData\n ),\n \"value\"\n );\n } else {\n innerQueryBuilder.select(\n pgTweakFragmentForTypeAndModifier(\n sql.fragment`${functionAlias}`,\n returnType,\n null, // We can't determine a type modifier for functions\n resolveData\n ),\n \"value\"\n );\n }\n } else if (\n subscriptions &&\n returnTypeTable &&\n !isConnection &&\n returnTypeTable.primaryKeyConstraint\n ) {\n innerQueryBuilder.selectIdentifiers(returnTypeTable);\n }\n },\n parentQueryBuilder ? parentQueryBuilder.context : resolveContext,\n parentQueryBuilder\n ? parentQueryBuilder.rootValue\n : resolveInfo && resolveInfo.rootValue\n );\n return query;\n }\n if (computed) {\n addDataGenerator((parsedResolveInfoFragment, ReturnType) => {\n return {\n pgQuery: queryBuilder => {\n queryBuilder.select(() => {\n const parentTableAlias = queryBuilder.getTableAlias();\n const functionAlias = sql.identifier(Symbol());\n const sqlMutationQuery = makeMutationCall(\n parsedResolveInfoFragment,\n ReturnType,\n {\n implicitArgs: [parentTableAlias],\n }\n );\n const query = makeQuery(\n parsedResolveInfoFragment,\n ReturnType,\n sqlMutationQuery,\n functionAlias,\n queryBuilder\n );\n return sql.fragment`(${query})`;\n }, getSafeAliasFromAlias(parsedResolveInfoFragment.alias));\n },\n };\n });\n }\n\n let ReturnType = type;\n let PayloadType;\n let args = argNames.reduce((memo, argName, argIndex) => {\n const gqlArgName = inflection.argument(argName, argIndex);\n memo[gqlArgName] = {\n type: argGqlTypes[argIndex],\n };\n return memo;\n }, {});\n if (isMutation) {\n const resultFieldName = inflection.functionMutationResultFieldName(\n proc,\n getNamedType(type),\n proc.returnsSet || rawReturnType.isPgArray,\n outputArgNames\n );\n const isNotVoid = String(returnType.id) !== \"2278\";\n // If set then plural name\n PayloadType = newWithHooks(\n GraphQLObjectType,\n {\n name: inflection.functionPayloadType(proc),\n description: `The output of our \\`${inflection.functionMutationName(\n proc\n )}\\` mutation.`,\n fields: ({ fieldWithHooks }) => {\n return Object.assign(\n {},\n {\n clientMutationId: {\n type: GraphQLString,\n },\n },\n isNotVoid\n ? {\n [resultFieldName]: pgField(\n build,\n fieldWithHooks,\n resultFieldName,\n {\n type: type,\n ...(returnFirstValueAsValue\n ? {\n resolve(data) {\n return data.data;\n },\n }\n : null),\n },\n {},\n false,\n {\n pgType: returnType,\n }\n ),\n // Result\n }\n : null\n );\n },\n },\n {\n __origin: `Adding mutation function payload type for ${describePgEntity(\n proc\n )}. You can rename the function's GraphQL field (and its dependent types) via a 'Smart Comment':\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n name: \"newNameHere\",\n }\n )}`,\n isMutationPayload: true,\n ...payloadTypeScope,\n }\n );\n ReturnType = PayloadType;\n const InputType = newWithHooks(\n GraphQLInputObjectType,\n {\n name: inflection.functionInputType(proc),\n description: `All input for the \\`${inflection.functionMutationName(\n proc\n )}\\` mutation.`,\n fields: {\n clientMutationId: {\n type: GraphQLString,\n },\n ...args,\n },\n },\n {\n __origin: `Adding mutation function input type for ${describePgEntity(\n proc\n )}. You can rename the function's GraphQL field (and its dependent types) via a 'Smart Comment':\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n name: \"newNameHere\",\n }\n )}`,\n isMutationInput: true,\n }\n );\n args = {\n input: {\n type: new GraphQLNonNull(InputType),\n },\n };\n }\n // If this is a table we can process it directly; but if it's a scalar\n // setof function we must dereference '.value' from it, because this\n // makes space for '__cursor' to exist alongside it (whereas on a table\n // the '__cursor' can just be on the table object itself)\n const scalarAwarePg2gql = v =>\n isTableLike\n ? pg2gql(v, returnType)\n : {\n ...v,\n value: pg2gql(v.value, returnType),\n };\n\n return {\n description: proc.description\n ? proc.description\n : isMutation\n ? null\n : isTableLike && proc.returnsSet\n ? `Reads and enables pagination through a set of \\`${TableType.name}\\`.`\n : null,\n type: nullableIf(\n GraphQLNonNull,\n !proc.tags.notNull &&\n (!fieldScope.isPgFieldConnection || isMutation || isRootQuery),\n ReturnType\n ),\n args: args,\n resolve: computed\n ? (data, _args, resolveContext, resolveInfo) => {\n const liveRecord =\n resolveInfo.rootValue && resolveInfo.rootValue.liveRecord;\n const safeAlias = getSafeAliasFromResolveInfo(resolveInfo);\n const value = data[safeAlias];\n if (returnFirstValueAsValue) {\n // Is not table like; is not record like.\n if (proc.returnsSet && !forceList) {\n // EITHER `isMutation` is true, or `ConnectionType` does not\n // exist - either way, we're not returning a connection.\n return value.data.map(v => pg2gql(firstValue(v), returnType));\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n return value.map(v => pg2gql(firstValue(v), returnType));\n } else {\n return pg2gql(value, returnType);\n }\n } else {\n const makeRecordLive =\n subscriptions && isTableLike && returnTypeTable && liveRecord\n ? record => {\n if (record) {\n liveRecord(\n \"pg\",\n returnTypeTable,\n record.__identifiers\n );\n }\n }\n : _record => {};\n if (proc.returnsSet && !isMutation && !forceList) {\n // Connection - do not make live (the connection will handle this)\n return addStartEndCursor({\n ...value,\n data: value.data ? value.data.map(scalarAwarePg2gql) : null,\n });\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n // List\n const records = value.map(v => {\n makeRecordLive(v);\n return pg2gql(v, returnType);\n });\n return records;\n } else {\n // Object\n if (value) {\n makeRecordLive(value);\n }\n return pg2gql(value, returnType);\n }\n }\n }\n : async (data, args, resolveContext, resolveInfo) => {\n const { pgClient } = resolveContext;\n const liveRecord =\n resolveInfo.rootValue && resolveInfo.rootValue.liveRecord;\n const parsedResolveInfoFragment = parseResolveInfo(resolveInfo);\n parsedResolveInfoFragment.args = args; // Allow overriding via makeWrapResolversPlugin\n const functionAlias = sql.identifier(Symbol());\n const sqlMutationQuery = makeMutationCall(\n parsedResolveInfoFragment,\n resolveInfo.returnType,\n {}\n );\n\n let queryResultRows;\n if (isMutation) {\n const query = makeQuery(\n parsedResolveInfoFragment,\n resolveInfo.returnType,\n functionAlias,\n functionAlias,\n null,\n resolveContext,\n resolveInfo\n );\n const intermediateIdentifier = sql.identifier(Symbol());\n const isVoid = returnType.id === \"2278\";\n const isPgRecord = returnType.id === \"2249\";\n const isPgClass =\n !isPgRecord &&\n (!returnFirstValueAsValue || returnTypeTable || false);\n try {\n await pgClient.query(\"SAVEPOINT graphql_mutation\");\n queryResultRows = await viaTemporaryTable(\n pgClient,\n isVoid\n ? null\n : sql.identifier(\n returnType.namespaceName,\n returnType.name\n ),\n sql.query`select ${\n isPgClass\n ? sql.query`${intermediateIdentifier}.*`\n : isPgRecord\n ? sql.query`${intermediateIdentifier}.*`\n : sql.query`${intermediateIdentifier} as ${functionAlias}`\n } from ${sqlMutationQuery} ${intermediateIdentifier}`,\n functionAlias,\n query,\n isPgClass,\n isPgRecord\n ? {\n outputArgTypes,\n outputArgNames,\n }\n : null\n );\n await pgClient.query(\"RELEASE SAVEPOINT graphql_mutation\");\n } catch (e) {\n await pgClient.query(\n \"ROLLBACK TO SAVEPOINT graphql_mutation\"\n );\n throw e;\n }\n } else {\n const query = makeQuery(\n parsedResolveInfoFragment,\n resolveInfo.returnType,\n sqlMutationQuery,\n functionAlias,\n null,\n resolveContext,\n resolveInfo\n );\n const { text, values } = sql.compile(query);\n if (debugSql.enabled) debugSql(text);\n const queryResult = await pgPrepareAndRun(\n pgClient,\n text,\n values\n );\n queryResultRows = queryResult.rows;\n }\n const rows = queryResultRows;\n const [row] = rows;\n const result = (() => {\n const makeRecordLive =\n subscriptions && isTableLike && returnTypeTable && liveRecord\n ? record => {\n if (record) {\n liveRecord(\n \"pg\",\n returnTypeTable,\n record.__identifiers\n );\n }\n }\n : _record => {};\n if (returnFirstValueAsValue) {\n // `returnFirstValueAsValue` implies either `isMutation` is\n // true, or `ConnectionType` does not exist - either way,\n // we're not returning a connection.\n if (proc.returnsSet && !isMutation && !forceList) {\n return row.data.map(v => {\n const fv = firstValue(v);\n makeRecordLive(fv);\n return pg2gql(fv, returnType);\n });\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n return rows.map(v => {\n const fv = firstValue(v);\n makeRecordLive(fv);\n return pg2gql(fv, returnType);\n });\n } else {\n const fv = firstValue(row);\n makeRecordLive(fv);\n const record = pg2gql(fv, returnType);\n return record;\n }\n } else {\n if (proc.returnsSet && !isMutation && !forceList) {\n // Connection\n const data = row.data\n ? row.data.map(scalarAwarePg2gql)\n : null;\n return addStartEndCursor({\n ...row,\n data,\n });\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n // List\n return rows.map(row => {\n makeRecordLive(row);\n return pg2gql(row, returnType);\n });\n } else {\n // Object\n makeRecordLive(row);\n return pg2gql(row, returnType);\n }\n }\n })();\n if (isMutation) {\n return {\n clientMutationId: args.input.clientMutationId,\n data: result,\n };\n } else {\n return result;\n }\n },\n };\n },\n fieldScope\n );\n}\n"],"file":"makeProcField.js"}
1
+ {"version":3,"sources":["../../src/plugins/makeProcField.js"],"names":["nullableIf","GraphQLNonNull","condition","Type","firstValue","obj","firstKey","k","makeProcField","fieldName","proc","build","fieldWithHooks","computed","isMutation","isRootQuery","forceList","pgIntrospectionResultsByKind","introspectionResultsByKind","pgGetGqlTypeByTypeIdAndModifier","pgGetGqlInputTypeByTypeIdAndModifier","getTypeByName","pgSql","sql","parseResolveInfo","getSafeAliasFromResolveInfo","getSafeAliasFromAlias","gql2pg","pg2gql","newWithHooks","pgStrictFunctions","strictFunctions","pgTweakFragmentForTypeAndModifier","graphql","GraphQLList","GraphQLString","GraphQLObjectType","GraphQLInputObjectType","getNamedType","isCompositeType","inflection","pgQueryFromResolveData","queryFromResolveData","pgAddStartEndCursor","addStartEndCursor","pgViaTemporaryTable","viaTemporaryTable","describePgEntity","sqlCommentByAddingTags","pgField","options","subscriptions","pgForbidSetofFunctionsToReturnNull","pgPrepareAndRun","Error","sliceAmount","argNames","argTypeIds","reduce","prev","_","idx","argModes","length","push","argTypes","typeId","typeById","argModesWithOutput","outputArgNames","includes","outputArgTypes","requiredArgCount","Math","max","argDefaultsNum","variantFromName","name","_type","match","variantFromTags","tags","variant","parseInt","notNullArgCount","isStrict","argGqlTypes","map","type","id","hint","class","chalk","bold","green","rawReturnType","returnTypeId","returnType","isPgArray","arrayItemType","returnTypeTable","classById","classId","fieldScope","payloadTypeScope","pgFieldIntrospection","pgIntrospection","returnFirstValueAsValue","TableType","isTableLike","isRecordLike","returnsSet","innerType","isPgFieldSimpleCollection","ConnectionType","connection","isPgFieldConnection","pgFieldIntrospectionTable","pgIntrospectionTable","RecordType","recordFunctionReturnType","recordFunctionConnection","connectionTypeName","scalarFunctionConnection","addDataGenerator","getDataFromParsedResolveInfoFragment","addArgDataGenerator","addPgCursorPrefix","pgCursorPrefix","literal","makeMutationCall","parsedResolveInfoFragment","ReturnType","implicitArgs","args","rawArgs","input","sqlArgValues","haveNames","argIndex","argName","gqlArgName","argument","value","sqlValue","sqlArgName","identifier","unshift","fragment","functionCall","namespace","join","makeQuery","sqlMutationQuery","functionAlias","parentQueryBuilder","resolveContext","resolveInfo","resolveData","isConnection","query","useAsterisk","language","withPagination","withPaginationAsFields","asJson","asJsonAggregate","addNullCase","innerQueryBuilder","select","primaryKeyConstraint","selectIdentifiers","context","rootValue","pgQuery","queryBuilder","parentTableAlias","getTableAlias","Symbol","alias","PayloadType","memo","resultFieldName","functionMutationResultFieldName","isNotVoid","String","functionPayloadType","description","wrapDescription","functionMutationName","fields","Object","assign","clientMutationId","resolve","data","pgType","__origin","isMutationPayload","InputType","functionInputType","isMutationInput","scalarAwarePg2gql","v","notNull","_args","liveRecord","safeAlias","makeRecordLive","record","__identifiers","_record","records","pgClient","queryResultRows","intermediateIdentifier","isVoid","isPgRecord","isPgClass","namespaceName","e","text","values","compile","debugSql","enabled","queryResult","rows","row","result","fv"],"mappings":"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","sourcesContent":["// @flow\nconst nullableIf = (GraphQLNonNull, condition, Type) =>\n condition ? Type : new GraphQLNonNull(Type);\n\nimport type { Build, FieldWithHooksFunction } from \"graphile-build\";\nimport type { PgProc } from \"./PgIntrospectionPlugin\";\nimport type { SQL } from \"pg-sql2\";\nimport debugSql from \"./debugSql\";\nimport chalk from \"chalk\";\n\nconst firstValue = obj => {\n let firstKey;\n for (const k in obj) {\n if (k[0] !== \"_\" && k[1] !== \"_\") {\n firstKey = k;\n }\n }\n return obj[firstKey];\n};\n\nexport default function makeProcField(\n fieldName: string,\n proc: PgProc,\n build: {| ...Build |},\n {\n fieldWithHooks,\n computed = false,\n isMutation = false,\n isRootQuery = false,\n forceList = false,\n }: {\n fieldWithHooks: FieldWithHooksFunction,\n computed?: boolean,\n isMutation?: boolean,\n isRootQuery?: boolean,\n forceList?: boolean,\n }\n) {\n const {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgGetGqlTypeByTypeIdAndModifier,\n pgGetGqlInputTypeByTypeIdAndModifier,\n getTypeByName,\n pgSql: sql,\n parseResolveInfo,\n getSafeAliasFromResolveInfo,\n getSafeAliasFromAlias,\n gql2pg,\n pg2gql,\n newWithHooks,\n pgStrictFunctions: strictFunctions,\n pgTweakFragmentForTypeAndModifier,\n graphql: {\n GraphQLNonNull,\n GraphQLList,\n GraphQLString,\n GraphQLObjectType,\n GraphQLInputObjectType,\n getNamedType,\n isCompositeType,\n },\n inflection,\n pgQueryFromResolveData: queryFromResolveData,\n pgAddStartEndCursor: addStartEndCursor,\n pgViaTemporaryTable: viaTemporaryTable,\n describePgEntity,\n sqlCommentByAddingTags,\n pgField,\n options: {\n subscriptions = false,\n pgForbidSetofFunctionsToReturnNull = false,\n },\n pgPrepareAndRun,\n } = build;\n\n if (computed && isMutation) {\n throw new Error(\"Mutation procedure cannot be computed\");\n }\n const sliceAmount = computed ? 1 : 0;\n const argNames = proc.argTypeIds.reduce((prev, _, idx) => {\n if (\n idx >= sliceAmount && // Was a .slice() call\n (proc.argModes.length === 0 || // all args are `in`\n proc.argModes[idx] === \"i\" || // this arg is `in`\n proc.argModes[idx] === \"b\") // this arg is `inout`\n ) {\n prev.push(proc.argNames[idx] || \"\");\n }\n return prev;\n }, []);\n const argTypes = proc.argTypeIds.reduce((prev, typeId, idx) => {\n if (\n idx >= sliceAmount && // Was a .slice() call\n (proc.argModes.length === 0 || // all args are `in`\n proc.argModes[idx] === \"i\" || // this arg is `in`\n proc.argModes[idx] === \"b\") // this arg is `inout`\n ) {\n prev.push(introspectionResultsByKind.typeById[typeId]);\n }\n return prev;\n }, []);\n const argModesWithOutput = [\n \"o\", // OUT,\n \"b\", // INOUT\n \"t\", // TABLE\n ];\n const outputArgNames = proc.argTypeIds.reduce((prev, _, idx) => {\n if (argModesWithOutput.includes(proc.argModes[idx])) {\n prev.push(proc.argNames[idx] || \"\");\n }\n return prev;\n }, []);\n const outputArgTypes = proc.argTypeIds.reduce((prev, typeId, idx) => {\n if (argModesWithOutput.includes(proc.argModes[idx])) {\n prev.push(introspectionResultsByKind.typeById[typeId]);\n }\n return prev;\n }, []);\n const requiredArgCount = Math.max(0, argNames.length - proc.argDefaultsNum);\n const variantFromName = (name, _type) => {\n if (name.match(/(_p|P)atch$/)) {\n return \"patch\";\n }\n return null;\n };\n const variantFromTags = (tags, idx) => {\n const variant = tags[`arg${idx}variant`];\n if (variant && variant.match && variant.match(/^[0-9]+$/)) {\n return parseInt(variant, 10);\n }\n return variant;\n };\n const notNullArgCount =\n proc.isStrict || strictFunctions ? requiredArgCount : 0;\n const argGqlTypes = argTypes.map((type, idx) => {\n // TODO: PG10 doesn't support the equivalent of pg_attribute.atttypemod on function return values, but maybe a later version might\n const variant =\n variantFromTags(proc.tags, idx) || variantFromName(argNames[idx], type);\n const Type = pgGetGqlInputTypeByTypeIdAndModifier(type.id, variant);\n if (!Type) {\n const hint = type.class\n ? `; this might be because no INSERT column privileges are granted on ${describePgEntity(\n type.class\n )}. You can use 'Smart Comments' to tell PostGraphile to instead use the \"${chalk.bold.green(\n \"base\"\n )}\" input type which includes all columns:\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n [`arg${idx}variant`]: \"base\",\n }\n )}\\n`\n : \"\";\n throw new Error(\n `Could not determine type for argument ${idx} ('${\n argNames[idx]\n }') of function ${describePgEntity(proc)}${hint}`\n );\n }\n if (idx >= notNullArgCount) {\n return Type;\n } else {\n return new GraphQLNonNull(Type);\n }\n });\n\n const rawReturnType = introspectionResultsByKind.typeById[proc.returnTypeId];\n const returnType = rawReturnType.isPgArray\n ? rawReturnType.arrayItemType\n : rawReturnType;\n const returnTypeTable =\n introspectionResultsByKind.classById[returnType.classId];\n if (!returnType) {\n throw new Error(\n `Could not determine return type for function '${proc.name}'`\n );\n }\n let type;\n const fieldScope = {};\n const payloadTypeScope = {};\n fieldScope.pgFieldIntrospection = proc;\n payloadTypeScope.pgIntrospection = proc;\n let returnFirstValueAsValue = false;\n const TableType =\n returnTypeTable &&\n pgGetGqlTypeByTypeIdAndModifier(returnTypeTable.type.id, null);\n\n const isTableLike: boolean =\n (TableType && isCompositeType(TableType)) || false;\n const isRecordLike = returnType.id === \"2249\";\n if (isTableLike) {\n if (proc.returnsSet) {\n if (isMutation) {\n const innerType = pgForbidSetofFunctionsToReturnNull\n ? new GraphQLNonNull(TableType)\n : TableType;\n type = new GraphQLList(innerType);\n } else if (forceList) {\n const innerType = pgForbidSetofFunctionsToReturnNull\n ? new GraphQLNonNull(TableType)\n : TableType;\n type = new GraphQLList(innerType);\n fieldScope.isPgFieldSimpleCollection = true;\n } else {\n const ConnectionType = getTypeByName(\n inflection.connection(TableType.name)\n );\n if (!ConnectionType) {\n throw new Error(\n `Do not have a connection type '${inflection.connection(\n TableType.name\n )}' for '${TableType.name}' so cannot create procedure field`\n );\n }\n type = ConnectionType;\n fieldScope.isPgFieldConnection = true;\n }\n fieldScope.pgFieldIntrospectionTable = returnTypeTable;\n payloadTypeScope.pgIntrospectionTable = returnTypeTable;\n } else {\n type = TableType;\n if (rawReturnType.isPgArray) {\n // Not implementing pgForbidSetofFunctionsToReturnNull here because it's not a set\n type = new GraphQLList(type);\n }\n fieldScope.pgFieldIntrospectionTable = returnTypeTable;\n payloadTypeScope.pgIntrospectionTable = returnTypeTable;\n }\n } else if (isRecordLike) {\n const RecordType = getTypeByName(inflection.recordFunctionReturnType(proc));\n if (!RecordType) {\n throw new Error(\n `Do not have a record type '${inflection.recordFunctionReturnType(\n proc\n )}' for '${proc.name}' so cannot create procedure field`\n );\n }\n if (proc.returnsSet) {\n if (isMutation) {\n type = new GraphQLList(RecordType);\n } else if (forceList) {\n type = new GraphQLList(RecordType);\n fieldScope.isPgFieldSimpleCollection = true;\n } else {\n const ConnectionType = getTypeByName(\n inflection.recordFunctionConnection(proc)\n );\n if (!ConnectionType) {\n throw new Error(\n `Do not have a connection type '${inflection.recordFunctionConnection(\n proc\n )}' for '${RecordType.name}' so cannot create procedure field`\n );\n }\n type = ConnectionType;\n fieldScope.isPgFieldConnection = true;\n }\n } else {\n type = RecordType;\n if (rawReturnType.isPgArray) {\n type = new GraphQLList(type);\n }\n }\n } else {\n // TODO: PG10 doesn't support the equivalent of pg_attribute.atttypemod on function return values, but maybe a later version might\n const Type =\n pgGetGqlTypeByTypeIdAndModifier(returnType.id, null) || GraphQLString;\n\n if (proc.returnsSet) {\n const connectionTypeName = inflection.scalarFunctionConnection(proc);\n const ConnectionType = getTypeByName(connectionTypeName);\n if (isMutation) {\n // Cannot return a connection because it would have to run the mutation again\n type = new GraphQLList(Type);\n returnFirstValueAsValue = true;\n } else if (forceList || !ConnectionType) {\n type = new GraphQLList(Type);\n returnFirstValueAsValue = true;\n fieldScope.isPgFieldSimpleCollection = true;\n } else {\n type = ConnectionType;\n fieldScope.isPgFieldConnection = true;\n // We don't return the first value as the value here because it gets\n // sent down into PgScalarFunctionConnectionPlugin so the relevant\n // EdgeType can return cursor / node; i.e. we might want to add an\n // `__cursor` field so we can't just use a scalar.\n }\n } else {\n returnFirstValueAsValue = true;\n type = Type;\n if (rawReturnType.isPgArray) {\n type = new GraphQLList(type);\n }\n }\n }\n return fieldWithHooks(\n fieldName,\n ({\n addDataGenerator,\n getDataFromParsedResolveInfoFragment,\n addArgDataGenerator,\n }) => {\n if (\n proc.returnsSet &&\n !isTableLike &&\n !returnFirstValueAsValue &&\n !isMutation\n ) {\n // Natural ordering\n addArgDataGenerator(function addPgCursorPrefix() {\n return {\n pgCursorPrefix: sql.literal(\"natural\"),\n };\n });\n }\n function makeMutationCall(\n parsedResolveInfoFragment,\n ReturnType,\n { implicitArgs = [] } = {}\n ): SQL {\n const { args: rawArgs = {} } = parsedResolveInfoFragment;\n const args = isMutation ? rawArgs.input : rawArgs;\n const sqlArgValues = [];\n let haveNames = true;\n for (let argIndex = argNames.length - 1; argIndex >= 0; argIndex--) {\n const argName = argNames[argIndex];\n const gqlArgName = inflection.argument(argName, argIndex);\n const value = args[gqlArgName];\n const variant =\n variantFromTags(proc.tags, argIndex) ||\n variantFromName(argNames[argIndex], type);\n\n const sqlValue = gql2pg(value, argTypes[argIndex], variant);\n\n if (argIndex + 1 > requiredArgCount && haveNames && value == null) {\n // No need to pass argument to function\n continue;\n } else if (argIndex + 1 > requiredArgCount && haveNames) {\n const sqlArgName = argName ? sql.identifier(argName) : null;\n if (sqlArgName) {\n sqlArgValues.unshift(sql.fragment`${sqlArgName} := ${sqlValue}`);\n } else {\n haveNames = false;\n sqlArgValues.unshift(sqlValue);\n }\n } else {\n sqlArgValues.unshift(sqlValue);\n }\n }\n const functionCall = sql.fragment`${sql.identifier(\n proc.namespace.name,\n proc.name\n )}(${sql.join([...implicitArgs, ...sqlArgValues], \", \")})`;\n return rawReturnType.isPgArray\n ? sql.fragment`unnest(${functionCall})`\n : functionCall;\n }\n function makeQuery(\n parsedResolveInfoFragment,\n ReturnType,\n sqlMutationQuery,\n functionAlias,\n parentQueryBuilder,\n resolveContext,\n resolveInfo\n ) {\n const resolveData = getDataFromParsedResolveInfoFragment(\n parsedResolveInfoFragment,\n ReturnType\n );\n const isConnection = !forceList && !isMutation && proc.returnsSet;\n const query = queryFromResolveData(\n sqlMutationQuery,\n functionAlias,\n resolveData,\n {\n useAsterisk:\n !isMutation &&\n (isTableLike || isRecordLike) &&\n (forceList || proc.returnsSet || rawReturnType.isPgArray) && // only bother with lists\n proc.language !== \"sql\", // sql functions can be inlined, so GRANTs still apply\n withPagination: isConnection,\n withPaginationAsFields: isConnection && !computed,\n asJson:\n computed &&\n (forceList || (!proc.returnsSet && !returnFirstValueAsValue)),\n asJsonAggregate:\n computed &&\n (forceList || (!proc.returnsSet && rawReturnType.isPgArray)),\n addNullCase:\n !proc.returnsSet &&\n !rawReturnType.isPgArray &&\n (isTableLike || isRecordLike),\n },\n innerQueryBuilder => {\n innerQueryBuilder.parentQueryBuilder = parentQueryBuilder;\n if (!isTableLike) {\n if (returnTypeTable) {\n innerQueryBuilder.select(\n pgTweakFragmentForTypeAndModifier(\n sql.fragment`${functionAlias}`,\n returnTypeTable.type,\n null,\n resolveData\n ),\n \"value\"\n );\n } else {\n innerQueryBuilder.select(\n pgTweakFragmentForTypeAndModifier(\n sql.fragment`${functionAlias}`,\n returnType,\n null, // We can't determine a type modifier for functions\n resolveData\n ),\n \"value\"\n );\n }\n } else if (\n subscriptions &&\n returnTypeTable &&\n !isConnection &&\n returnTypeTable.primaryKeyConstraint\n ) {\n innerQueryBuilder.selectIdentifiers(returnTypeTable);\n }\n },\n parentQueryBuilder ? parentQueryBuilder.context : resolveContext,\n parentQueryBuilder\n ? parentQueryBuilder.rootValue\n : resolveInfo && resolveInfo.rootValue\n );\n return query;\n }\n if (computed) {\n addDataGenerator((parsedResolveInfoFragment, ReturnType) => {\n return {\n pgQuery: queryBuilder => {\n queryBuilder.select(() => {\n const parentTableAlias = queryBuilder.getTableAlias();\n const functionAlias = sql.identifier(Symbol());\n const sqlMutationQuery = makeMutationCall(\n parsedResolveInfoFragment,\n ReturnType,\n {\n implicitArgs: [parentTableAlias],\n }\n );\n const query = makeQuery(\n parsedResolveInfoFragment,\n ReturnType,\n sqlMutationQuery,\n functionAlias,\n queryBuilder\n );\n return sql.fragment`(${query})`;\n }, getSafeAliasFromAlias(parsedResolveInfoFragment.alias));\n },\n };\n });\n }\n\n let ReturnType = type;\n let PayloadType;\n let args = argNames.reduce((memo, argName, argIndex) => {\n const gqlArgName = inflection.argument(argName, argIndex);\n memo[gqlArgName] = {\n type: argGqlTypes[argIndex],\n };\n return memo;\n }, {});\n if (isMutation) {\n const resultFieldName = inflection.functionMutationResultFieldName(\n proc,\n getNamedType(type),\n proc.returnsSet || rawReturnType.isPgArray,\n outputArgNames\n );\n const isNotVoid = String(returnType.id) !== \"2278\";\n // If set then plural name\n PayloadType = newWithHooks(\n GraphQLObjectType,\n {\n name: inflection.functionPayloadType(proc),\n description: build.wrapDescription(\n `The output of our \\`${inflection.functionMutationName(\n proc\n )}\\` mutation.`,\n \"type\"\n ),\n fields: ({ fieldWithHooks }) => {\n return Object.assign(\n {},\n {\n clientMutationId: {\n type: GraphQLString,\n },\n },\n isNotVoid\n ? {\n [resultFieldName]: pgField(\n build,\n fieldWithHooks,\n resultFieldName,\n {\n type: type,\n ...(returnFirstValueAsValue\n ? {\n resolve(data) {\n return data.data;\n },\n }\n : null),\n },\n {},\n false,\n {\n pgType: returnType,\n }\n ),\n // Result\n }\n : null\n );\n },\n },\n {\n __origin: `Adding mutation function payload type for ${describePgEntity(\n proc\n )}. You can rename the function's GraphQL field (and its dependent types) via a 'Smart Comment':\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n name: \"newNameHere\",\n }\n )}`,\n isMutationPayload: true,\n ...payloadTypeScope,\n }\n );\n ReturnType = PayloadType;\n const InputType = newWithHooks(\n GraphQLInputObjectType,\n {\n name: inflection.functionInputType(proc),\n description: build.wrapDescription(\n `All input for the \\`${inflection.functionMutationName(\n proc\n )}\\` mutation.`,\n \"type\"\n ),\n fields: {\n clientMutationId: {\n type: GraphQLString,\n },\n ...args,\n },\n },\n {\n __origin: `Adding mutation function input type for ${describePgEntity(\n proc\n )}. You can rename the function's GraphQL field (and its dependent types) via a 'Smart Comment':\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n name: \"newNameHere\",\n }\n )}`,\n isMutationInput: true,\n }\n );\n args = {\n input: {\n type: new GraphQLNonNull(InputType),\n },\n };\n }\n // If this is a table we can process it directly; but if it's a scalar\n // setof function we must dereference '.value' from it, because this\n // makes space for '__cursor' to exist alongside it (whereas on a table\n // the '__cursor' can just be on the table object itself)\n const scalarAwarePg2gql = v =>\n isTableLike\n ? pg2gql(v, returnType)\n : {\n ...v,\n value: pg2gql(v.value, returnType),\n };\n\n return {\n description: proc.description\n ? proc.description\n : isMutation\n ? null\n : isTableLike && proc.returnsSet\n ? build.wrapDescription(\n `Reads and enables pagination through a set of \\`${TableType.name}\\`.`,\n \"field\"\n )\n : null,\n type: nullableIf(\n GraphQLNonNull,\n !proc.tags.notNull &&\n (!fieldScope.isPgFieldConnection || isMutation || isRootQuery),\n ReturnType\n ),\n args: args,\n resolve: computed\n ? (data, _args, resolveContext, resolveInfo) => {\n const liveRecord =\n resolveInfo.rootValue && resolveInfo.rootValue.liveRecord;\n const safeAlias = getSafeAliasFromResolveInfo(resolveInfo);\n const value = data[safeAlias];\n if (returnFirstValueAsValue) {\n // Is not table like; is not record like.\n if (proc.returnsSet && !forceList) {\n // EITHER `isMutation` is true, or `ConnectionType` does not\n // exist - either way, we're not returning a connection.\n return value.data.map(v => pg2gql(firstValue(v), returnType));\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n return value.map(v => pg2gql(firstValue(v), returnType));\n } else {\n return pg2gql(value, returnType);\n }\n } else {\n const makeRecordLive =\n subscriptions && isTableLike && returnTypeTable && liveRecord\n ? record => {\n if (record) {\n liveRecord(\n \"pg\",\n returnTypeTable,\n record.__identifiers\n );\n }\n }\n : _record => {};\n if (proc.returnsSet && !isMutation && !forceList) {\n // Connection - do not make live (the connection will handle this)\n return addStartEndCursor({\n ...value,\n data: value.data ? value.data.map(scalarAwarePg2gql) : null,\n });\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n // List\n const records = value.map(v => {\n makeRecordLive(v);\n return pg2gql(v, returnType);\n });\n return records;\n } else {\n // Object\n if (value) {\n makeRecordLive(value);\n }\n return pg2gql(value, returnType);\n }\n }\n }\n : async (data, args, resolveContext, resolveInfo) => {\n const { pgClient } = resolveContext;\n const liveRecord =\n resolveInfo.rootValue && resolveInfo.rootValue.liveRecord;\n const parsedResolveInfoFragment = parseResolveInfo(resolveInfo);\n parsedResolveInfoFragment.args = args; // Allow overriding via makeWrapResolversPlugin\n const functionAlias = sql.identifier(Symbol());\n const sqlMutationQuery = makeMutationCall(\n parsedResolveInfoFragment,\n resolveInfo.returnType,\n {}\n );\n\n let queryResultRows;\n if (isMutation) {\n const query = makeQuery(\n parsedResolveInfoFragment,\n resolveInfo.returnType,\n functionAlias,\n functionAlias,\n null,\n resolveContext,\n resolveInfo\n );\n const intermediateIdentifier = sql.identifier(Symbol());\n const isVoid = returnType.id === \"2278\";\n const isPgRecord = returnType.id === \"2249\";\n const isPgClass =\n !isPgRecord &&\n (!returnFirstValueAsValue || returnTypeTable || false);\n try {\n await pgClient.query(\"SAVEPOINT graphql_mutation\");\n queryResultRows = await viaTemporaryTable(\n pgClient,\n isVoid\n ? null\n : sql.identifier(\n returnType.namespaceName,\n returnType.name\n ),\n sql.query`select ${\n isPgClass\n ? sql.query`${intermediateIdentifier}.*`\n : isPgRecord\n ? sql.query`${intermediateIdentifier}.*`\n : sql.query`${intermediateIdentifier} as ${functionAlias}`\n } from ${sqlMutationQuery} ${intermediateIdentifier}`,\n functionAlias,\n query,\n isPgClass,\n isPgRecord\n ? {\n outputArgTypes,\n outputArgNames,\n }\n : null\n );\n await pgClient.query(\"RELEASE SAVEPOINT graphql_mutation\");\n } catch (e) {\n await pgClient.query(\n \"ROLLBACK TO SAVEPOINT graphql_mutation\"\n );\n throw e;\n }\n } else {\n const query = makeQuery(\n parsedResolveInfoFragment,\n resolveInfo.returnType,\n sqlMutationQuery,\n functionAlias,\n null,\n resolveContext,\n resolveInfo\n );\n const { text, values } = sql.compile(query);\n if (debugSql.enabled) debugSql(text);\n const queryResult = await pgPrepareAndRun(\n pgClient,\n text,\n values\n );\n queryResultRows = queryResult.rows;\n }\n const rows = queryResultRows;\n const [row] = rows;\n const result = (() => {\n const makeRecordLive =\n subscriptions && isTableLike && returnTypeTable && liveRecord\n ? record => {\n if (record) {\n liveRecord(\n \"pg\",\n returnTypeTable,\n record.__identifiers\n );\n }\n }\n : _record => {};\n if (returnFirstValueAsValue) {\n // `returnFirstValueAsValue` implies either `isMutation` is\n // true, or `ConnectionType` does not exist - either way,\n // we're not returning a connection.\n if (proc.returnsSet && !isMutation && !forceList) {\n return row.data.map(v => {\n const fv = firstValue(v);\n makeRecordLive(fv);\n return pg2gql(fv, returnType);\n });\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n return rows.map(v => {\n const fv = firstValue(v);\n makeRecordLive(fv);\n return pg2gql(fv, returnType);\n });\n } else {\n const fv = firstValue(row);\n makeRecordLive(fv);\n const record = pg2gql(fv, returnType);\n return record;\n }\n } else {\n if (proc.returnsSet && !isMutation && !forceList) {\n // Connection\n const data = row.data\n ? row.data.map(scalarAwarePg2gql)\n : null;\n return addStartEndCursor({\n ...row,\n data,\n });\n } else if (proc.returnsSet || rawReturnType.isPgArray) {\n // List\n return rows.map(row => {\n makeRecordLive(row);\n return pg2gql(row, returnType);\n });\n } else {\n // Object\n makeRecordLive(row);\n return pg2gql(row, returnType);\n }\n }\n })();\n if (isMutation) {\n return {\n clientMutationId: args.input.clientMutationId,\n data: result,\n };\n } else {\n return result;\n }\n },\n };\n },\n fieldScope\n );\n}\n"],"file":"makeProcField.js"}
@@ -106,7 +106,7 @@ async function viaTemporaryTable(pgClient, sqlTypeIdentifier, sqlMutationQuery,
106
106
  const convertFieldBack = isPgClassLike ? sql.query`\
107
107
  select (str::${sqlTypeIdentifier}).*
108
108
  from unnest((${sql.value(values)})::text[]) str` : isPgRecord ? sql.query`\
109
- select ${sql.join(outputArgNames.map((outputArgName, idx) => sql.query`(${sqlValuesAlias}.output_value_list)[${sql.literal(idx + 1)}]::${sql.identifier(outputArgTypes[idx].namespaceName, outputArgTypes[idx].name)} as ${sql.identifier( // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,
109
+ select ${sql.join(outputArgNames.map((outputArgName, idx) => sql.query`(${sqlValuesAlias}.output_value_list)[${sql.literal(idx + 1)}]::${outputArgTypes[idx].isFake ? sql.identifier("unknown") : sql.identifier(outputArgTypes[idx].namespaceName, outputArgTypes[idx].name)} as ${sql.identifier( // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,
110
110
  // "If you omit the name for an output argument, the system will choose a default column name."
111
111
  // In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.
112
112
  outputArgName !== "" ? outputArgName : `column${idx + 1}`)}`), ", ")}
@@ -124,10 +124,14 @@ select ${sql.join(
124
124
  (outputArgName, idx) =>
125
125
  sql.query`(${sqlValuesAlias}.output_value_list)[${sql.literal(
126
126
  idx + 1
127
- )}]::${sql.identifier(
128
- outputArgTypes[idx].namespaceName,
129
- outputArgTypes[idx].name
130
- )} as ${sql.identifier(
127
+ )}]::${
128
+ outputArgTypes[idx].isFake
129
+ ? sql.identifier("unknown")
130
+ : sql.identifier(
131
+ outputArgTypes[idx].namespaceName,
132
+ outputArgTypes[idx].name
133
+ )
134
+ } as ${sql.identifier(
131
135
  // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,
132
136
  // "If you omit the name for an output argument, the system will choose a default column name."
133
137
  // In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/viaTemporaryTable.js"],"names":["viaTemporaryTable","pgClient","sqlTypeIdentifier","sqlMutationQuery","sqlResultSourceAlias","sqlResultQuery","isPgClassLike","pgRecordInfo","undefined","isPgRecord","outputArgTypes","outputArgNames","performQuery","sqlQuery","text","values","sql","compile","debugSql","enabled","query","rows","selectionField","join","map","outputArgName","idx","identifier","result","firstNonNullRow","find","row","firstKey","Object","keys","rawValues","filter","rawValue","sqlValuesAlias","Symbol","convertFieldBack","value","literal","namespaceName","name","filteredValuesResults","length","finalRows","__isNull","shift"],"mappings":"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","sourcesContent":["// @flow\n\nimport * as sql from \"pg-sql2\";\nimport type { Client } from \"pg\";\nimport type { SQL, SQLQuery } from \"pg-sql2\";\nimport debugSql from \"./debugSql\";\n\n/*\n * Originally we tried this with a CTE, but:\n *\n * > The sub-statements in WITH are executed concurrently with each other and\n * > with the main query. Therefore, when using data-modifying statements in\n * > WITH, the order in which the specified updates actually happen is\n * > unpredictable. All the statements are executed with the same snapshot (see\n * > Chapter 13), so they cannot \"see\" one another's effects on the target\n * > tables. This alleviates the effects of the unpredictability of the actual\n * > order of row updates, and means that RETURNING data is the only way to\n * > communicate changes between different WITH sub-statements and the main\n * > query.\n *\n * -- https://www.postgresql.org/docs/9.6/static/queries-with.html\n *\n * This caused issues with computed columns that themselves went off and\n * performed selects - because the data within those selects used the old\n * snapshot and thus returned stale data.\n *\n * To solve this, we tried using temporary tables to ensure the mutation and\n * the select execute in different statments. This worked, but temporary tables\n * require elevated priviliges and thus don't work everywhere. We needed a more\n * generic solution.\n *\n * In the end we settled for sending the data we received from the mutations\n * straight back into the PostgreSQL server. It's a bit wasteful but it works.\n *\n * If you can come up with a better solution please open a pull request!\n */\n\nexport default async function viaTemporaryTable(\n pgClient: Client,\n sqlTypeIdentifier: ?SQL,\n sqlMutationQuery: SQL,\n sqlResultSourceAlias: SQL,\n sqlResultQuery: SQL,\n isPgClassLike: boolean = true,\n pgRecordInfo: ?{\n // eslint-disable-next-line flowtype/no-weak-types\n outputArgTypes: Array<any>,\n outputArgNames: Array<string>,\n } = undefined\n) {\n const isPgRecord = pgRecordInfo != null;\n const { outputArgTypes, outputArgNames } = pgRecordInfo || {};\n\n async function performQuery(pgClient: Client, sqlQuery: SQLQuery) {\n // TODO: look into rowMode = 'array'\n const { text, values } = sql.compile(sqlQuery);\n if (debugSql.enabled) debugSql(text);\n return pgClient.query(text, values);\n }\n\n if (!sqlTypeIdentifier) {\n // It returns void, just perform the query!\n const { rows } = await performQuery(\n pgClient,\n sql.query`with ${sqlResultSourceAlias} as (${sqlMutationQuery}) ${sqlResultQuery}`\n );\n return rows;\n } else {\n /*\n * In this code we're converting the rows to a string representation within\n * PostgreSQL itself, then we can send it back into PostgreSQL and have it\n * re-interpret the results cleanly (using it's own serializer/parser\n * combination) so we should be fairly confident that it will work\n * correctly every time assuming none of the PostgreSQL types are broken.\n *\n * If you have a way to improve this, I'd love to see a PR - but please\n * make sure that the integration tests pass with your solution first as\n * there are a log of potential pitfalls!\n */\n const selectionField = isPgClassLike\n ? /*\n * This `when foo is null then null` check might *seem* redundant, but it\n * is not - e.g. the compound type `(,,,,,,,)::my_type` and\n * `null::my_type` differ; however the former also returns true to `foo\n * is null`. We use this check to coalesce both into the canonical `null`\n * representation to make it easier to deal with below.\n */\n sql.query`(case when ${sqlResultSourceAlias} is null then null else ${sqlResultSourceAlias} end)`\n : isPgRecord\n ? sql.query`array[${sql.join(\n outputArgNames.map(\n (outputArgName, idx) =>\n sql.query`${sqlResultSourceAlias}.${sql.identifier(\n // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,\n // \"If you omit the name for an output argument, the system will choose a default column name.\"\n // In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.\n outputArgName !== \"\" ? outputArgName : `column${idx + 1}`\n )}::text`\n ),\n \" ,\"\n )}]`\n : sql.query`(${sqlResultSourceAlias}.${sqlResultSourceAlias})::${sqlTypeIdentifier}`;\n const result = await performQuery(\n pgClient,\n sql.query`with ${sqlResultSourceAlias} as (${sqlMutationQuery}) select (${selectionField})::text from ${sqlResultSourceAlias}`\n );\n const { rows } = result;\n const firstNonNullRow = rows.find(row => row !== null);\n // TODO: we should be able to have `pg` not interpret the results as\n // objects and instead just return them as arrays - then we can just do\n // `row[0]`. PR welcome!\n const firstKey = firstNonNullRow && Object.keys(firstNonNullRow)[0];\n const rawValues = rows.map(row => row && row[firstKey]);\n const values = rawValues.filter(rawValue => rawValue !== null);\n const sqlValuesAlias = sql.identifier(Symbol());\n const convertFieldBack = isPgClassLike\n ? sql.query`\\\nselect (str::${sqlTypeIdentifier}).*\nfrom unnest((${sql.value(values)})::text[]) str`\n : isPgRecord\n ? sql.query`\\\nselect ${sql.join(\n outputArgNames.map(\n (outputArgName, idx) =>\n sql.query`(${sqlValuesAlias}.output_value_list)[${sql.literal(\n idx + 1\n )}]::${sql.identifier(\n outputArgTypes[idx].namespaceName,\n outputArgTypes[idx].name\n )} as ${sql.identifier(\n // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,\n // \"If you omit the name for an output argument, the system will choose a default column name.\"\n // In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.\n outputArgName !== \"\" ? outputArgName : `column${idx + 1}`\n )}`\n ),\n \", \"\n )}\nfrom (values ${sql.join(\n values.map(value => sql.query`(${sql.value(value)}::text[])`),\n \", \"\n )}) as ${sqlValuesAlias}(output_value_list)`\n : sql.query`\\\nselect str::${sqlTypeIdentifier} as ${sqlResultSourceAlias}\nfrom unnest((${sql.value(values)})::text[]) str`;\n const { rows: filteredValuesResults } =\n values.length > 0\n ? await performQuery(\n pgClient,\n sql.query`with ${sqlResultSourceAlias} as (${convertFieldBack}) ${sqlResultQuery}`\n )\n : { rows: [] };\n const finalRows = rawValues.map(rawValue =>\n /*\n * We can't simply return 'null' here because this is expected to have\n * come from PG, and that would never return 'null' for a row - only\n * the fields within said row. Using `__isNull` here is a simple\n * workaround to this, that's caught by `pg2gql`.\n */\n rawValue === null ? { __isNull: true } : filteredValuesResults.shift()\n );\n return finalRows;\n }\n}\n"],"file":"viaTemporaryTable.js"}
1
+ {"version":3,"sources":["../../src/plugins/viaTemporaryTable.js"],"names":["viaTemporaryTable","pgClient","sqlTypeIdentifier","sqlMutationQuery","sqlResultSourceAlias","sqlResultQuery","isPgClassLike","pgRecordInfo","undefined","isPgRecord","outputArgTypes","outputArgNames","performQuery","sqlQuery","text","values","sql","compile","debugSql","enabled","query","rows","selectionField","join","map","outputArgName","idx","identifier","result","firstNonNullRow","find","row","firstKey","Object","keys","rawValues","filter","rawValue","sqlValuesAlias","Symbol","convertFieldBack","value","literal","isFake","namespaceName","name","filteredValuesResults","length","finalRows","__isNull","shift"],"mappings":"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","sourcesContent":["// @flow\n\nimport * as sql from \"pg-sql2\";\nimport type { Client } from \"pg\";\nimport type { SQL, SQLQuery } from \"pg-sql2\";\nimport debugSql from \"./debugSql\";\n\n/*\n * Originally we tried this with a CTE, but:\n *\n * > The sub-statements in WITH are executed concurrently with each other and\n * > with the main query. Therefore, when using data-modifying statements in\n * > WITH, the order in which the specified updates actually happen is\n * > unpredictable. All the statements are executed with the same snapshot (see\n * > Chapter 13), so they cannot \"see\" one another's effects on the target\n * > tables. This alleviates the effects of the unpredictability of the actual\n * > order of row updates, and means that RETURNING data is the only way to\n * > communicate changes between different WITH sub-statements and the main\n * > query.\n *\n * -- https://www.postgresql.org/docs/9.6/static/queries-with.html\n *\n * This caused issues with computed columns that themselves went off and\n * performed selects - because the data within those selects used the old\n * snapshot and thus returned stale data.\n *\n * To solve this, we tried using temporary tables to ensure the mutation and\n * the select execute in different statments. This worked, but temporary tables\n * require elevated priviliges and thus don't work everywhere. We needed a more\n * generic solution.\n *\n * In the end we settled for sending the data we received from the mutations\n * straight back into the PostgreSQL server. It's a bit wasteful but it works.\n *\n * If you can come up with a better solution please open a pull request!\n */\n\nexport default async function viaTemporaryTable(\n pgClient: Client,\n sqlTypeIdentifier: ?SQL,\n sqlMutationQuery: SQL,\n sqlResultSourceAlias: SQL,\n sqlResultQuery: SQL,\n isPgClassLike: boolean = true,\n pgRecordInfo: ?{\n // eslint-disable-next-line flowtype/no-weak-types\n outputArgTypes: Array<any>,\n outputArgNames: Array<string>,\n } = undefined\n) {\n const isPgRecord = pgRecordInfo != null;\n const { outputArgTypes, outputArgNames } = pgRecordInfo || {};\n\n async function performQuery(pgClient: Client, sqlQuery: SQLQuery) {\n // TODO: look into rowMode = 'array'\n const { text, values } = sql.compile(sqlQuery);\n if (debugSql.enabled) debugSql(text);\n return pgClient.query(text, values);\n }\n\n if (!sqlTypeIdentifier) {\n // It returns void, just perform the query!\n const { rows } = await performQuery(\n pgClient,\n sql.query`with ${sqlResultSourceAlias} as (${sqlMutationQuery}) ${sqlResultQuery}`\n );\n return rows;\n } else {\n /*\n * In this code we're converting the rows to a string representation within\n * PostgreSQL itself, then we can send it back into PostgreSQL and have it\n * re-interpret the results cleanly (using it's own serializer/parser\n * combination) so we should be fairly confident that it will work\n * correctly every time assuming none of the PostgreSQL types are broken.\n *\n * If you have a way to improve this, I'd love to see a PR - but please\n * make sure that the integration tests pass with your solution first as\n * there are a log of potential pitfalls!\n */\n const selectionField = isPgClassLike\n ? /*\n * This `when foo is null then null` check might *seem* redundant, but it\n * is not - e.g. the compound type `(,,,,,,,)::my_type` and\n * `null::my_type` differ; however the former also returns true to `foo\n * is null`. We use this check to coalesce both into the canonical `null`\n * representation to make it easier to deal with below.\n */\n sql.query`(case when ${sqlResultSourceAlias} is null then null else ${sqlResultSourceAlias} end)`\n : isPgRecord\n ? sql.query`array[${sql.join(\n outputArgNames.map(\n (outputArgName, idx) =>\n sql.query`${sqlResultSourceAlias}.${sql.identifier(\n // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,\n // \"If you omit the name for an output argument, the system will choose a default column name.\"\n // In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.\n outputArgName !== \"\" ? outputArgName : `column${idx + 1}`\n )}::text`\n ),\n \" ,\"\n )}]`\n : sql.query`(${sqlResultSourceAlias}.${sqlResultSourceAlias})::${sqlTypeIdentifier}`;\n const result = await performQuery(\n pgClient,\n sql.query`with ${sqlResultSourceAlias} as (${sqlMutationQuery}) select (${selectionField})::text from ${sqlResultSourceAlias}`\n );\n const { rows } = result;\n const firstNonNullRow = rows.find(row => row !== null);\n // TODO: we should be able to have `pg` not interpret the results as\n // objects and instead just return them as arrays - then we can just do\n // `row[0]`. PR welcome!\n const firstKey = firstNonNullRow && Object.keys(firstNonNullRow)[0];\n const rawValues = rows.map(row => row && row[firstKey]);\n const values = rawValues.filter(rawValue => rawValue !== null);\n const sqlValuesAlias = sql.identifier(Symbol());\n const convertFieldBack = isPgClassLike\n ? sql.query`\\\nselect (str::${sqlTypeIdentifier}).*\nfrom unnest((${sql.value(values)})::text[]) str`\n : isPgRecord\n ? sql.query`\\\nselect ${sql.join(\n outputArgNames.map(\n (outputArgName, idx) =>\n sql.query`(${sqlValuesAlias}.output_value_list)[${sql.literal(\n idx + 1\n )}]::${\n outputArgTypes[idx].isFake\n ? sql.identifier(\"unknown\")\n : sql.identifier(\n outputArgTypes[idx].namespaceName,\n outputArgTypes[idx].name\n )\n } as ${sql.identifier(\n // According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,\n // \"If you omit the name for an output argument, the system will choose a default column name.\"\n // In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.\n outputArgName !== \"\" ? outputArgName : `column${idx + 1}`\n )}`\n ),\n \", \"\n )}\nfrom (values ${sql.join(\n values.map(value => sql.query`(${sql.value(value)}::text[])`),\n \", \"\n )}) as ${sqlValuesAlias}(output_value_list)`\n : sql.query`\\\nselect str::${sqlTypeIdentifier} as ${sqlResultSourceAlias}\nfrom unnest((${sql.value(values)})::text[]) str`;\n const { rows: filteredValuesResults } =\n values.length > 0\n ? await performQuery(\n pgClient,\n sql.query`with ${sqlResultSourceAlias} as (${convertFieldBack}) ${sqlResultQuery}`\n )\n : { rows: [] };\n const finalRows = rawValues.map(rawValue =>\n /*\n * We can't simply return 'null' here because this is expected to have\n * come from PG, and that would never return 'null' for a row - only\n * the fields within said row. Using `__isNull` here is a simple\n * workaround to this, that's caught by `pg2gql`.\n */\n rawValue === null ? { __isNull: true } : filteredValuesResults.shift()\n );\n return finalRows;\n }\n}\n"],"file":"viaTemporaryTable.js"}
@@ -16,41 +16,20 @@ const DAY = `${NUMBER}\\s+days?`; // NOTE: PostgreSQL automatically overflows se
16
16
  // overflow into days, so could be arbitrarily long.
17
17
 
18
18
  const TIME = "([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?)";
19
- const INTERVAL = new RegExp("^\\s*" + // All parts of an interval are optional
20
- [YEAR, MONTH, DAY, TIME].map(str => "(?:" + str + ")?").join("\\s*") + "\\s*$");
21
- // All intervals will have exactly these properties:
22
- const BASE = Object.freeze({
23
- years: 0,
24
- months: 0,
25
- days: 0,
26
- hours: 0,
27
- minutes: 0,
28
- seconds: 0.0
29
- });
19
+ const INTERVAL = new RegExp("^" + // All parts of an interval are optional
20
+ [YEAR, MONTH, DAY, TIME].map(str => "(?:" + str + ")?").join("\\s*") + "$");
30
21
 
31
22
  function parseInterval(interval) {
32
- const result = { ...BASE
33
- };
34
-
35
- if (!interval) {
36
- return result;
37
- }
38
-
39
- const matches = INTERVAL.exec(interval);
40
-
41
- if (!matches) {
42
- throw new Error(`Failed to parse interval '${interval}' from PostgreSQL`);
43
- }
44
-
45
- const [, years, months, days, plusMinusTime, hours, minutes, seconds] = matches;
23
+ const [, years, months, days, plusMinusTime, hours, minutes, seconds] = INTERVAL.exec(interval || "") || [];
46
24
  const timeMultiplier = plusMinusTime === "-" ? -1 : 1;
47
- if (years) result.years = parseInt(years, 10);
48
- if (months) result.months = parseInt(months, 10);
49
- if (days) result.days = parseInt(days, 10);
50
- if (hours) result.hours = timeMultiplier * parseInt(hours, 10);
51
- if (minutes) result.minutes = timeMultiplier * parseInt(minutes, 10); // Seconds can be decimal; all other values are integer
52
-
53
- if (seconds) result.seconds = timeMultiplier * parseFloat(seconds);
54
- return result;
25
+ return {
26
+ years: years ? parseInt(years, 10) : 0,
27
+ months: months ? parseInt(months, 10) : 0,
28
+ days: days ? parseInt(days, 10) : 0,
29
+ hours: hours ? timeMultiplier * parseInt(hours, 10) : 0,
30
+ minutes: minutes ? timeMultiplier * parseInt(minutes, 10) : 0,
31
+ // Seconds can be decimal; all other values are integer
32
+ seconds: seconds ? timeMultiplier * parseFloat(seconds) : 0
33
+ };
55
34
  }
56
35
  //# sourceMappingURL=postgresInterval.js.map
@@ -1,5 +1,14 @@
1
1
  // @flow
2
2
 
3
+ export type Interval = {
4
+ years: number,
5
+ months: number,
6
+ days: number,
7
+ hours: number,
8
+ minutes: number,
9
+ seconds: number,
10
+ };
11
+
3
12
  // Regexp construction enhanced from `postgres-interval`, which is licensed
4
13
  // under the MIT license and is copyright (c) Ben Drucker <bvdrucker@gmail.com>
5
14
  // (bendrucker.me).
@@ -15,63 +24,25 @@ const DAY = `${NUMBER}\\s+days?`;
15
24
  const TIME = "([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?)";
16
25
 
17
26
  const INTERVAL = new RegExp(
18
- "^\\s*" +
27
+ "^" +
19
28
  // All parts of an interval are optional
20
29
  [YEAR, MONTH, DAY, TIME].map(str => "(?:" + str + ")?").join("\\s*") +
21
- "\\s*$"
30
+ "$"
22
31
  );
23
32
 
24
- export type Interval = {
25
- years: number,
26
- months: number,
27
- days: number,
28
- hours: number,
29
- minutes: number,
30
- seconds: number,
31
- };
32
-
33
- // All intervals will have exactly these properties:
34
- const BASE: Interval = Object.freeze({
35
- years: 0,
36
- months: 0,
37
- days: 0,
38
- hours: 0,
39
- minutes: 0,
40
- seconds: 0.0,
41
- });
42
-
43
33
  export function parseInterval(interval: string): Interval {
44
- const result = { ...BASE };
45
-
46
- if (!interval) {
47
- return result;
48
- }
49
-
50
- const matches = INTERVAL.exec(interval);
51
- if (!matches) {
52
- throw new Error(`Failed to parse interval '${interval}' from PostgreSQL`);
53
- }
54
-
55
- const [
56
- ,
57
- years,
58
- months,
59
- days,
60
- plusMinusTime,
61
- hours,
62
- minutes,
63
- seconds,
64
- ] = matches;
34
+ const [, years, months, days, plusMinusTime, hours, minutes, seconds] =
35
+ INTERVAL.exec(interval || "") || [];
65
36
 
66
37
  const timeMultiplier = plusMinusTime === "-" ? -1 : 1;
67
38
 
68
- if (years) result.years = parseInt(years, 10);
69
- if (months) result.months = parseInt(months, 10);
70
- if (days) result.days = parseInt(days, 10);
71
- if (hours) result.hours = timeMultiplier * parseInt(hours, 10);
72
- if (minutes) result.minutes = timeMultiplier * parseInt(minutes, 10);
73
- // Seconds can be decimal; all other values are integer
74
- if (seconds) result.seconds = timeMultiplier * parseFloat(seconds);
75
-
76
- return result;
39
+ return {
40
+ years: years ? parseInt(years, 10) : 0,
41
+ months: months ? parseInt(months, 10) : 0,
42
+ days: days ? parseInt(days, 10) : 0,
43
+ hours: hours ? timeMultiplier * parseInt(hours, 10) : 0,
44
+ minutes: minutes ? timeMultiplier * parseInt(minutes, 10) : 0,
45
+ // Seconds can be decimal; all other values are integer
46
+ seconds: seconds ? timeMultiplier * parseFloat(seconds) : 0,
47
+ };
77
48
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/postgresInterval.js"],"names":["NUMBER","YEAR","MONTH","DAY","TIME","INTERVAL","RegExp","map","str","join","BASE","Object","freeze","years","months","days","hours","minutes","seconds","parseInterval","interval","result","matches","exec","Error","plusMinusTime","timeMultiplier","parseInt","parseFloat"],"mappings":";;;;;;AAEA;AACA;AACA;AAEA,MAAMA,MAAM,GAAG,aAAf;AACA,MAAMC,IAAI,GAAI,GAAED,MAAO,YAAvB;AACA,MAAME,KAAK,GAAI,GAAEF,MAAO,WAAxB;AACA,MAAMG,GAAG,GAAI,GAAEH,MAAO,WAAtB,C,CACA;AACA;AACA;AACA;;AACA,MAAMI,IAAI,GAAG,iDAAb;AAEA,MAAMC,QAAQ,GAAG,IAAIC,MAAJ,CACf,UACE;AACA,CAACL,IAAD,EAAOC,KAAP,EAAcC,GAAd,EAAmBC,IAAnB,EAAyBG,GAAzB,CAA6BC,GAAG,IAAI,QAAQA,GAAR,GAAc,IAAlD,EAAwDC,IAAxD,CAA6D,MAA7D,CAFF,GAGE,OAJa,CAAjB;AAgBA;AACA,MAAMC,IAAc,GAAGC,MAAM,CAACC,MAAP,CAAc;AACnCC,EAAAA,KAAK,EAAE,CAD4B;AAEnCC,EAAAA,MAAM,EAAE,CAF2B;AAGnCC,EAAAA,IAAI,EAAE,CAH6B;AAInCC,EAAAA,KAAK,EAAE,CAJ4B;AAKnCC,EAAAA,OAAO,EAAE,CAL0B;AAMnCC,EAAAA,OAAO,EAAE;AAN0B,CAAd,CAAvB;;AASO,SAASC,aAAT,CAAuBC,QAAvB,EAAmD;AACxD,QAAMC,MAAM,GAAG,EAAE,GAAGX;AAAL,GAAf;;AAEA,MAAI,CAACU,QAAL,EAAe;AACb,WAAOC,MAAP;AACD;;AAED,QAAMC,OAAO,GAAGjB,QAAQ,CAACkB,IAAT,CAAcH,QAAd,CAAhB;;AACA,MAAI,CAACE,OAAL,EAAc;AACZ,UAAM,IAAIE,KAAJ,CAAW,6BAA4BJ,QAAS,mBAAhD,CAAN;AACD;;AAED,QAAM,GAEJP,KAFI,EAGJC,MAHI,EAIJC,IAJI,EAKJU,aALI,EAMJT,KANI,EAOJC,OAPI,EAQJC,OARI,IASFI,OATJ;AAWA,QAAMI,cAAc,GAAGD,aAAa,KAAK,GAAlB,GAAwB,CAAC,CAAzB,GAA6B,CAApD;AAEA,MAAIZ,KAAJ,EAAWQ,MAAM,CAACR,KAAP,GAAec,QAAQ,CAACd,KAAD,EAAQ,EAAR,CAAvB;AACX,MAAIC,MAAJ,EAAYO,MAAM,CAACP,MAAP,GAAgBa,QAAQ,CAACb,MAAD,EAAS,EAAT,CAAxB;AACZ,MAAIC,IAAJ,EAAUM,MAAM,CAACN,IAAP,GAAcY,QAAQ,CAACZ,IAAD,EAAO,EAAP,CAAtB;AACV,MAAIC,KAAJ,EAAWK,MAAM,CAACL,KAAP,GAAeU,cAAc,GAAGC,QAAQ,CAACX,KAAD,EAAQ,EAAR,CAAxC;AACX,MAAIC,OAAJ,EAAaI,MAAM,CAACJ,OAAP,GAAiBS,cAAc,GAAGC,QAAQ,CAACV,OAAD,EAAU,EAAV,CAA1C,CA7B2C,CA8BxD;;AACA,MAAIC,OAAJ,EAAaG,MAAM,CAACH,OAAP,GAAiBQ,cAAc,GAAGE,UAAU,CAACV,OAAD,CAA5C;AAEb,SAAOG,MAAP;AACD","sourcesContent":["// @flow\n\n// Regexp construction enhanced from `postgres-interval`, which is licensed\n// under the MIT license and is copyright (c) Ben Drucker <bvdrucker@gmail.com>\n// (bendrucker.me).\n\nconst NUMBER = \"([+-]?\\\\d+)\";\nconst YEAR = `${NUMBER}\\\\s+years?`;\nconst MONTH = `${NUMBER}\\\\s+mons?`;\nconst DAY = `${NUMBER}\\\\s+days?`;\n// NOTE: PostgreSQL automatically overflows seconds into minutes and minutes\n// into hours, so we can rely on minutes and seconds always being 2 digits\n// (plus decimal for seconds). The overflow stops at hours - hours do not\n// overflow into days, so could be arbitrarily long.\nconst TIME = \"([+-])?(\\\\d+):(\\\\d\\\\d):(\\\\d\\\\d(?:\\\\.\\\\d{1,6})?)\";\n\nconst INTERVAL = new RegExp(\n \"^\\\\s*\" +\n // All parts of an interval are optional\n [YEAR, MONTH, DAY, TIME].map(str => \"(?:\" + str + \")?\").join(\"\\\\s*\") +\n \"\\\\s*$\"\n);\n\nexport type Interval = {\n years: number,\n months: number,\n days: number,\n hours: number,\n minutes: number,\n seconds: number,\n};\n\n// All intervals will have exactly these properties:\nconst BASE: Interval = Object.freeze({\n years: 0,\n months: 0,\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0.0,\n});\n\nexport function parseInterval(interval: string): Interval {\n const result = { ...BASE };\n\n if (!interval) {\n return result;\n }\n\n const matches = INTERVAL.exec(interval);\n if (!matches) {\n throw new Error(`Failed to parse interval '${interval}' from PostgreSQL`);\n }\n\n const [\n ,\n years,\n months,\n days,\n plusMinusTime,\n hours,\n minutes,\n seconds,\n ] = matches;\n\n const timeMultiplier = plusMinusTime === \"-\" ? -1 : 1;\n\n if (years) result.years = parseInt(years, 10);\n if (months) result.months = parseInt(months, 10);\n if (days) result.days = parseInt(days, 10);\n if (hours) result.hours = timeMultiplier * parseInt(hours, 10);\n if (minutes) result.minutes = timeMultiplier * parseInt(minutes, 10);\n // Seconds can be decimal; all other values are integer\n if (seconds) result.seconds = timeMultiplier * parseFloat(seconds);\n\n return result;\n}\n"],"file":"postgresInterval.js"}
1
+ {"version":3,"sources":["../src/postgresInterval.js"],"names":["NUMBER","YEAR","MONTH","DAY","TIME","INTERVAL","RegExp","map","str","join","parseInterval","interval","years","months","days","plusMinusTime","hours","minutes","seconds","exec","timeMultiplier","parseInt","parseFloat"],"mappings":";;;;;;AAWA;AACA;AACA;AAEA,MAAMA,MAAM,GAAG,aAAf;AACA,MAAMC,IAAI,GAAI,GAAED,MAAO,YAAvB;AACA,MAAME,KAAK,GAAI,GAAEF,MAAO,WAAxB;AACA,MAAMG,GAAG,GAAI,GAAEH,MAAO,WAAtB,C,CACA;AACA;AACA;AACA;;AACA,MAAMI,IAAI,GAAG,iDAAb;AAEA,MAAMC,QAAQ,GAAG,IAAIC,MAAJ,CACf,MACE;AACA,CAACL,IAAD,EAAOC,KAAP,EAAcC,GAAd,EAAmBC,IAAnB,EAAyBG,GAAzB,CAA6BC,GAAG,IAAI,QAAQA,GAAR,GAAc,IAAlD,EAAwDC,IAAxD,CAA6D,MAA7D,CAFF,GAGE,GAJa,CAAjB;;AAOO,SAASC,aAAT,CAAuBC,QAAvB,EAAmD;AACxD,QAAM,GAAGC,KAAH,EAAUC,MAAV,EAAkBC,IAAlB,EAAwBC,aAAxB,EAAuCC,KAAvC,EAA8CC,OAA9C,EAAuDC,OAAvD,IACJb,QAAQ,CAACc,IAAT,CAAcR,QAAQ,IAAI,EAA1B,KAAiC,EADnC;AAGA,QAAMS,cAAc,GAAGL,aAAa,KAAK,GAAlB,GAAwB,CAAC,CAAzB,GAA6B,CAApD;AAEA,SAAO;AACLH,IAAAA,KAAK,EAAEA,KAAK,GAAGS,QAAQ,CAACT,KAAD,EAAQ,EAAR,CAAX,GAAyB,CADhC;AAELC,IAAAA,MAAM,EAAEA,MAAM,GAAGQ,QAAQ,CAACR,MAAD,EAAS,EAAT,CAAX,GAA0B,CAFnC;AAGLC,IAAAA,IAAI,EAAEA,IAAI,GAAGO,QAAQ,CAACP,IAAD,EAAO,EAAP,CAAX,GAAwB,CAH7B;AAILE,IAAAA,KAAK,EAAEA,KAAK,GAAGI,cAAc,GAAGC,QAAQ,CAACL,KAAD,EAAQ,EAAR,CAA5B,GAA0C,CAJjD;AAKLC,IAAAA,OAAO,EAAEA,OAAO,GAAGG,cAAc,GAAGC,QAAQ,CAACJ,OAAD,EAAU,EAAV,CAA5B,GAA4C,CALvD;AAML;AACAC,IAAAA,OAAO,EAAEA,OAAO,GAAGE,cAAc,GAAGE,UAAU,CAACJ,OAAD,CAA9B,GAA0C;AAPrD,GAAP;AASD","sourcesContent":["// @flow\n\nexport type Interval = {\n years: number,\n months: number,\n days: number,\n hours: number,\n minutes: number,\n seconds: number,\n};\n\n// Regexp construction enhanced from `postgres-interval`, which is licensed\n// under the MIT license and is copyright (c) Ben Drucker <bvdrucker@gmail.com>\n// (bendrucker.me).\n\nconst NUMBER = \"([+-]?\\\\d+)\";\nconst YEAR = `${NUMBER}\\\\s+years?`;\nconst MONTH = `${NUMBER}\\\\s+mons?`;\nconst DAY = `${NUMBER}\\\\s+days?`;\n// NOTE: PostgreSQL automatically overflows seconds into minutes and minutes\n// into hours, so we can rely on minutes and seconds always being 2 digits\n// (plus decimal for seconds). The overflow stops at hours - hours do not\n// overflow into days, so could be arbitrarily long.\nconst TIME = \"([+-])?(\\\\d+):(\\\\d\\\\d):(\\\\d\\\\d(?:\\\\.\\\\d{1,6})?)\";\n\nconst INTERVAL = new RegExp(\n \"^\" +\n // All parts of an interval are optional\n [YEAR, MONTH, DAY, TIME].map(str => \"(?:\" + str + \")?\").join(\"\\\\s*\") +\n \"$\"\n);\n\nexport function parseInterval(interval: string): Interval {\n const [, years, months, days, plusMinusTime, hours, minutes, seconds] =\n INTERVAL.exec(interval || \"\") || [];\n\n const timeMultiplier = plusMinusTime === \"-\" ? -1 : 1;\n\n return {\n years: years ? parseInt(years, 10) : 0,\n months: months ? parseInt(months, 10) : 0,\n days: days ? parseInt(days, 10) : 0,\n hours: hours ? timeMultiplier * parseInt(hours, 10) : 0,\n minutes: minutes ? timeMultiplier * parseInt(minutes, 10) : 0,\n // Seconds can be decimal; all other values are integer\n seconds: seconds ? timeMultiplier * parseFloat(seconds) : 0,\n };\n}\n"],"file":"postgresInterval.js"}