graphile-build-pg 4.14.0 → 4.14.1
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.
- package/README.md +4 -10
- package/node8plus/GraphQLJSON.js +0 -11
- package/node8plus/GraphQLJSON.js.map +1 -1
- package/node8plus/PgLiveProvider.js +4 -11
- package/node8plus/PgLiveProvider.js.map +1 -1
- package/node8plus/QueryBuilder.js +42 -176
- package/node8plus/QueryBuilder.js.map +1 -1
- package/node8plus/index.js +8 -47
- package/node8plus/index.js.map +1 -1
- package/node8plus/inflections.js +9 -61
- package/node8plus/inflections.js.map +1 -1
- package/node8plus/omit.js +7 -22
- package/node8plus/omit.js.map +1 -1
- package/node8plus/parseIdentifier.js +0 -1
- package/node8plus/parseIdentifier.js.map +1 -1
- package/node8plus/pgPrepareAndRun.js +2 -14
- package/node8plus/pgPrepareAndRun.js.map +1 -1
- package/node8plus/plugins/PageInfoStartEndCursor.js +0 -4
- package/node8plus/plugins/PageInfoStartEndCursor.js.map +1 -1
- package/node8plus/plugins/PgAllRows.js +0 -29
- package/node8plus/plugins/PgAllRows.js.map +1 -1
- package/node8plus/plugins/PgBackwardRelationPlugin.js +2 -41
- package/node8plus/plugins/PgBackwardRelationPlugin.js.map +1 -1
- package/node8plus/plugins/PgBasicsPlugin.js +20 -147
- package/node8plus/plugins/PgBasicsPlugin.js.map +1 -1
- package/node8plus/plugins/PgColumnDeprecationPlugin.js +2 -5
- package/node8plus/plugins/PgColumnDeprecationPlugin.js.map +1 -1
- package/node8plus/plugins/PgColumnsPlugin.js +4 -17
- package/node8plus/plugins/PgColumnsPlugin.js.map +1 -1
- package/node8plus/plugins/PgComputedColumnsPlugin.js +4 -19
- package/node8plus/plugins/PgComputedColumnsPlugin.js.map +1 -1
- package/node8plus/plugins/PgConditionComputedColumnPlugin.js +12 -23
- package/node8plus/plugins/PgConditionComputedColumnPlugin.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgCondition.js +1 -9
- package/node8plus/plugins/PgConnectionArgCondition.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js +0 -12
- package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgOrderBy.js +2 -19
- package/node8plus/plugins/PgConnectionArgOrderBy.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgOrderByDefaultValue.js +0 -6
- package/node8plus/plugins/PgConnectionArgOrderByDefaultValue.js.map +1 -1
- package/node8plus/plugins/PgConnectionTotalCount.js +0 -8
- package/node8plus/plugins/PgConnectionTotalCount.js.map +1 -1
- package/node8plus/plugins/PgForwardRelationPlugin.js +2 -25
- package/node8plus/plugins/PgForwardRelationPlugin.js.map +1 -1
- package/node8plus/plugins/PgIntrospectionPlugin.js +75 -177
- package/node8plus/plugins/PgIntrospectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgJWTPlugin.js +2 -18
- package/node8plus/plugins/PgJWTPlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationCreatePlugin.js +0 -18
- package/node8plus/plugins/PgMutationCreatePlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationPayloadEdgePlugin.js +4 -25
- package/node8plus/plugins/PgMutationPayloadEdgePlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationProceduresPlugin.js +0 -6
- package/node8plus/plugins/PgMutationProceduresPlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js +14 -49
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.flow +5 -2
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.map +1 -1
- package/node8plus/plugins/PgNodeAliasPostGraphile.js +0 -6
- package/node8plus/plugins/PgNodeAliasPostGraphile.js.map +1 -1
- package/node8plus/plugins/PgOrderAllColumnsPlugin.js +0 -4
- package/node8plus/plugins/PgOrderAllColumnsPlugin.js.map +1 -1
- package/node8plus/plugins/PgOrderByPrimaryKeyPlugin.js +0 -6
- package/node8plus/plugins/PgOrderByPrimaryKeyPlugin.js.map +1 -1
- package/node8plus/plugins/PgOrderComputedColumnsPlugin.js +10 -14
- package/node8plus/plugins/PgOrderComputedColumnsPlugin.js.map +1 -1
- package/node8plus/plugins/PgQueryProceduresPlugin.js +4 -16
- package/node8plus/plugins/PgQueryProceduresPlugin.js.map +1 -1
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js +3 -20
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgRecordReturnTypesPlugin.js +11 -16
- package/node8plus/plugins/PgRecordReturnTypesPlugin.js.map +1 -1
- package/node8plus/plugins/PgRowByUniqueConstraint.js +4 -25
- package/node8plus/plugins/PgRowByUniqueConstraint.js.map +1 -1
- package/node8plus/plugins/PgRowNode.js +0 -32
- package/node8plus/plugins/PgRowNode.js.map +1 -1
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js +3 -17
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgTablesPlugin.js +7 -59
- package/node8plus/plugins/PgTablesPlugin.js.map +1 -1
- package/node8plus/plugins/PgTypesPlugin.js +107 -240
- package/node8plus/plugins/PgTypesPlugin.js.map +1 -1
- package/node8plus/plugins/addStartEndCursor.js +2 -5
- package/node8plus/plugins/addStartEndCursor.js.map +1 -1
- package/node8plus/plugins/debugSql.js +1 -16
- package/node8plus/plugins/debugSql.js.map +1 -1
- package/node8plus/plugins/introspectionQuery.js +0 -2
- package/node8plus/plugins/introspectionQuery.js.flow +0 -1
- package/node8plus/plugins/introspectionQuery.js.map +1 -1
- package/node8plus/plugins/makeProcField.js +40 -90
- package/node8plus/plugins/makeProcField.js.map +1 -1
- package/node8plus/plugins/pgField.js +2 -7
- package/node8plus/plugins/pgField.js.map +1 -1
- package/node8plus/plugins/viaTemporaryTable.js +6 -12
- package/node8plus/plugins/viaTemporaryTable.js.map +1 -1
- package/node8plus/postgresInterval.js +4 -4
- package/node8plus/postgresInterval.js.map +1 -1
- package/node8plus/queryFromResolveDataFactory.js +33 -77
- package/node8plus/queryFromResolveDataFactory.js.map +1 -1
- package/node8plus/utils.js +8 -9
- package/node8plus/utils.js.map +1 -1
- package/node8plus/withPgClient.js +4 -26
- package/node8plus/withPgClient.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/makeProcField.js"],"names":["nullableIf","GraphQLNonNull","condition","Type","firstValue","obj","firstKey","k","procFieldDetails","proc","build","options","computed","isMutation","pgIntrospectionResultsByKind","introspectionResultsByKind","pgGetGqlInputTypeByTypeIdAndModifier","pgSql","sql","gql2pg","pgStrictFunctions","strictFunctions","graphql","inflection","describePgEntity","sqlCommentByAddingTags","Error","sliceAmount","argNames","argTypeIds","reduce","prev","_","idx","argModes","length","push","argTypes","typeId","typeById","argModesWithOutput","outputArgNames","includes","outputArgTypes","requiredArgCount","Math","max","argDefaultsNum","variantFromName","name","match","variantFromTags","tags","variant","parseInt","notNullArgCount","isStrict","argGqlTypes","map","type","id","hint","class","chalk","bold","green","inputs","memo","argName","argIndex","gqlArgName","argument","makeSqlFunctionCall","rawArgs","implicitArgs","unnest","args","input","sqlArgValues","haveNames","value","sqlValue","sqlArgName","identifier","unshift","fragment","functionCall","namespace","join","makeProcField","fieldName","fieldWithHooks","isRootQuery","forceList","aggregateWrapper","description","overrideDescription","pgTypeAndModifierModifier","pgGetGqlTypeByTypeIdAndModifier","getTypeByName","parseResolveInfo","getSafeAliasFromResolveInfo","getSafeAliasFromAlias","pg2gql","newWithHooks","pgTweakFragmentForTypeAndModifier","GraphQLList","GraphQLString","GraphQLObjectType","GraphQLInputObjectType","getNamedType","isCompositeType","pgQueryFromResolveData","queryFromResolveData","pgAddStartEndCursor","addStartEndCursor","pgViaTemporaryTable","viaTemporaryTable","pgField","subscriptions","pgForbidSetofFunctionsToReturnNull","pgPrepareAndRun","baseReturnType","returnTypeId","rawReturnType","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","makeQuery","parsedResolveInfoFragment","ReturnType","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","sqlFunctionCall","alias","PayloadType","resultFieldName","functionMutationResultFieldName","isNotVoid","String","functionPayloadType","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":";;;;;;;;AAOA;;AACA;;;;AAPA,MAAMA,UAAU,GAAG,CAACC,cAAD,EAAiBC,SAAjB,EAA4BC,IAA5B,KACjBD,SAAS,GAAGC,IAAH,GAAU,IAAIF,cAAJ,CAAmBE,IAAnB,CADrB;;AAyBA,MAAMC,UAAU,GAAGC,GAAG,IAAI;AACxB,MAAIC,QAAJ;;AACA,OAAK,MAAMC,CAAX,IAAgBF,GAAhB,EAAqB;AACnB,QAAIE,CAAC,CAAC,CAAD,CAAD,KAAS,GAAT,IAAgBA,CAAC,CAAC,CAAD,CAAD,KAAS,GAA7B,EAAkC;AAChCD,MAAAA,QAAQ,GAAGC,CAAX;AACD;AACF;;AACD,SAAOF,GAAG,CAACC,QAAD,CAAV;AACD,CARD;;AAUO,SAASE,gBAAT,CACLC,IADK,EAELC,KAFK,EAGLC,OAHK,EAOL;AACA,QAAM;AAAEC,IAAAA,QAAQ,GAAG,KAAb;AAAoBC,IAAAA,UAAU,GAAG;AAAjC,MAA2CF,OAAjD;AACA,QAAM;AACJG,IAAAA,4BAA4B,EAAEC,0BAD1B;AAEJC,IAAAA,oCAFI;AAGJC,IAAAA,KAAK,EAAEC,GAHH;AAIJC,IAAAA,MAJI;AAKJC,IAAAA,iBAAiB,EAAEC,eALf;AAMJC,IAAAA,OAAO,EAAE;AAAErB,MAAAA;AAAF,KANL;AAOJsB,IAAAA,UAPI;AAQJC,IAAAA,gBARI;AASJC,IAAAA;AATI,MAUFf,KAVJ;;AAYA,MAAIE,QAAQ,IAAIC,UAAhB,EAA4B;AAC1B,UAAM,IAAIa,KAAJ,CAAU,uCAAV,CAAN;AACD;;AAED,QAAMC,WAAW,GAAGf,QAAQ,GAAG,CAAH,GAAO,CAAnC;AACA,QAAMgB,QAAQ,GAAGnB,IAAI,CAACoB,UAAL,CAAgBC,MAAhB,CAAuB,CAACC,IAAD,EAAOC,CAAP,EAAUC,GAAV,KAAkB;AACxD,QACEA,GAAG,IAAIN,WAAP,MAAsB;AACrBlB,IAAAA,IAAI,CAACyB,QAAL,CAAcC,MAAd,KAAyB,CAAzB,IAA8B;AAC7B1B,IAAAA,IAAI,CAACyB,QAAL,CAAcD,GAAd,MAAuB,GADxB,IAC+B;AAC9BxB,IAAAA,IAAI,CAACyB,QAAL,CAAcD,GAAd,MAAuB,GAHzB,CADF,CAIgC;AAJhC,MAKE;AACAF,MAAAA,IAAI,CAACK,IAAL,CAAU3B,IAAI,CAACmB,QAAL,CAAcK,GAAd,KAAsB,EAAhC;AACD;;AACD,WAAOF,IAAP;AACD,GAVgB,EAUd,EAVc,CAAjB;AAWA,QAAMM,QAAQ,GAAG5B,IAAI,CAACoB,UAAL,CAAgBC,MAAhB,CAAuB,CAACC,IAAD,EAAOO,MAAP,EAAeL,GAAf,KAAuB;AAC7D,QACEA,GAAG,IAAIN,WAAP,MAAsB;AACrBlB,IAAAA,IAAI,CAACyB,QAAL,CAAcC,MAAd,KAAyB,CAAzB,IAA8B;AAC7B1B,IAAAA,IAAI,CAACyB,QAAL,CAAcD,GAAd,MAAuB,GADxB,IAC+B;AAC9BxB,IAAAA,IAAI,CAACyB,QAAL,CAAcD,GAAd,MAAuB,GAHzB,CADF,CAIgC;AAJhC,MAKE;AACAF,MAAAA,IAAI,CAACK,IAAL,CAAUrB,0BAA0B,CAACwB,QAA3B,CAAoCD,MAApC,CAAV;AACD;;AACD,WAAOP,IAAP;AACD,GAVgB,EAUd,EAVc,CAAjB;AAWA,QAAMS,kBAAkB,GAAG,CACzB,GADyB,EACpB;AACL,KAFyB,EAEpB;AACL,KAHyB,CAGpB;AAHoB,GAA3B;AAKA,QAAMC,cAAc,GAAGhC,IAAI,CAACoB,UAAL,CAAgBC,MAAhB,CAAuB,CAACC,IAAD,EAAOC,CAAP,EAAUC,GAAV,KAAkB;AAC9D,QAAIO,kBAAkB,CAACE,QAAnB,CAA4BjC,IAAI,CAACyB,QAAL,CAAcD,GAAd,CAA5B,CAAJ,EAAqD;AACnDF,MAAAA,IAAI,CAACK,IAAL,CAAU3B,IAAI,CAACmB,QAAL,CAAcK,GAAd,KAAsB,EAAhC;AACD;;AACD,WAAOF,IAAP;AACD,GALsB,EAKpB,EALoB,CAAvB;AAMA,QAAMY,cAAc,GAAGlC,IAAI,CAACoB,UAAL,CAAgBC,MAAhB,CAAuB,CAACC,IAAD,EAAOO,MAAP,EAAeL,GAAf,KAAuB;AACnE,QAAIO,kBAAkB,CAACE,QAAnB,CAA4BjC,IAAI,CAACyB,QAAL,CAAcD,GAAd,CAA5B,CAAJ,EAAqD;AACnDF,MAAAA,IAAI,CAACK,IAAL,CAAUrB,0BAA0B,CAACwB,QAA3B,CAAoCD,MAApC,CAAV;AACD;;AACD,WAAOP,IAAP;AACD,GALsB,EAKpB,EALoB,CAAvB;AAMA,QAAMa,gBAAgB,GAAGC,IAAI,CAACC,GAAL,CAAS,CAAT,EAAYlB,QAAQ,CAACO,MAAT,GAAkB1B,IAAI,CAACsC,cAAnC,CAAzB;;AACA,QAAMC,eAAe,GAAGC,IAAI,IAAI;AAC9B,QAAIA,IAAI,CAACC,KAAL,CAAW,aAAX,CAAJ,EAA+B;AAC7B,aAAO,OAAP;AACD;;AACD,WAAO,IAAP;AACD,GALD;;AAMA,QAAMC,eAAe,GAAG,CAACC,IAAD,EAAOnB,GAAP,KAAe;AACrC,UAAMoB,OAAO,GAAGD,IAAI,CAAE,MAAKnB,GAAI,SAAX,CAApB;;AACA,QAAIoB,OAAO,IAAIA,OAAO,CAACH,KAAnB,IAA4BG,OAAO,CAACH,KAAR,CAAc,UAAd,CAAhC,EAA2D;AACzD,aAAOI,QAAQ,CAACD,OAAD,EAAU,EAAV,CAAf;AACD;;AACD,WAAOA,OAAP;AACD,GAND;;AAOA,QAAME,eAAe,GACnB9C,IAAI,CAAC+C,QAAL,IAAiBnC,eAAjB,GAAmCuB,gBAAnC,GAAsD,CADxD;AAEA,QAAMa,WAAW,GAAGpB,QAAQ,CAACqB,GAAT,CAAa,CAACC,IAAD,EAAO1B,GAAP,KAAe;AAC9C;AACA,UAAMoB,OAAO,GACXF,eAAe,CAAC1C,IAAI,CAAC2C,IAAN,EAAYnB,GAAZ,CAAf,IAAmCe,eAAe,CAACpB,QAAQ,CAACK,GAAD,CAAT,CADpD;AAEA,UAAM9B,IAAI,GAAGa,oCAAoC,CAAC2C,IAAI,CAACC,EAAN,EAAUP,OAAV,CAAjD;;AACA,QAAI,CAAClD,IAAL,EAAW;AACT,YAAM0D,IAAI,GAAGF,IAAI,CAACG,KAAL,GACR,sEAAqEtC,gBAAgB,CACpFmC,IAAI,CAACG,KAD+E,CAEpF,2EAA0EC,eAAMC,IAAN,CAAWC,KAAX,CAC1E,MAD0E,CAE1E,iDAAgDxC,sBAAsB,CACtEhB,IADsE,EAEtE;AACE,SAAE,MAAKwB,GAAI,SAAX,GAAsB;AADxB,OAFsE,CAKtE,IAVO,GAWT,EAXJ;AAYA,YAAM,IAAIP,KAAJ,CACH,yCAAwCO,GAAI,MAC3CL,QAAQ,CAACK,GAAD,CACT,kBAAiBT,gBAAgB,CAACf,IAAD,CAAO,GAAEoD,IAAK,EAH5C,CAAN;AAKD;;AACD,QAAI5B,GAAG,IAAIsB,eAAX,EAA4B;AAC1B,aAAOpD,IAAP;AACD,KAFD,MAEO;AACL,aAAO,IAAIF,cAAJ,CAAmBE,IAAnB,CAAP;AACD;AACF,GA7BmB,CAApB,CA1EA,CAwGA;AACA;;AACA,QAAM+D,MAAM,GAAGtC,QAAQ,CAACE,MAAT,CAAgB,CAACqC,IAAD,EAAOC,OAAP,EAAgBC,QAAhB,KAA6B;AAC1D,UAAMC,UAAU,GAAG/C,UAAU,CAACgD,QAAX,CAAoBH,OAApB,EAA6BC,QAA7B,CAAnB;AACAF,IAAAA,IAAI,CAACG,UAAD,CAAJ,GAAmB;AACjBX,MAAAA,IAAI,EAAEF,WAAW,CAACY,QAAD;AADA,KAAnB;AAGA,WAAOF,IAAP;AACD,GANc,EAMZ,EANY,CAAf;;AAQA,WAASK,mBAAT,CACEC,OAAO,GAAG,EADZ,EAEE;AAAEC,IAAAA,YAAY,GAAG,EAAjB;AAAqBC,IAAAA,MAAM,GAAG;AAA9B,MAAwC,EAF1C,EAGO;AACL,UAAMC,IAAI,GAAG/D,UAAU,GAAG4D,OAAO,CAACI,KAAX,GAAmBJ,OAA1C;AACA,UAAMK,YAAY,GAAG,EAArB;AACA,QAAIC,SAAS,GAAG,IAAhB;;AACA,SAAK,IAAIV,QAAQ,GAAGzC,QAAQ,CAACO,MAAT,GAAkB,CAAtC,EAAyCkC,QAAQ,IAAI,CAArD,EAAwDA,QAAQ,EAAhE,EAAoE;AAClE,YAAMD,OAAO,GAAGxC,QAAQ,CAACyC,QAAD,CAAxB;AACA,YAAMC,UAAU,GAAG/C,UAAU,CAACgD,QAAX,CAAoBH,OAApB,EAA6BC,QAA7B,CAAnB;AACA,YAAMW,KAAK,GAAGJ,IAAI,CAACN,UAAD,CAAlB;AACA,YAAMjB,OAAO,GACXF,eAAe,CAAC1C,IAAI,CAAC2C,IAAN,EAAYiB,QAAZ,CAAf,IACArB,eAAe,CAACpB,QAAQ,CAACyC,QAAD,CAAT,CAFjB;AAIA,YAAMY,QAAQ,GAAG9D,MAAM,CAAC6D,KAAD,EAAQ3C,QAAQ,CAACgC,QAAD,CAAhB,EAA4BhB,OAA5B,CAAvB;;AAEA,UAAIgB,QAAQ,GAAG,CAAX,GAAezB,gBAAf,IAAmCmC,SAAnC,IAAgDC,KAAK,IAAI,IAA7D,EAAmE;AACjE;AACA;AACD,OAHD,MAGO,IAAIX,QAAQ,GAAG,CAAX,GAAezB,gBAAf,IAAmCmC,SAAvC,EAAkD;AACvD,cAAMG,UAAU,GAAGd,OAAO,GAAGlD,GAAG,CAACiE,UAAJ,CAAef,OAAf,CAAH,GAA6B,IAAvD;;AACA,YAAIc,UAAJ,EAAgB;AACdJ,UAAAA,YAAY,CAACM,OAAb,CAAqBlE,GAAG,CAACmE,QAAS,GAAEH,UAAW,OAAMD,QAAS,EAA9D;AACD,SAFD,MAEO;AACLF,UAAAA,SAAS,GAAG,KAAZ;AACAD,UAAAA,YAAY,CAACM,OAAb,CAAqBH,QAArB;AACD;AACF,OARM,MAQA;AACLH,QAAAA,YAAY,CAACM,OAAb,CAAqBH,QAArB;AACD;AACF;;AACD,UAAMK,YAAY,GAAGpE,GAAG,CAACmE,QAAS,GAAEnE,GAAG,CAACiE,UAAJ,CAClC1E,IAAI,CAAC8E,SAAL,CAAetC,IADmB,EAElCxC,IAAI,CAACwC,IAF6B,CAGlC,IAAG/B,GAAG,CAACsE,IAAJ,CAAS,CAAC,GAAGd,YAAJ,EAAkB,GAAGI,YAArB,CAAT,EAA6C,IAA7C,CAAmD,GAHxD;AAIA,WAAOH,MAAM,GAAGzD,GAAG,CAACmE,QAAS,UAASC,YAAa,GAAtC,GAA2CA,YAAxD;AACD;;AAED,SAAO;AACLpB,IAAAA,MADK;AAELM,IAAAA,mBAFK;AAGL/B,IAAAA,cAHK;AAILE,IAAAA;AAJK,GAAP;AAMD;;AAEc,SAAS8C,aAAT,CACbC,SADa,EAEbjF,IAFa,EAGbC,KAHa,EAIbC,OAJa,EAKb;AACA,QAAM;AACJgF,IAAAA,cADI;AAEJ/E,IAAAA,QAAQ,GAAG,KAFP;AAGJC,IAAAA,UAAU,GAAG,KAHT;AAIJ+E,IAAAA,WAAW,GAAG,KAJV;AAKJC,IAAAA,SAAS,GAAG,KALR;AAMJC,IAAAA,gBAAgB,GAAG,IANf;AAOJC,IAAAA,WAAW,EAAEC,mBAAmB,GAAG,IAP/B;AAQJC,IAAAA,yBAAyB,GAAG;AARxB,MASFtF,OATJ;AAUA,QAAM;AACJG,IAAAA,4BAA4B,EAAEC,0BAD1B;AAEJmF,IAAAA,+BAFI;AAGJC,IAAAA,aAHI;AAIJlF,IAAAA,KAAK,EAAEC,GAJH;AAKJkF,IAAAA,gBALI;AAMJC,IAAAA,2BANI;AAOJC,IAAAA,qBAPI;AAQJC,IAAAA,MARI;AASJC,IAAAA,YATI;AAUJC,IAAAA,iCAVI;AAWJnF,IAAAA,OAAO,EAAE;AACPrB,MAAAA,cADO;AAEPyG,MAAAA,WAFO;AAGPC,MAAAA,aAHO;AAIPC,MAAAA,iBAJO;AAKPC,MAAAA,sBALO;AAMPC,MAAAA,YANO;AAOPC,MAAAA;AAPO,KAXL;AAoBJxF,IAAAA,UApBI;AAqBJyF,IAAAA,sBAAsB,EAAEC,oBArBpB;AAsBJC,IAAAA,mBAAmB,EAAEC,iBAtBjB;AAuBJC,IAAAA,mBAAmB,EAAEC,iBAvBjB;AAwBJ7F,IAAAA,gBAxBI;AAyBJC,IAAAA,sBAzBI;AA0BJ6F,IAAAA,OA1BI;AA2BJ3G,IAAAA,OAAO,EAAE;AACP4G,MAAAA,aAAa,GAAG,KADT;AAEPC,MAAAA,kCAAkC,GAAG;AAF9B,KA3BL;AA+BJC,IAAAA;AA/BI,MAgCF/G,KAhCJ;AAkCA,QAAM;AAAEwD,IAAAA,MAAF;AAAUM,IAAAA,mBAAV;AAA+B/B,IAAAA,cAA/B;AAA+CE,IAAAA;AAA/C,MACJnC,gBAAgB,CAACC,IAAD,EAAOC,KAAP,EAAcC,OAAd,CADlB;AAEA,MAAIiE,IAAI,GAAGV,MAAX;AAEA;AACF;AACA;AACA;;AACE,QAAMwD,cAAc,GAAG3G,0BAA0B,CAACwB,QAA3B,CAAoC9B,IAAI,CAACkH,YAAzC,CAAvB;AAEA;AACF;AACA;AACA;AACA;;AACE,QAAMC,aAAa,GAAG3B,yBAAyB,GAC3CA,yBAAyB,CAACyB,cAAD,EAAiB,IAAjB,CAAzB,CAAgD,CAAhD,CAD2C,GAE3CA,cAFJ;AAIA;AACF;AACA;;AACE,QAAMG,UAAU,GAAGD,aAAa,CAACE,SAAd,GACfF,aAAa,CAACG,aADC,GAEfH,aAFJ;AAGA,QAAMI,eAAe,GACnBjH,0BAA0B,CAACkH,SAA3B,CAAqCJ,UAAU,CAACK,OAAhD,CADF;;AAEA,MAAI,CAACL,UAAL,EAAiB;AACf,UAAM,IAAInG,KAAJ,CACH,iDAAgDjB,IAAI,CAACwC,IAAK,GADvD,CAAN;AAGD;;AACD,MAAIU,IAAJ;AACA,QAAMwE,UAAU,GAAG,EAAnB;AACA,QAAMC,gBAAgB,GAAG,EAAzB;AACAD,EAAAA,UAAU,CAACE,oBAAX,GAAkC5H,IAAlC;AACA2H,EAAAA,gBAAgB,CAACE,eAAjB,GAAmC7H,IAAnC;AACA,MAAI8H,uBAAuB,GAAG,KAA9B;AACA,QAAMC,SAAS,GACbR,eAAe,IACf9B,+BAA+B,CAAC8B,eAAe,CAACrE,IAAhB,CAAqBC,EAAtB,EAA0B,IAA1B,CAFjC;AAIA,QAAM6E,WAAoB,GACvBD,SAAS,IAAIzB,eAAe,CAACyB,SAAD,CAA7B,IAA6C,KAD/C;AAEA,QAAME,YAAY,GAAGb,UAAU,CAACjE,EAAX,KAAkB,MAAvC;;AACA,MAAI6E,WAAJ,EAAiB;AACf,QAAIhI,IAAI,CAACkI,UAAT,EAAqB;AACnB,UAAI9H,UAAJ,EAAgB;AACd,cAAM+H,SAAS,GAAGpB,kCAAkC,GAChD,IAAIvH,cAAJ,CAAmBuI,SAAnB,CADgD,GAEhDA,SAFJ;AAGA7E,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgBkC,SAAhB,CAAP;AACD,OALD,MAKO,IAAI/C,SAAJ,EAAe;AACpB,cAAM+C,SAAS,GAAGpB,kCAAkC,GAChD,IAAIvH,cAAJ,CAAmBuI,SAAnB,CADgD,GAEhDA,SAFJ;AAGA7E,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgBkC,SAAhB,CAAP;AACAT,QAAAA,UAAU,CAACU,yBAAX,GAAuC,IAAvC;AACD,OANM,MAMA;AACL,cAAMC,cAAc,GAAG3C,aAAa,CAClC5E,UAAU,CAACwH,UAAX,CAAsBP,SAAS,CAACvF,IAAhC,CADkC,CAApC;;AAGA,YAAI,CAAC6F,cAAL,EAAqB;AACnB,gBAAM,IAAIpH,KAAJ,CACH,kCAAiCH,UAAU,CAACwH,UAAX,CAChCP,SAAS,CAACvF,IADsB,CAEhC,UAASuF,SAAS,CAACvF,IAAK,oCAHtB,CAAN;AAKD;;AACDU,QAAAA,IAAI,GAAGmF,cAAP;AACAX,QAAAA,UAAU,CAACa,mBAAX,GAAiC,IAAjC;AACD;;AACDb,MAAAA,UAAU,CAACc,yBAAX,GAAuCjB,eAAvC;AACAI,MAAAA,gBAAgB,CAACc,oBAAjB,GAAwClB,eAAxC;AACD,KA5BD,MA4BO;AACLrE,MAAAA,IAAI,GAAG6E,SAAP;;AACA,UAAIZ,aAAa,CAACE,SAAlB,EAA6B;AAC3B;AACAnE,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgB/C,IAAhB,CAAP;AACD;;AACDwE,MAAAA,UAAU,CAACc,yBAAX,GAAuCjB,eAAvC;AACAI,MAAAA,gBAAgB,CAACc,oBAAjB,GAAwClB,eAAxC;AACD;AACF,GAtCD,MAsCO,IAAIU,YAAJ,EAAkB;AACvB,UAAMS,UAAU,GAAGhD,aAAa,CAAC5E,UAAU,CAAC6H,wBAAX,CAAoC3I,IAApC,CAAD,CAAhC;;AACA,QAAI,CAAC0I,UAAL,EAAiB;AACf,YAAM,IAAIzH,KAAJ,CACH,8BAA6BH,UAAU,CAAC6H,wBAAX,CAC5B3I,IAD4B,CAE5B,UAASA,IAAI,CAACwC,IAAK,oCAHjB,CAAN;AAKD;;AACD,QAAIxC,IAAI,CAACkI,UAAT,EAAqB;AACnB,UAAI9H,UAAJ,EAAgB;AACd8C,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgByC,UAAhB,CAAP;AACD,OAFD,MAEO,IAAItD,SAAJ,EAAe;AACpBlC,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgByC,UAAhB,CAAP;AACAhB,QAAAA,UAAU,CAACU,yBAAX,GAAuC,IAAvC;AACD,OAHM,MAGA;AACL,cAAMC,cAAc,GAAG3C,aAAa,CAClC5E,UAAU,CAAC8H,wBAAX,CAAoC5I,IAApC,CADkC,CAApC;;AAGA,YAAI,CAACqI,cAAL,EAAqB;AACnB,gBAAM,IAAIpH,KAAJ,CACH,kCAAiCH,UAAU,CAAC8H,wBAAX,CAChC5I,IADgC,CAEhC,UAAS0I,UAAU,CAAClG,IAAK,oCAHvB,CAAN;AAKD;;AACDU,QAAAA,IAAI,GAAGmF,cAAP;AACAX,QAAAA,UAAU,CAACa,mBAAX,GAAiC,IAAjC;AACD;AACF,KApBD,MAoBO;AACLrF,MAAAA,IAAI,GAAGwF,UAAP;;AACA,UAAIvB,aAAa,CAACE,SAAlB,EAA6B;AAC3BnE,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgB/C,IAAhB,CAAP;AACD;AACF;AACF,GAnCM,MAmCA;AACL;AACA,UAAMxD,IAAI,GACR+F,+BAA+B,CAAC2B,UAAU,CAACjE,EAAZ,EAAgB,IAAhB,CAA/B,IAAwD+C,aAD1D;;AAGA,QAAIlG,IAAI,CAACkI,UAAT,EAAqB;AACnB,YAAMW,kBAAkB,GAAG/H,UAAU,CAACgI,wBAAX,CAAoC9I,IAApC,CAA3B;AACA,YAAMqI,cAAc,GAAG3C,aAAa,CAACmD,kBAAD,CAApC;;AACA,UAAIzI,UAAJ,EAAgB;AACd;AACA8C,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgBvG,IAAhB,CAAP;AACAoI,QAAAA,uBAAuB,GAAG,IAA1B;AACD,OAJD,MAIO,IAAI1C,SAAS,IAAI,CAACiD,cAAlB,EAAkC;AACvCnF,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgBvG,IAAhB,CAAP;AACAoI,QAAAA,uBAAuB,GAAG,IAA1B;AACAJ,QAAAA,UAAU,CAACU,yBAAX,GAAuC,IAAvC;AACD,OAJM,MAIA;AACLlF,QAAAA,IAAI,GAAGmF,cAAP;AACAX,QAAAA,UAAU,CAACa,mBAAX,GAAiC,IAAjC,CAFK,CAGL;AACA;AACA;AACA;AACD;AACF,KAnBD,MAmBO;AACLT,MAAAA,uBAAuB,GAAG,IAA1B;AACA5E,MAAAA,IAAI,GAAGxD,IAAP;;AACA,UAAIyH,aAAa,CAACE,SAAlB,EAA6B;AAC3BnE,QAAAA,IAAI,GAAG,IAAI+C,WAAJ,CAAgB/C,IAAhB,CAAP;AACD;AACF;AACF;;AACD,SAAOgC,cAAc,CACnBD,SADmB,EAEnB,CAAC;AACC8D,IAAAA,gBADD;AAECC,IAAAA,oCAFD;AAGCC,IAAAA;AAHD,GAAD,KAIM;AACJ,QACEjJ,IAAI,CAACkI,UAAL,IACA,CAACF,WADD,IAEA,CAACF,uBAFD,IAGA,CAAC1H,UAJH,EAKE;AACA;AACA6I,MAAAA,mBAAmB,CAAC,SAASC,iBAAT,GAA6B;AAC/C,eAAO;AACLC,UAAAA,cAAc,EAAE1I,GAAG,CAAC2I,OAAJ,CAAY,SAAZ;AADX,SAAP;AAGD,OAJkB,CAAnB;AAKD;;AACD,aAASC,SAAT,CACEC,yBADF,EAEEC,UAFF,EAGEC,gBAHF,EAIEC,aAJF,EAKEC,kBALF,EAMEC,cANF,EAOEC,WAPF,EAQE;AACA,YAAMC,WAAW,GAAGb,oCAAoC,CACtDM,yBADsD,EAEtDC,UAFsD,CAAxD;AAIA,YAAMO,YAAY,GAAG,CAAC1E,SAAD,IAAc,CAAChF,UAAf,IAA6BJ,IAAI,CAACkI,UAAvD;AACA,YAAM6B,KAAK,GAAGvD,oBAAoB,CAChCgD,gBADgC,EAEhCC,aAFgC,EAGhCI,WAHgC,EAIhC;AACEG,QAAAA,WAAW,EACT,CAAC5J,UAAD,KACC4H,WAAW,IAAIC,YADhB,MAEC7C,SAAS,IAAIpF,IAAI,CAACkI,UAAlB,IAAgCf,aAAa,CAACE,SAF/C,KAE6D;AAC7DrH,QAAAA,IAAI,CAACiK,QAAL,KAAkB,KALtB;AAK6B;AAC3BC,QAAAA,cAAc,EAAEJ,YANlB;AAOEK,QAAAA,sBAAsB,EAAEL,YAAY,IAAI,CAAC3J,QAP3C;AAQEiK,QAAAA,MAAM,EACJjK,QAAQ,KACPiF,SAAS,IAAK,CAACpF,IAAI,CAACkI,UAAN,IAAoB,CAACJ,uBAD5B,CATZ;AAWEuC,QAAAA,eAAe,EACblK,QAAQ,KACPiF,SAAS,IAAK,CAACpF,IAAI,CAACkI,UAAN,IAAoBf,aAAa,CAACE,SADzC,CAZZ;AAcEiD,QAAAA,WAAW,EACT,CAACtK,IAAI,CAACkI,UAAN,IACA,CAACf,aAAa,CAACE,SADf,KAECW,WAAW,IAAIC,YAFhB;AAfJ,OAJgC,EAuBhCsC,iBAAiB,IAAI;AACnBA,QAAAA,iBAAiB,CAACb,kBAAlB,GAAuCA,kBAAvC;;AACA,YAAI,CAAC1B,WAAL,EAAkB;AAChB,cAAIT,eAAJ,EAAqB;AACnBgD,YAAAA,iBAAiB,CAACC,MAAlB,CACExE,iCAAiC,CAC/BvF,GAAG,CAACmE,QAAS,GAAE6E,aAAc,EADE,EAE/BlC,eAAe,CAACrE,IAFe,EAG/B,IAH+B,EAI/B2G,WAJ+B,CADnC,EAOE,OAPF;AASD,WAVD,MAUO;AACLU,YAAAA,iBAAiB,CAACC,MAAlB,CACExE,iCAAiC,CAC/BvF,GAAG,CAACmE,QAAS,GAAE6E,aAAc,EADE,EAE/BrC,UAF+B,EAG/B,IAH+B,EAGzB;AACNyC,YAAAA,WAJ+B,CADnC,EAOE,OAPF;AASD;AACF,SAtBD,MAsBO,IACL/C,aAAa,IACbS,eADA,IAEA,CAACuC,YAFD,IAGAvC,eAAe,CAACkD,oBAJX,EAKL;AACAF,UAAAA,iBAAiB,CAACG,iBAAlB,CAAoCnD,eAApC;AACD;AACF,OAvD+B,EAwDhCmC,kBAAkB,GAAGA,kBAAkB,CAACiB,OAAtB,GAAgChB,cAxDlB,EAyDhCD,kBAAkB,GACdA,kBAAkB,CAACkB,SADL,GAEdhB,WAAW,IAAIA,WAAW,CAACgB,SA3DC,CAAlC;AA6DA,aAAOb,KAAP;AACD;;AACD,QAAI5J,QAAJ,EAAc;AACZ4I,MAAAA,gBAAgB,CAAC,CAACO,yBAAD,EAA4BC,UAA5B,KAA2C;AAC1D,eAAO;AACLsB,UAAAA,OAAO,EAAEC,YAAY,IAAI;AACvBA,YAAAA,YAAY,CAACN,MAAb,CAAoB,MAAM;AACxB,oBAAMO,gBAAgB,GAAGD,YAAY,CAACE,aAAb,EAAzB;AACA,oBAAMvB,aAAa,GAAGhJ,GAAG,CAACiE,UAAJ,CAAeuG,MAAM,EAArB,CAAtB;AACA,oBAAMC,eAAe,GAAGnH,mBAAmB,CACzCuF,yBAAyB,CAACnF,IADe,EAEzC;AACEF,gBAAAA,YAAY,EAAE,CAAC8G,gBAAD,CADhB;AAEE7G,gBAAAA,MAAM,EAAEiD,aAAa,CAACE;AAFxB,eAFyC,CAA3C;;AAOA,kBAAIhC,gBAAJ,EAAsB;AACpB,uBAAOA,gBAAgB,CAAC6F,eAAD,CAAvB;AACD,eAFD,MAEO;AACL,sBAAMnB,KAAK,GAAGV,SAAS,CACrBC,yBADqB,EAErBC,UAFqB,EAGrB2B,eAHqB,EAIrBzB,aAJqB,EAKrBqB,YALqB,CAAvB;AAOA,uBAAOrK,GAAG,CAACmE,QAAS,IAAGmF,KAAM,GAA7B;AACD;AACF,aAtBD,EAsBGlE,qBAAqB,CAACyD,yBAAyB,CAAC6B,KAA3B,CAtBxB;AAuBD;AAzBI,SAAP;AA2BD,OA5Be,CAAhB;AA6BD;;AAED,QAAI5B,UAAU,GAAGrG,IAAjB;AACA,QAAIkI,WAAJ;;AACA,QAAIhL,UAAJ,EAAgB;AACd,YAAMiL,eAAe,GAAGvK,UAAU,CAACwK,+BAAX,CACtBtL,IADsB,EAEtBqG,YAAY,CAACnD,IAAD,CAFU,EAGtBlD,IAAI,CAACkI,UAAL,IAAmBf,aAAa,CAACE,SAHX,EAItBrF,cAJsB,CAAxB;AAMA,YAAMuJ,SAAS,GAAGC,MAAM,CAACpE,UAAU,CAACjE,EAAZ,CAAN,KAA0B,MAA5C,CAPc,CAQd;;AACAiI,MAAAA,WAAW,GAAGrF,YAAY,CACxBI,iBADwB,EAExB;AACE3D,QAAAA,IAAI,EAAE1B,UAAU,CAAC2K,mBAAX,CAA+BzL,IAA/B,CADR;AAEEsF,QAAAA,WAAW,EAAErF,KAAK,CAACyL,eAAN,CACV,uBAAsB5K,UAAU,CAAC6K,oBAAX,CACrB3L,IADqB,CAErB,cAHS,EAIX,MAJW,CAFf;AAQE4L,QAAAA,MAAM,EAAE,CAAC;AAAE1G,UAAAA;AAAF,SAAD,KAAwB;AAC9B,iBAAO2G,MAAM,CAACC,MAAP,CACL,EADK,EAEL;AACEC,YAAAA,gBAAgB,EAAE;AAChB7I,cAAAA,IAAI,EAAEgD;AADU;AADpB,WAFK,EAOLqF,SAAS,GACL;AACE,aAACF,eAAD,GAAmBxE,OAAO,CACxB5G,KADwB,EAExBiF,cAFwB,EAGxBmG,eAHwB,EAIxB;AACEnI,cAAAA,IAAI,EAAEA,IADR;AAEE,kBAAI4E,uBAAuB,GACvB;AACEkE,gBAAAA,OAAO,CAACC,IAAD,EAAO;AACZ,yBAAOA,IAAI,CAACA,IAAZ;AACD;;AAHH,eADuB,GAMvB,IANJ;AAFF,aAJwB,EAcxB,EAdwB,EAexB,KAfwB,EAgBxB;AACEC,cAAAA,MAAM,EAAE9E;AADV,aAhBwB,CAD5B,CAqBE;;AArBF,WADK,GAwBL,IA/BC,CAAP;AAiCD;AA1CH,OAFwB,EA8CxB;AACE+E,QAAAA,QAAQ,EAAG,6CAA4CpL,gBAAgB,CACrEf,IADqE,CAErE,uGAAsGgB,sBAAsB,CAC5HhB,IAD4H,EAE5H;AACEwC,UAAAA,IAAI,EAAE;AADR,SAF4H,CAK5H,EARJ;AASE4J,QAAAA,iBAAiB,EAAE,IATrB;AAUE,WAAGzE;AAVL,OA9CwB,CAA1B;AA2DA4B,MAAAA,UAAU,GAAG6B,WAAb;AACA,YAAMiB,SAAS,GAAGtG,YAAY,CAC5BK,sBAD4B,EAE5B;AACE5D,QAAAA,IAAI,EAAE1B,UAAU,CAACwL,iBAAX,CAA6BtM,IAA7B,CADR;AAEEsF,QAAAA,WAAW,EAAErF,KAAK,CAACyL,eAAN,CACV,uBAAsB5K,UAAU,CAAC6K,oBAAX,CACrB3L,IADqB,CAErB,cAHS,EAIX,MAJW,CAFf;AAQE4L,QAAAA,MAAM,EAAE;AACNG,UAAAA,gBAAgB,EAAE;AAChB7I,YAAAA,IAAI,EAAEgD;AADU,WADZ;AAIN,aAAG/B;AAJG;AARV,OAF4B,EAiB5B;AACEgI,QAAAA,QAAQ,EAAG,2CAA0CpL,gBAAgB,CACnEf,IADmE,CAEnE,uGAAsGgB,sBAAsB,CAC5HhB,IAD4H,EAE5H;AACEwC,UAAAA,IAAI,EAAE;AADR,SAF4H,CAK5H,EARJ;AASE+J,QAAAA,eAAe,EAAE;AATnB,OAjB4B,CAA9B;AA6BApI,MAAAA,IAAI,GAAG;AACLC,QAAAA,KAAK,EAAE;AACLlB,UAAAA,IAAI,EAAE,IAAI1D,cAAJ,CAAmB6M,SAAnB;AADD;AADF,OAAP;AAKD,KApOG,CAqOJ;AACA;AACA;AACA;;;AACA,UAAMG,iBAAiB,GAAGC,CAAC,IACzBzE,WAAW,GACPlC,MAAM,CAAC2G,CAAD,EAAIrF,UAAJ,CADC,GAEP,EACE,GAAGqF,CADL;AAEElI,MAAAA,KAAK,EAAEuB,MAAM,CAAC2G,CAAC,CAAClI,KAAH,EAAU6C,UAAV;AAFf,KAHN;;AAQA,WAAO;AACL9B,MAAAA,WAAW,EAAEC,mBAAmB,GAC5BA,mBAD4B,GAE5BvF,IAAI,CAACsF,WAAL,GACAtF,IAAI,CAACsF,WADL,GAEAlF,UAAU,GACV,IADU,GAEV4H,WAAW,IAAIhI,IAAI,CAACkI,UAApB,GACAjI,KAAK,CAACyL,eAAN,CACG,mDAAkD3D,SAAS,CAACvF,IAAK,KADpE,EAEE,OAFF,CADA,GAKA,IAZC;AAaLU,MAAAA,IAAI,EAAE3D,UAAU,CACdC,cADc,EAEd,CAACQ,IAAI,CAAC2C,IAAL,CAAU+J,OAAX,KACG,CAAChF,UAAU,CAACa,mBAAZ,IAAmCnI,UAAnC,IAAiD+E,WADpD,CAFc,EAIdoE,UAJc,CAbX;AAmBLpF,MAAAA,IAAI,EAAEA,IAnBD;AAoBL6H,MAAAA,OAAO,EAAE7L,QAAQ,GACb,CAAC8L,IAAD,EAAOU,KAAP,EAAchD,cAAd,EAA8BC,WAA9B,KAA8C;AAC5C,cAAMgD,UAAU,GACdhD,WAAW,CAACgB,SAAZ,IAAyBhB,WAAW,CAACgB,SAAZ,CAAsBgC,UADjD;AAEA,cAAMC,SAAS,GAAGjH,2BAA2B,CAACgE,WAAD,CAA7C;AACA,cAAMrF,KAAK,GAAG0H,IAAI,CAACY,SAAD,CAAlB;;AACA,YAAI/E,uBAAJ,EAA6B;AAC3B;AACA,cAAI9H,IAAI,CAACkI,UAAL,IAAmB,CAAC9C,SAAxB,EAAmC;AACjC;AACA;AACA,mBAAOb,KAAK,CAAC0H,IAAN,CAAWhJ,GAAX,CAAewJ,CAAC,IAAI3G,MAAM,CAACnG,UAAU,CAAC8M,CAAD,CAAX,EAAgBrF,UAAhB,CAA1B,CAAP;AACD,WAJD,MAIO,IAAIpH,IAAI,CAACkI,UAAL,IAAmBf,aAAa,CAACE,SAArC,EAAgD;AACrD,mBAAO9C,KAAK,CAACtB,GAAN,CAAUwJ,CAAC,IAAI3G,MAAM,CAACnG,UAAU,CAAC8M,CAAD,CAAX,EAAgBrF,UAAhB,CAArB,CAAP;AACD,WAFM,MAEA;AACL,mBAAOtB,MAAM,CAACvB,KAAD,EAAQ6C,UAAR,CAAb;AACD;AACF,SAXD,MAWO;AACL,gBAAM0F,cAAc,GAClBhG,aAAa,IAAIkB,WAAjB,IAAgCT,eAAhC,IAAmDqF,UAAnD,GACIG,MAAM,IAAI;AACR,gBAAIA,MAAJ,EAAY;AACVH,cAAAA,UAAU,CACR,IADQ,EAERrF,eAFQ,EAGRwF,MAAM,CAACC,aAHC,CAAV;AAKD;AACF,WATL,GAUIC,OAAO,IAAI,CAAE,CAXnB;;AAYA,cAAIjN,IAAI,CAACkI,UAAL,IAAmB,CAAC9H,UAApB,IAAkC,CAACgF,SAAvC,EAAkD;AAChD;AACA,mBAAOsB,iBAAiB,CAAC,EACvB,GAAGnC,KADoB;AAEvB0H,cAAAA,IAAI,EAAE1H,KAAK,CAAC0H,IAAN,GAAa1H,KAAK,CAAC0H,IAAN,CAAWhJ,GAAX,CAAeuJ,iBAAf,CAAb,GAAiD;AAFhC,aAAD,CAAxB;AAID,WAND,MAMO,IAAIxM,IAAI,CAACkI,UAAL,IAAmBf,aAAa,CAACE,SAArC,EAAgD;AACrD;AACA,kBAAM6F,OAAO,GAAG3I,KAAK,CAACtB,GAAN,CAAUwJ,CAAC,IAAI;AAC7BK,cAAAA,cAAc,CAACL,CAAD,CAAd;AACA,qBAAO3G,MAAM,CAAC2G,CAAD,EAAIrF,UAAJ,CAAb;AACD,aAHe,CAAhB;AAIA,mBAAO8F,OAAP;AACD,WAPM,MAOA;AACL;AACA,gBAAI3I,KAAJ,EAAW;AACTuI,cAAAA,cAAc,CAACvI,KAAD,CAAd;AACD;;AACD,mBAAOuB,MAAM,CAACvB,KAAD,EAAQ6C,UAAR,CAAb;AACD;AACF;AACF,OAnDY,GAoDb,OAAO6E,IAAP,EAAa9H,IAAb,EAAmBwF,cAAnB,EAAmCC,WAAnC,KAAmD;AACjD,cAAM;AAAEuD,UAAAA;AAAF,YAAexD,cAArB;AACA,cAAMiD,UAAU,GACdhD,WAAW,CAACgB,SAAZ,IAAyBhB,WAAW,CAACgB,SAAZ,CAAsBgC,UADjD;AAEA,cAAMtD,yBAAyB,GAAG3D,gBAAgB,CAACiE,WAAD,CAAlD;AACAN,QAAAA,yBAAyB,CAACnF,IAA1B,GAAiCA,IAAjC,CALiD,CAKV;;AACvC,cAAMsF,aAAa,GAAGhJ,GAAG,CAACiE,UAAJ,CAAeuG,MAAM,EAArB,CAAtB;AACA,cAAMC,eAAe,GAAGnH,mBAAmB,CACzCuF,yBAAyB,CAACnF,IADe,EAEzC;AACED,UAAAA,MAAM,EAAEiD,aAAa,CAACE;AADxB,SAFyC,CAA3C;AAOA,YAAI+F,eAAJ;;AACA,YAAIhN,UAAJ,EAAgB;AACd,gBAAM2J,KAAK,GAAGV,SAAS,CACrBC,yBADqB,EAErBM,WAAW,CAACxC,UAFS,EAGrBqC,aAHqB,EAIrBA,aAJqB,EAKrB,IALqB,EAMrBE,cANqB,EAOrBC,WAPqB,CAAvB;AASA,gBAAMyD,sBAAsB,GAAG5M,GAAG,CAACiE,UAAJ,CAAeuG,MAAM,EAArB,CAA/B;AACA,gBAAMqC,MAAM,GAAGlG,UAAU,CAACjE,EAAX,KAAkB,MAAjC;AACA,gBAAMoK,UAAU,GAAGnG,UAAU,CAACjE,EAAX,KAAkB,MAArC;AACA,gBAAMqK,SAAS,GACb,CAACD,UAAD,KACC,CAACzF,uBAAD,IAA4BP,eAA5B,IAA+C,KADhD,CADF;;AAGA,cAAI;AACF,kBAAM4F,QAAQ,CAACpD,KAAT,CAAe,4BAAf,CAAN;AACAqD,YAAAA,eAAe,GAAG,MAAMxG,iBAAiB,CACvCuG,QADuC,EAEvCG,MAAM,GACF,IADE,GAEF7M,GAAG,CAACiE,UAAJ,CACE0C,UAAU,CAACqG,aADb,EAEErG,UAAU,CAAC5E,IAFb,CAJmC,EAQvC/B,GAAG,CAACsJ,KAAM,UACRyD,SAAS,GACL/M,GAAG,CAACsJ,KAAM,GAAEsD,sBAAuB,IAD9B,GAELE,UAAU,GACV9M,GAAG,CAACsJ,KAAM,GAAEsD,sBAAuB,IADzB,GAEV5M,GAAG,CAACsJ,KAAM,GAAEsD,sBAAuB,OAAM5D,aAAc,EAC5D,SAAQyB,eAAgB,IAAGmC,sBAAuB,EAdZ,EAevC5D,aAfuC,EAgBvCM,KAhBuC,EAiBvCyD,SAjBuC,EAkBvCD,UAAU,GACN;AACErL,cAAAA,cADF;AAEEF,cAAAA;AAFF,aADM,GAKN,IAvBmC,CAAzC;AAyBA,kBAAMmL,QAAQ,CAACpD,KAAT,CAAe,oCAAf,CAAN;AACD,WA5BD,CA4BE,OAAO2D,CAAP,EAAU;AACV,kBAAMP,QAAQ,CAACpD,KAAT,CACJ,wCADI,CAAN;AAGA,kBAAM2D,CAAN;AACD;AACF,SAlDD,MAkDO;AACL,gBAAM3D,KAAK,GAAGV,SAAS,CACrBC,yBADqB,EAErBM,WAAW,CAACxC,UAFS,EAGrB8D,eAHqB,EAIrBzB,aAJqB,EAKrB,IALqB,EAMrBE,cANqB,EAOrBC,WAPqB,CAAvB;AASA,gBAAM;AAAE+D,YAAAA,IAAF;AAAQC,YAAAA;AAAR,cAAmBnN,GAAG,CAACoN,OAAJ,CAAY9D,KAAZ,CAAzB;AACA,cAAI+D,kBAASC,OAAb,EAAsB,uBAASJ,IAAT;AACtB,gBAAMK,WAAW,GAAG,MAAMhH,eAAe,CACvCmG,QADuC,EAEvCQ,IAFuC,EAGvCC,MAHuC,CAAzC;AAKAR,UAAAA,eAAe,GAAGY,WAAW,CAACC,IAA9B;AACD;;AACD,cAAMA,IAAI,GAAGb,eAAb;AACA,cAAM,CAACc,GAAD,IAAQD,IAAd;;AACA,cAAME,MAAM,GAAG,CAAC,MAAM;AACpB,gBAAMrB,cAAc,GAClBhG,aAAa,IAAIkB,WAAjB,IAAgCT,eAAhC,IAAmDqF,UAAnD,GACIG,MAAM,IAAI;AACR,gBAAIA,MAAJ,EAAY;AACVH,cAAAA,UAAU,CACR,IADQ,EAERrF,eAFQ,EAGRwF,MAAM,CAACC,aAHC,CAAV;AAKD;AACF,WATL,GAUIC,OAAO,IAAI,CAAE,CAXnB;;AAYA,cAAInF,uBAAJ,EAA6B;AAC3B;AACA;AACA;AACA,gBAAI9H,IAAI,CAACkI,UAAL,IAAmB,CAAC9H,UAApB,IAAkC,CAACgF,SAAvC,EAAkD;AAChD,qBAAO8I,GAAG,CAACjC,IAAJ,CAAShJ,GAAT,CAAawJ,CAAC,IAAI;AACvB,sBAAM2B,EAAE,GAAGzO,UAAU,CAAC8M,CAAD,CAArB;AACAK,gBAAAA,cAAc,CAACsB,EAAD,CAAd;AACA,uBAAOtI,MAAM,CAACsI,EAAD,EAAKhH,UAAL,CAAb;AACD,eAJM,CAAP;AAKD,aAND,MAMO,IAAIpH,IAAI,CAACkI,UAAL,IAAmBf,aAAa,CAACE,SAArC,EAAgD;AACrD,qBAAO4G,IAAI,CAAChL,GAAL,CAASwJ,CAAC,IAAI;AACnB,sBAAM2B,EAAE,GAAGzO,UAAU,CAAC8M,CAAD,CAArB;AACAK,gBAAAA,cAAc,CAACsB,EAAD,CAAd;AACA,uBAAOtI,MAAM,CAACsI,EAAD,EAAKhH,UAAL,CAAb;AACD,eAJM,CAAP;AAKD,aANM,MAMA;AACL,oBAAMgH,EAAE,GAAGzO,UAAU,CAACuO,GAAD,CAArB;AACApB,cAAAA,cAAc,CAACsB,EAAD,CAAd;AACA,oBAAMrB,MAAM,GAAGjH,MAAM,CAACsI,EAAD,EAAKhH,UAAL,CAArB;AACA,qBAAO2F,MAAP;AACD;AACF,WAtBD,MAsBO;AACL,gBAAI/M,IAAI,CAACkI,UAAL,IAAmB,CAAC9H,UAApB,IAAkC,CAACgF,SAAvC,EAAkD;AAChD;AACA,oBAAM6G,IAAI,GAAGiC,GAAG,CAACjC,IAAJ,GACTiC,GAAG,CAACjC,IAAJ,CAAShJ,GAAT,CAAauJ,iBAAb,CADS,GAET,IAFJ;AAGA,qBAAO9F,iBAAiB,CAAC,EACvB,GAAGwH,GADoB;AAEvBjC,gBAAAA;AAFuB,eAAD,CAAxB;AAID,aATD,MASO,IAAIjM,IAAI,CAACkI,UAAL,IAAmBf,aAAa,CAACE,SAArC,EAAgD;AACrD;AACA,qBAAO4G,IAAI,CAAChL,GAAL,CAASiL,GAAG,IAAI;AACrBpB,gBAAAA,cAAc,CAACoB,GAAD,CAAd;AACA,uBAAOpI,MAAM,CAACoI,GAAD,EAAM9G,UAAN,CAAb;AACD,eAHM,CAAP;AAID,aANM,MAMA;AACL;AACA0F,cAAAA,cAAc,CAACoB,GAAD,CAAd;AACA,qBAAOpI,MAAM,CAACoI,GAAD,EAAM9G,UAAN,CAAb;AACD;AACF;AACF,SAzDc,GAAf;;AA0DA,YAAIhH,UAAJ,EAAgB;AACd,iBAAO;AACL2L,YAAAA,gBAAgB,EAAE5H,IAAI,CAACC,KAAL,CAAW2H,gBADxB;AAELE,YAAAA,IAAI,EAAEkC;AAFD,WAAP;AAID,SALD,MAKO;AACL,iBAAOA,MAAP;AACD;AACF;AAhOA,KAAP;AAkOD,GAzdkB,EA0dnBzG,UA1dmB,CAArB;AA4dD","sourcesContent":["// @flow\nconst nullableIf = (GraphQLNonNull, condition, Type) =>\n condition ? Type : new GraphQLNonNull(Type);\n\nimport type { Build, FieldWithHooksFunction } from \"graphile-build\";\nimport type { PgProc, PgType } from \"./PgIntrospectionPlugin\";\nimport type { SQL } from \"pg-sql2\";\nimport debugSql from \"./debugSql\";\nimport chalk from \"chalk\";\n\ntype ProcFieldOptions = {\n fieldWithHooks: FieldWithHooksFunction,\n computed?: boolean,\n isMutation?: boolean,\n isRootQuery?: boolean,\n forceList?: boolean,\n aggregateWrapper?: null | ((sql: SQL) => SQL),\n description?: string,\n pgTypeAndModifierModifier?:\n | null\n | ((\n pgType: PgType,\n pgTypeModifier: null | string | number\n ) => [PgType, null | string | number]),\n};\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 function procFieldDetails(\n proc: PgProc,\n build: {| ...Build |},\n options: {\n computed?: boolean,\n isMutation?: boolean,\n }\n) {\n const { computed = false, isMutation = false } = options;\n const {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgGetGqlInputTypeByTypeIdAndModifier,\n pgSql: sql,\n gql2pg,\n pgStrictFunctions: strictFunctions,\n graphql: { GraphQLNonNull },\n inflection,\n describePgEntity,\n sqlCommentByAddingTags,\n } = build;\n\n if (computed && isMutation) {\n throw new Error(\"Mutation procedure cannot be computed\");\n }\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 => {\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]);\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 // This wants to be compatible with both being field arguments and being\n // input object fields (e.g. for the aggregates plugin).\n const inputs = 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\n function makeSqlFunctionCall(\n rawArgs = {},\n { implicitArgs = [], unnest = false } = {}\n ): SQL {\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]);\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 unnest ? sql.fragment`unnest(${functionCall})` : functionCall;\n }\n\n return {\n inputs,\n makeSqlFunctionCall,\n outputArgNames,\n outputArgTypes,\n };\n}\n\nexport default function makeProcField(\n fieldName: string,\n proc: PgProc,\n build: {| ...Build |},\n options: ProcFieldOptions\n) {\n const {\n fieldWithHooks,\n computed = false,\n isMutation = false,\n isRootQuery = false,\n forceList = false,\n aggregateWrapper = null,\n description: overrideDescription = null,\n pgTypeAndModifierModifier = null,\n } = options;\n const {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgGetGqlTypeByTypeIdAndModifier,\n getTypeByName,\n pgSql: sql,\n parseResolveInfo,\n getSafeAliasFromResolveInfo,\n getSafeAliasFromAlias,\n pg2gql,\n newWithHooks,\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 const { inputs, makeSqlFunctionCall, outputArgNames, outputArgTypes } =\n procFieldDetails(proc, build, options);\n let args = inputs;\n\n /**\n * This is the return type the function claims to have; we\n * should not use it anywhere but these next few lines.\n */\n const baseReturnType = introspectionResultsByKind.typeById[proc.returnTypeId];\n\n /**\n * This is the return type we treat it as having, e.g. in\n * case it was modified by wrapping it in an aggregate or\n * similar.\n */\n const rawReturnType = pgTypeAndModifierModifier\n ? pgTypeAndModifierModifier(baseReturnType, null)[0]\n : baseReturnType;\n\n /**\n * This is the type without the array wrapper.\n */\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 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 sqlFunctionCall = makeSqlFunctionCall(\n parsedResolveInfoFragment.args,\n {\n implicitArgs: [parentTableAlias],\n unnest: rawReturnType.isPgArray,\n }\n );\n if (aggregateWrapper) {\n return aggregateWrapper(sqlFunctionCall);\n } else {\n const query = makeQuery(\n parsedResolveInfoFragment,\n ReturnType,\n sqlFunctionCall,\n functionAlias,\n queryBuilder\n );\n return sql.fragment`(${query})`;\n }\n }, getSafeAliasFromAlias(parsedResolveInfoFragment.alias));\n },\n };\n });\n }\n\n let ReturnType = type;\n let PayloadType;\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: overrideDescription\n ? overrideDescription\n : 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 sqlFunctionCall = makeSqlFunctionCall(\n parsedResolveInfoFragment.args,\n {\n unnest: rawReturnType.isPgArray,\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 ${sqlFunctionCall} ${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 sqlFunctionCall,\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,"file":"makeProcField.js","names":["_debugSql","_interopRequireDefault","require","_chalk","obj","__esModule","default","nullableIf","GraphQLNonNull","condition","Type","firstValue","firstKey","k","procFieldDetails","proc","build","options","computed","isMutation","pgIntrospectionResultsByKind","introspectionResultsByKind","pgGetGqlInputTypeByTypeIdAndModifier","pgSql","sql","gql2pg","pgStrictFunctions","strictFunctions","graphql","inflection","describePgEntity","sqlCommentByAddingTags","Error","sliceAmount","argNames","argTypeIds","reduce","prev","_","idx","argModes","length","push","argTypes","typeId","typeById","argModesWithOutput","outputArgNames","includes","outputArgTypes","requiredArgCount","Math","max","argDefaultsNum","variantFromName","name","match","variantFromTags","tags","variant","parseInt","notNullArgCount","isStrict","argGqlTypes","map","type","id","hint","class","chalk","bold","green","inputs","memo","argName","argIndex","gqlArgName","argument","makeSqlFunctionCall","rawArgs","implicitArgs","unnest","args","input","sqlArgValues","haveNames","value","sqlValue","sqlArgName","identifier","unshift","fragment","functionCall","namespace","join","makeProcField","fieldName","fieldWithHooks","isRootQuery","forceList","aggregateWrapper","description","overrideDescription","pgTypeAndModifierModifier","pgGetGqlTypeByTypeIdAndModifier","getTypeByName","parseResolveInfo","getSafeAliasFromResolveInfo","getSafeAliasFromAlias","pg2gql","newWithHooks","pgTweakFragmentForTypeAndModifier","GraphQLList","GraphQLString","GraphQLObjectType","GraphQLInputObjectType","getNamedType","isCompositeType","pgQueryFromResolveData","queryFromResolveData","pgAddStartEndCursor","addStartEndCursor","pgViaTemporaryTable","viaTemporaryTable","pgField","subscriptions","pgForbidSetofFunctionsToReturnNull","pgPrepareAndRun","baseReturnType","returnTypeId","rawReturnType","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","makeQuery","parsedResolveInfoFragment","ReturnType","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","sqlFunctionCall","alias","PayloadType","resultFieldName","functionMutationResultFieldName","isNotVoid","String","functionPayloadType","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"],"sources":["../../src/plugins/makeProcField.js"],"sourcesContent":["// @flow\nconst nullableIf = (GraphQLNonNull, condition, Type) =>\n condition ? Type : new GraphQLNonNull(Type);\n\nimport type { Build, FieldWithHooksFunction } from \"graphile-build\";\nimport type { PgProc, PgType } from \"./PgIntrospectionPlugin\";\nimport type { SQL } from \"pg-sql2\";\nimport debugSql from \"./debugSql\";\nimport chalk from \"chalk\";\n\ntype ProcFieldOptions = {\n fieldWithHooks: FieldWithHooksFunction,\n computed?: boolean,\n isMutation?: boolean,\n isRootQuery?: boolean,\n forceList?: boolean,\n aggregateWrapper?: null | ((sql: SQL) => SQL),\n description?: string,\n pgTypeAndModifierModifier?:\n | null\n | ((\n pgType: PgType,\n pgTypeModifier: null | string | number\n ) => [PgType, null | string | number]),\n};\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 function procFieldDetails(\n proc: PgProc,\n build: {| ...Build |},\n options: {\n computed?: boolean,\n isMutation?: boolean,\n }\n) {\n const { computed = false, isMutation = false } = options;\n const {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgGetGqlInputTypeByTypeIdAndModifier,\n pgSql: sql,\n gql2pg,\n pgStrictFunctions: strictFunctions,\n graphql: { GraphQLNonNull },\n inflection,\n describePgEntity,\n sqlCommentByAddingTags,\n } = build;\n\n if (computed && isMutation) {\n throw new Error(\"Mutation procedure cannot be computed\");\n }\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 => {\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]);\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 // This wants to be compatible with both being field arguments and being\n // input object fields (e.g. for the aggregates plugin).\n const inputs = 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\n function makeSqlFunctionCall(\n rawArgs = {},\n { implicitArgs = [], unnest = false } = {}\n ): SQL {\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]);\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 unnest ? sql.fragment`unnest(${functionCall})` : functionCall;\n }\n\n return {\n inputs,\n makeSqlFunctionCall,\n outputArgNames,\n outputArgTypes,\n };\n}\n\nexport default function makeProcField(\n fieldName: string,\n proc: PgProc,\n build: {| ...Build |},\n options: ProcFieldOptions\n) {\n const {\n fieldWithHooks,\n computed = false,\n isMutation = false,\n isRootQuery = false,\n forceList = false,\n aggregateWrapper = null,\n description: overrideDescription = null,\n pgTypeAndModifierModifier = null,\n } = options;\n const {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgGetGqlTypeByTypeIdAndModifier,\n getTypeByName,\n pgSql: sql,\n parseResolveInfo,\n getSafeAliasFromResolveInfo,\n getSafeAliasFromAlias,\n pg2gql,\n newWithHooks,\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 const { inputs, makeSqlFunctionCall, outputArgNames, outputArgTypes } =\n procFieldDetails(proc, build, options);\n let args = inputs;\n\n /**\n * This is the return type the function claims to have; we\n * should not use it anywhere but these next few lines.\n */\n const baseReturnType = introspectionResultsByKind.typeById[proc.returnTypeId];\n\n /**\n * This is the return type we treat it as having, e.g. in\n * case it was modified by wrapping it in an aggregate or\n * similar.\n */\n const rawReturnType = pgTypeAndModifierModifier\n ? pgTypeAndModifierModifier(baseReturnType, null)[0]\n : baseReturnType;\n\n /**\n * This is the type without the array wrapper.\n */\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 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 sqlFunctionCall = makeSqlFunctionCall(\n parsedResolveInfoFragment.args,\n {\n implicitArgs: [parentTableAlias],\n unnest: rawReturnType.isPgArray,\n }\n );\n if (aggregateWrapper) {\n return aggregateWrapper(sqlFunctionCall);\n } else {\n const query = makeQuery(\n parsedResolveInfoFragment,\n ReturnType,\n sqlFunctionCall,\n functionAlias,\n queryBuilder\n );\n return sql.fragment`(${query})`;\n }\n }, getSafeAliasFromAlias(parsedResolveInfoFragment.alias));\n },\n };\n });\n }\n\n let ReturnType = type;\n let PayloadType;\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: overrideDescription\n ? overrideDescription\n : 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 sqlFunctionCall = makeSqlFunctionCall(\n parsedResolveInfoFragment.args,\n {\n unnest: rawReturnType.isPgArray,\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 ${sqlFunctionCall} ${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 sqlFunctionCall,\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"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = pgField;
|
|
7
|
-
|
|
8
7
|
function pgField(build, fieldWithHooks, fieldName, fieldSpecGenerator, fieldScope = {}, whereFrom = false, options = {}) {
|
|
9
8
|
const {
|
|
10
9
|
pgSql: sql,
|
|
@@ -22,12 +21,10 @@ function pgField(build, fieldWithHooks, fieldName, fieldSpecGenerator, fieldScop
|
|
|
22
21
|
const namedType = build.graphql.getNamedType(FieldType);
|
|
23
22
|
const isListType = nullableType !== namedType && nullableType.constructor === build.graphql.GraphQLList;
|
|
24
23
|
const isLeafType = build.graphql.isLeafType(FieldType);
|
|
25
|
-
|
|
26
24
|
if (isLeafType && !options.pgType) {
|
|
27
25
|
// eslint-disable-next-line no-console
|
|
28
26
|
throw new Error("pgField call omits options.pgType for a leaf type; certain tweaks may not be applied!");
|
|
29
27
|
}
|
|
30
|
-
|
|
31
28
|
const {
|
|
32
29
|
getDataFromParsedResolveInfoFragment,
|
|
33
30
|
addDataGenerator
|
|
@@ -35,7 +32,8 @@ function pgField(build, fieldWithHooks, fieldName, fieldSpecGenerator, fieldScop
|
|
|
35
32
|
addDataGenerator(parsedResolveInfoFragment => {
|
|
36
33
|
const safeAlias = getSafeAliasFromAlias(parsedResolveInfoFragment.alias);
|
|
37
34
|
const resolveData = getDataFromParsedResolveInfoFragment(parsedResolveInfoFragment, FieldType);
|
|
38
|
-
return {
|
|
35
|
+
return {
|
|
36
|
+
...(options.hoistCursor && resolveData.usesCursor && resolveData.usesCursor.length ? {
|
|
39
37
|
usesCursor: [true]
|
|
40
38
|
} : null),
|
|
41
39
|
pgQuery: queryBuilder => {
|
|
@@ -47,7 +45,6 @@ function pgField(build, fieldWithHooks, fieldName, fieldSpecGenerator, fieldScop
|
|
|
47
45
|
asJson: true
|
|
48
46
|
}, innerQueryBuilder => {
|
|
49
47
|
innerQueryBuilder.parentQueryBuilder = queryBuilder;
|
|
50
|
-
|
|
51
48
|
if (typeof options.withQueryBuilder === "function") {
|
|
52
49
|
options.withQueryBuilder(innerQueryBuilder, {
|
|
53
50
|
parsedResolveInfoFragment
|
|
@@ -63,14 +60,12 @@ function pgField(build, fieldWithHooks, fieldName, fieldSpecGenerator, fieldScop
|
|
|
63
60
|
resolve(data, _args, _context, resolveInfo) {
|
|
64
61
|
const safeAlias = getSafeAliasFromResolveInfo(resolveInfo);
|
|
65
62
|
if (data.data == null) return null;
|
|
66
|
-
|
|
67
63
|
if (isListType) {
|
|
68
64
|
return data.data.map(d => d != null ? d[safeAlias] : null);
|
|
69
65
|
} else {
|
|
70
66
|
return data.data[safeAlias];
|
|
71
67
|
}
|
|
72
68
|
},
|
|
73
|
-
|
|
74
69
|
...fieldSpec
|
|
75
70
|
};
|
|
76
71
|
}, fieldScope);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"pgField.js","names":["pgField","build","fieldWithHooks","fieldName","fieldSpecGenerator","fieldScope","whereFrom","options","pgSql","sql","pgQueryFromResolveData","queryFromResolveData","getSafeAliasFromAlias","getSafeAliasFromResolveInfo","pgTweakFragmentForTypeAndModifier","fieldContext","fieldSpec","type","FieldType","nullableType","graphql","getNullableType","namedType","getNamedType","isListType","constructor","GraphQLList","isLeafType","pgType","Error","getDataFromParsedResolveInfoFragment","addDataGenerator","parsedResolveInfoFragment","safeAlias","alias","resolveData","hoistCursor","usesCursor","length","pgQuery","queryBuilder","select","tableAlias","getTableAlias","identifier","Symbol","query","pgTypeModifier","onlyJsonField","asJson","innerQueryBuilder","parentQueryBuilder","withQueryBuilder","context","rootValue","fragment","resolve","data","_args","_context","resolveInfo","map","d"],"sources":["../../src/plugins/pgField.js"],"sourcesContent":["export default function pgField(\n build,\n fieldWithHooks,\n fieldName,\n fieldSpecGenerator,\n fieldScope = {},\n whereFrom = false,\n options = {}\n) {\n const {\n pgSql: sql,\n pgQueryFromResolveData: queryFromResolveData,\n getSafeAliasFromAlias,\n getSafeAliasFromResolveInfo,\n pgTweakFragmentForTypeAndModifier,\n } = build;\n return fieldWithHooks(\n fieldName,\n fieldContext => {\n const fieldSpec =\n typeof fieldSpecGenerator === \"function\"\n ? fieldSpecGenerator(fieldContext)\n : fieldSpecGenerator;\n const { type: FieldType } = fieldSpec;\n const nullableType = build.graphql.getNullableType(FieldType);\n const namedType = build.graphql.getNamedType(FieldType);\n const isListType =\n nullableType !== namedType &&\n nullableType.constructor === build.graphql.GraphQLList;\n const isLeafType = build.graphql.isLeafType(FieldType);\n if (isLeafType && !options.pgType) {\n // eslint-disable-next-line no-console\n throw new Error(\n \"pgField call omits options.pgType for a leaf type; certain tweaks may not be applied!\"\n );\n }\n const { getDataFromParsedResolveInfoFragment, addDataGenerator } =\n fieldContext;\n addDataGenerator(parsedResolveInfoFragment => {\n const safeAlias = getSafeAliasFromAlias(\n parsedResolveInfoFragment.alias\n );\n const resolveData = getDataFromParsedResolveInfoFragment(\n parsedResolveInfoFragment,\n FieldType\n );\n return {\n ...(options.hoistCursor &&\n resolveData.usesCursor &&\n resolveData.usesCursor.length\n ? { usesCursor: [true] }\n : null),\n pgQuery: queryBuilder => {\n queryBuilder.select(() => {\n const tableAlias =\n whereFrom === false\n ? queryBuilder.getTableAlias()\n : sql.identifier(Symbol());\n const query = queryFromResolveData(\n whereFrom ? whereFrom(queryBuilder) : sql.identifier(Symbol()),\n isLeafType && options.pgType\n ? pgTweakFragmentForTypeAndModifier(\n tableAlias,\n options.pgType,\n options.pgTypeModifier,\n {}\n )\n : tableAlias,\n resolveData,\n whereFrom === false\n ? { onlyJsonField: true }\n : { asJson: true },\n innerQueryBuilder => {\n innerQueryBuilder.parentQueryBuilder = queryBuilder;\n if (typeof options.withQueryBuilder === \"function\") {\n options.withQueryBuilder(innerQueryBuilder, {\n parsedResolveInfoFragment,\n });\n }\n },\n queryBuilder.context,\n queryBuilder.rootValue\n );\n return sql.fragment`(${query})`;\n }, safeAlias);\n },\n };\n });\n\n return {\n resolve(data, _args, _context, resolveInfo) {\n const safeAlias = getSafeAliasFromResolveInfo(resolveInfo);\n if (data.data == null) return null;\n if (isListType) {\n return data.data.map(d => (d != null ? d[safeAlias] : null));\n } else {\n return data.data[safeAlias];\n }\n },\n ...fieldSpec,\n };\n },\n fieldScope\n );\n}\n"],"mappings":";;;;;;AAAe,SAASA,OAAOA,CAC7BC,KAAK,EACLC,cAAc,EACdC,SAAS,EACTC,kBAAkB,EAClBC,UAAU,GAAG,CAAC,CAAC,EACfC,SAAS,GAAG,KAAK,EACjBC,OAAO,GAAG,CAAC,CAAC,EACZ;EACA,MAAM;IACJC,KAAK,EAAEC,GAAG;IACVC,sBAAsB,EAAEC,oBAAoB;IAC5CC,qBAAqB;IACrBC,2BAA2B;IAC3BC;EACF,CAAC,GAAGb,KAAK;EACT,OAAOC,cAAc,CACnBC,SAAS,EACTY,YAAY,IAAI;IACd,MAAMC,SAAS,GACb,OAAOZ,kBAAkB,KAAK,UAAU,GACpCA,kBAAkB,CAACW,YAAY,CAAC,GAChCX,kBAAkB;IACxB,MAAM;MAAEa,IAAI,EAAEC;IAAU,CAAC,GAAGF,SAAS;IACrC,MAAMG,YAAY,GAAGlB,KAAK,CAACmB,OAAO,CAACC,eAAe,CAACH,SAAS,CAAC;IAC7D,MAAMI,SAAS,GAAGrB,KAAK,CAACmB,OAAO,CAACG,YAAY,CAACL,SAAS,CAAC;IACvD,MAAMM,UAAU,GACdL,YAAY,KAAKG,SAAS,IAC1BH,YAAY,CAACM,WAAW,KAAKxB,KAAK,CAACmB,OAAO,CAACM,WAAW;IACxD,MAAMC,UAAU,GAAG1B,KAAK,CAACmB,OAAO,CAACO,UAAU,CAACT,SAAS,CAAC;IACtD,IAAIS,UAAU,IAAI,CAACpB,OAAO,CAACqB,MAAM,EAAE;MACjC;MACA,MAAM,IAAIC,KAAK,CACb,uFACF,CAAC;IACH;IACA,MAAM;MAAEC,oCAAoC;MAAEC;IAAiB,CAAC,GAC9DhB,YAAY;IACdgB,gBAAgB,CAACC,yBAAyB,IAAI;MAC5C,MAAMC,SAAS,GAAGrB,qBAAqB,CACrCoB,yBAAyB,CAACE,KAC5B,CAAC;MACD,MAAMC,WAAW,GAAGL,oCAAoC,CACtDE,yBAAyB,EACzBd,SACF,CAAC;MACD,OAAO;QACL,IAAIX,OAAO,CAAC6B,WAAW,IACvBD,WAAW,CAACE,UAAU,IACtBF,WAAW,CAACE,UAAU,CAACC,MAAM,GACzB;UAAED,UAAU,EAAE,CAAC,IAAI;QAAE,CAAC,GACtB,IAAI,CAAC;QACTE,OAAO,EAAEC,YAAY,IAAI;UACvBA,YAAY,CAACC,MAAM,CAAC,MAAM;YACxB,MAAMC,UAAU,GACdpC,SAAS,KAAK,KAAK,GACfkC,YAAY,CAACG,aAAa,CAAC,CAAC,GAC5BlC,GAAG,CAACmC,UAAU,CAACC,MAAM,CAAC,CAAC,CAAC;YAC9B,MAAMC,KAAK,GAAGnC,oBAAoB,CAChCL,SAAS,GAAGA,SAAS,CAACkC,YAAY,CAAC,GAAG/B,GAAG,CAACmC,UAAU,CAACC,MAAM,CAAC,CAAC,CAAC,EAC9DlB,UAAU,IAAIpB,OAAO,CAACqB,MAAM,GACxBd,iCAAiC,CAC/B4B,UAAU,EACVnC,OAAO,CAACqB,MAAM,EACdrB,OAAO,CAACwC,cAAc,EACtB,CAAC,CACH,CAAC,GACDL,UAAU,EACdP,WAAW,EACX7B,SAAS,KAAK,KAAK,GACf;cAAE0C,aAAa,EAAE;YAAK,CAAC,GACvB;cAAEC,MAAM,EAAE;YAAK,CAAC,EACpBC,iBAAiB,IAAI;cACnBA,iBAAiB,CAACC,kBAAkB,GAAGX,YAAY;cACnD,IAAI,OAAOjC,OAAO,CAAC6C,gBAAgB,KAAK,UAAU,EAAE;gBAClD7C,OAAO,CAAC6C,gBAAgB,CAACF,iBAAiB,EAAE;kBAC1ClB;gBACF,CAAC,CAAC;cACJ;YACF,CAAC,EACDQ,YAAY,CAACa,OAAO,EACpBb,YAAY,CAACc,SACf,CAAC;YACD,OAAO7C,GAAG,CAAC8C,QAAS,IAAGT,KAAM,GAAE;UACjC,CAAC,EAAEb,SAAS,CAAC;QACf;MACF,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;MACLuB,OAAOA,CAACC,IAAI,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,WAAW,EAAE;QAC1C,MAAM3B,SAAS,GAAGpB,2BAA2B,CAAC+C,WAAW,CAAC;QAC1D,IAAIH,IAAI,CAACA,IAAI,IAAI,IAAI,EAAE,OAAO,IAAI;QAClC,IAAIjC,UAAU,EAAE;UACd,OAAOiC,IAAI,CAACA,IAAI,CAACI,GAAG,CAACC,CAAC,IAAKA,CAAC,IAAI,IAAI,GAAGA,CAAC,CAAC7B,SAAS,CAAC,GAAG,IAAK,CAAC;QAC9D,CAAC,MAAM;UACL,OAAOwB,IAAI,CAACA,IAAI,CAACxB,SAAS,CAAC;QAC7B;MACF,CAAC;MACD,GAAGjB;IACL,CAAC;EACH,CAAC,EACDX,UACF,CAAC;AACH"}
|
|
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = viaTemporaryTable;
|
|
7
|
-
|
|
8
7
|
var sql = _interopRequireWildcard(require("pg-sql2"));
|
|
9
|
-
|
|
10
8
|
var _debugSql = _interopRequireDefault(require("./debugSql"));
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
10
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
-
|
|
16
11
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
-
|
|
18
12
|
/*
|
|
19
13
|
* Originally we tried this with a CTE, but:
|
|
20
14
|
*
|
|
@@ -50,7 +44,6 @@ async function viaTemporaryTable(pgClient, sqlTypeIdentifier, sqlMutationQuery,
|
|
|
50
44
|
outputArgTypes,
|
|
51
45
|
outputArgNames
|
|
52
46
|
} = pgRecordInfo || {};
|
|
53
|
-
|
|
54
47
|
async function performQuery(pgClient, sqlQuery) {
|
|
55
48
|
// TODO: look into rowMode = 'array'
|
|
56
49
|
const {
|
|
@@ -60,7 +53,6 @@ async function viaTemporaryTable(pgClient, sqlTypeIdentifier, sqlMutationQuery,
|
|
|
60
53
|
if (_debugSql.default.enabled) (0, _debugSql.default)(text);
|
|
61
54
|
return pgClient.query(text, values);
|
|
62
55
|
}
|
|
63
|
-
|
|
64
56
|
if (!sqlTypeIdentifier) {
|
|
65
57
|
// It returns void, just perform the query!
|
|
66
58
|
const {
|
|
@@ -87,7 +79,8 @@ async function viaTemporaryTable(pgClient, sqlTypeIdentifier, sqlMutationQuery,
|
|
|
87
79
|
* is null`. We use this check to coalesce both into the canonical `null`
|
|
88
80
|
* representation to make it easier to deal with below.
|
|
89
81
|
*/
|
|
90
|
-
sql.query`(case when ${sqlResultSourceAlias} is null then null else ${sqlResultSourceAlias} end)` : isPgRecord ? sql.query`array[${sql.join(outputArgNames.map((outputArgName, idx) => sql.query`${sqlResultSourceAlias}.${sql.identifier(
|
|
82
|
+
sql.query`(case when ${sqlResultSourceAlias} is null then null else ${sqlResultSourceAlias} end)` : isPgRecord ? sql.query`array[${sql.join(outputArgNames.map((outputArgName, idx) => sql.query`${sqlResultSourceAlias}.${sql.identifier(
|
|
83
|
+
// According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,
|
|
91
84
|
// "If you omit the name for an output argument, the system will choose a default column name."
|
|
92
85
|
// In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.
|
|
93
86
|
outputArgName !== "" ? outputArgName : `column${idx + 1}`)}::text`), " ,")}]` : sql.query`(${sqlResultSourceAlias}.${sqlResultSourceAlias})::${sqlTypeIdentifier}`;
|
|
@@ -95,10 +88,10 @@ async function viaTemporaryTable(pgClient, sqlTypeIdentifier, sqlMutationQuery,
|
|
|
95
88
|
const {
|
|
96
89
|
rows
|
|
97
90
|
} = result;
|
|
98
|
-
const firstNonNullRow = rows.find(row => row !== null);
|
|
91
|
+
const firstNonNullRow = rows.find(row => row !== null);
|
|
92
|
+
// TODO: we should be able to have `pg` not interpret the results as
|
|
99
93
|
// objects and instead just return them as arrays - then we can just do
|
|
100
94
|
// `row[0]`. PR welcome!
|
|
101
|
-
|
|
102
95
|
const firstKey = firstNonNullRow && Object.keys(firstNonNullRow)[0];
|
|
103
96
|
const rawValues = rows.map(row => row && row[firstKey]);
|
|
104
97
|
const values = rawValues.filter(rawValue => rawValue !== null);
|
|
@@ -106,7 +99,8 @@ async function viaTemporaryTable(pgClient, sqlTypeIdentifier, sqlMutationQuery,
|
|
|
106
99
|
const convertFieldBack = isPgClassLike ? sql.query`\
|
|
107
100
|
select (str::${sqlTypeIdentifier}).*
|
|
108
101
|
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)}]::${outputArgTypes[idx].isFake ? sql.identifier("unknown") : sql.identifier(outputArgTypes[idx].namespaceName, outputArgTypes[idx].name)} as ${sql.identifier(
|
|
102
|
+
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(
|
|
103
|
+
// According to https://www.postgresql.org/docs/10/static/sql-createfunction.html,
|
|
110
104
|
// "If you omit the name for an output argument, the system will choose a default column name."
|
|
111
105
|
// In PG 9.x and 10, the column names appear to be assigned with a `column` prefix.
|
|
112
106
|
outputArgName !== "" ? outputArgName : `column${idx + 1}`)}`), ", ")}
|
|
@@ -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","isFake","namespaceName","name","filteredValuesResults","length","finalRows","__isNull","shift"],"mappings":";;;;;;;AAEA;;AAGA;;;;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEe,eAAeA,iBAAf,CACbC,QADa,EAEbC,iBAFa,EAGbC,gBAHa,EAIbC,oBAJa,EAKbC,cALa,EAMbC,aAAsB,GAAG,IANZ,EAObC,YAIC,GAAGC,SAXS,EAYb;AACA,QAAMC,UAAU,GAAGF,YAAY,IAAI,IAAnC;AACA,QAAM;AAAEG,IAAAA,cAAF;AAAkBC,IAAAA;AAAlB,MAAqCJ,YAAY,IAAI,EAA3D;;AAEA,iBAAeK,YAAf,CAA4BX,QAA5B,EAA8CY,QAA9C,EAAkE;AAChE;AACA,UAAM;AAAEC,MAAAA,IAAF;AAAQC,MAAAA;AAAR,QAAmBC,GAAG,CAACC,OAAJ,CAAYJ,QAAZ,CAAzB;AACA,QAAIK,kBAASC,OAAb,EAAsB,uBAASL,IAAT;AACtB,WAAOb,QAAQ,CAACmB,KAAT,CAAeN,IAAf,EAAqBC,MAArB,CAAP;AACD;;AAED,MAAI,CAACb,iBAAL,EAAwB;AACtB;AACA,UAAM;AAAEmB,MAAAA;AAAF,QAAW,MAAMT,YAAY,CACjCX,QADiC,EAEjCe,GAAG,CAACI,KAAM,QAAOhB,oBAAqB,QAAOD,gBAAiB,KAAIE,cAAe,EAFhD,CAAnC;AAIA,WAAOgB,IAAP;AACD,GAPD,MAOO;AACL;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACI,UAAMC,cAAc,GAAGhB,aAAa;AAChC;AACR;AACA;AACA;AACA;AACA;AACA;AACQU,IAAAA,GAAG,CAACI,KAAM,cAAahB,oBAAqB,2BAA0BA,oBAAqB,OAR3D,GAShCK,UAAU,GACVO,GAAG,CAACI,KAAM,SAAQJ,GAAG,CAACO,IAAJ,CAChBZ,cAAc,CAACa,GAAf,CACE,CAACC,aAAD,EAAgBC,GAAhB,KACEV,GAAG,CAACI,KAAM,GAAEhB,oBAAqB,IAAGY,GAAG,CAACW,UAAJ,EAClC;AACA;AACA;AACAF,IAAAA,aAAa,KAAK,EAAlB,GAAuBA,aAAvB,GAAwC,SAAQC,GAAG,GAAG,CAAE,EAJtB,CAKlC,QAPN,CADgB,EAUhB,IAVgB,CAWhB,GAZQ,GAaVV,GAAG,CAACI,KAAM,IAAGhB,oBAAqB,IAAGA,oBAAqB,MAAKF,iBAAkB,EAtBrF;AAuBA,UAAM0B,MAAM,GAAG,MAAMhB,YAAY,CAC/BX,QAD+B,EAE/Be,GAAG,CAACI,KAAM,QAAOhB,oBAAqB,QAAOD,gBAAiB,aAAYmB,cAAe,gBAAelB,oBAAqB,EAF9F,CAAjC;AAIA,UAAM;AAAEiB,MAAAA;AAAF,QAAWO,MAAjB;AACA,UAAMC,eAAe,GAAGR,IAAI,CAACS,IAAL,CAAUC,GAAG,IAAIA,GAAG,KAAK,IAAzB,CAAxB,CAxCK,CAyCL;AACA;AACA;;AACA,UAAMC,QAAQ,GAAGH,eAAe,IAAII,MAAM,CAACC,IAAP,CAAYL,eAAZ,EAA6B,CAA7B,CAApC;AACA,UAAMM,SAAS,GAAGd,IAAI,CAACG,GAAL,CAASO,GAAG,IAAIA,GAAG,IAAIA,GAAG,CAACC,QAAD,CAA1B,CAAlB;AACA,UAAMjB,MAAM,GAAGoB,SAAS,CAACC,MAAV,CAAiBC,QAAQ,IAAIA,QAAQ,KAAK,IAA1C,CAAf;AACA,UAAMC,cAAc,GAAGtB,GAAG,CAACW,UAAJ,CAAeY,MAAM,EAArB,CAAvB;AACA,UAAMC,gBAAgB,GAAGlC,aAAa,GAClCU,GAAG,CAACI,KAAM;AAClB,eAAelB,iBAAkB;AACjC,eAAec,GAAG,CAACyB,KAAJ,CAAU1B,MAAV,CAAkB,gBAHS,GAIlCN,UAAU,GACVO,GAAG,CAACI,KAAM;AAClB,SAASJ,GAAG,CAACO,IAAJ,CACCZ,cAAc,CAACa,GAAf,CACE,CAACC,aAAD,EAAgBC,GAAhB,KACEV,GAAG,CAACI,KAAM,IAAGkB,cAAe,uBAAsBtB,GAAG,CAAC0B,OAAJ,CAChDhB,GAAG,GAAG,CAD0C,CAEhD,MACAhB,cAAc,CAACgB,GAAD,CAAd,CAAoBiB,MAApB,GACI3B,GAAG,CAACW,UAAJ,CAAe,SAAf,CADJ,GAEIX,GAAG,CAACW,UAAJ,CACEjB,cAAc,CAACgB,GAAD,CAAd,CAAoBkB,aADtB,EAEElC,cAAc,CAACgB,GAAD,CAAd,CAAoBmB,IAFtB,CAIL,OAAM7B,GAAG,CAACW,UAAJ,EACL;AACA;AACA;AACAF,IAAAA,aAAa,KAAK,EAAlB,GAAuBA,aAAvB,GAAwC,SAAQC,GAAG,GAAG,CAAE,EAJnD,CAKL,EAhBN,CADD,EAmBC,IAnBD,CAoBC;AACV,eAAeV,GAAG,CAACO,IAAJ,CACLR,MAAM,CAACS,GAAP,CAAWiB,KAAK,IAAIzB,GAAG,CAACI,KAAM,IAAGJ,GAAG,CAACyB,KAAJ,CAAUA,KAAV,CAAiB,WAAlD,CADK,EAEL,IAFK,CAGL,QAAOH,cAAe,qBA1Bd,GA2BVtB,GAAG,CAACI,KAAM;AAClB,cAAclB,iBAAkB,OAAME,oBAAqB;AAC3D,eAAeY,GAAG,CAACyB,KAAJ,CAAU1B,MAAV,CAAkB,gBAjC7B;AAkCA,UAAM;AAAEM,MAAAA,IAAI,EAAEyB;AAAR,QACJ/B,MAAM,CAACgC,MAAP,GAAgB,CAAhB,GACI,MAAMnC,YAAY,CAChBX,QADgB,EAEhBe,GAAG,CAACI,KAAM,QAAOhB,oBAAqB,QAAOoC,gBAAiB,KAAInC,cAAe,EAFjE,CADtB,GAKI;AAAEgB,MAAAA,IAAI,EAAE;AAAR,KANN;AAOA,UAAM2B,SAAS,GAAGb,SAAS,CAACX,GAAV,CAAca,QAAQ;AACtC;AACN;AACA;AACA;AACA;AACA;AACMA,IAAAA,QAAQ,KAAK,IAAb,GAAoB;AAAEY,MAAAA,QAAQ,EAAE;AAAZ,KAApB,GAAyCH,qBAAqB,CAACI,KAAtB,EAPzB,CAAlB;AASA,WAAOF,SAAP;AACD;AACF","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"}
|
|
1
|
+
{"version":3,"file":"viaTemporaryTable.js","names":["sql","_interopRequireWildcard","require","_debugSql","_interopRequireDefault","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","viaTemporaryTable","pgClient","sqlTypeIdentifier","sqlMutationQuery","sqlResultSourceAlias","sqlResultQuery","isPgClassLike","pgRecordInfo","undefined","isPgRecord","outputArgTypes","outputArgNames","performQuery","sqlQuery","text","values","compile","debugSql","enabled","query","rows","selectionField","join","map","outputArgName","idx","identifier","result","firstNonNullRow","find","row","firstKey","keys","rawValues","filter","rawValue","sqlValuesAlias","Symbol","convertFieldBack","value","literal","isFake","namespaceName","name","filteredValuesResults","length","finalRows","__isNull","shift"],"sources":["../../src/plugins/viaTemporaryTable.js"],"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"],"mappings":"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"}
|
|
@@ -10,15 +10,15 @@ exports.parseInterval = parseInterval;
|
|
|
10
10
|
const NUMBER = "([+-]?\\d+)";
|
|
11
11
|
const YEAR = `${NUMBER}\\s+years?`;
|
|
12
12
|
const MONTH = `${NUMBER}\\s+mons?`;
|
|
13
|
-
const DAY = `${NUMBER}\\s+days?`;
|
|
13
|
+
const DAY = `${NUMBER}\\s+days?`;
|
|
14
|
+
// NOTE: PostgreSQL automatically overflows seconds into minutes and minutes
|
|
14
15
|
// into hours, so we can rely on minutes and seconds always being 2 digits
|
|
15
16
|
// (plus decimal for seconds). The overflow stops at hours - hours do not
|
|
16
17
|
// overflow into days, so could be arbitrarily long.
|
|
17
|
-
|
|
18
18
|
const TIME = "([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?)";
|
|
19
|
-
const INTERVAL = new RegExp("^" +
|
|
19
|
+
const INTERVAL = new RegExp("^" +
|
|
20
|
+
// All parts of an interval are optional
|
|
20
21
|
[YEAR, MONTH, DAY, TIME].map(str => "(?:" + str + ")?").join("\\s*") + "$");
|
|
21
|
-
|
|
22
22
|
function parseInterval(interval) {
|
|
23
23
|
const [, years, months, days, plusMinusTime, hours, minutes, seconds] = INTERVAL.exec(interval || "") || [];
|
|
24
24
|
const timeMultiplier = plusMinusTime === "-" ? -1 : 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"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"],"sources":["../src/postgresInterval.js"],"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"],"mappings":";;;;;;AAWA;AACA;AACA;AAEA,MAAMA,MAAM,GAAG,aAAa;AAC5B,MAAMC,IAAI,GAAI,GAAED,MAAO,YAAW;AAClC,MAAME,KAAK,GAAI,GAAEF,MAAO,WAAU;AAClC,MAAMG,GAAG,GAAI,GAAEH,MAAO,WAAU;AAChC;AACA;AACA;AACA;AACA,MAAMI,IAAI,GAAG,iDAAiD;AAE9D,MAAMC,QAAQ,GAAG,IAAIC,MAAM,CACzB,GAAG;AACD;AACA,CAACL,IAAI,EAAEC,KAAK,EAAEC,GAAG,EAAEC,IAAI,CAAC,CAACG,GAAG,CAACC,GAAG,IAAI,KAAK,GAAGA,GAAG,GAAG,IAAI,CAAC,CAACC,IAAI,CAAC,MAAM,CAAC,GACpE,GACJ,CAAC;AAEM,SAASC,aAAaA,CAACC,QAAgB,EAAY;EACxD,MAAM,GAAGC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,aAAa,EAAEC,KAAK,EAAEC,OAAO,EAAEC,OAAO,CAAC,GACnEb,QAAQ,CAACc,IAAI,CAACR,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE;EAErC,MAAMS,cAAc,GAAGL,aAAa,KAAK,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;EAErD,OAAO;IACLH,KAAK,EAAEA,KAAK,GAAGS,QAAQ,CAACT,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC;IACtCC,MAAM,EAAEA,MAAM,GAAGQ,QAAQ,CAACR,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC;IACzCC,IAAI,EAAEA,IAAI,GAAGO,QAAQ,CAACP,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC;IACnCE,KAAK,EAAEA,KAAK,GAAGI,cAAc,GAAGC,QAAQ,CAACL,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC;IACvDC,OAAO,EAAEA,OAAO,GAAGG,cAAc,GAAGC,QAAQ,CAACJ,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC;IAC7D;IACAC,OAAO,EAAEA,OAAO,GAAGE,cAAc,GAAGE,UAAU,CAACJ,OAAO,CAAC,GAAG;EAC5D,CAAC;AACH"}
|