{
  "version": 3,
  "sources": ["../src/formatModule.ts"],
  "sourcesContent": ["import { parse, print } from \"graphql\";\nimport { optimizeDocumentNode } from \"@graphql-tools/optimize\";\nimport { reduceNodeWatchQueryTransform } from \"./formatModuleTransforms/reduceNodeWatchQueryTransform\";\nimport invariant from \"invariant\";\nimport { stripFragmentReferenceFieldSelectionTransform } from \"./formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform\";\nimport { extractMetadataTransform } from \"./formatModuleTransforms/extractMetadataTransform\";\nimport { buildSchema, Source } from \"graphql\";\nimport { readFileSync } from \"fs\";\nimport dedupeJSONStringify from \"relay-compiler/lib/util/dedupeJSONStringify\";\n\nimport type { DocumentNode, GraphQLSchema } from \"graphql\";\nimport type { FormatModule } from \"relay-compiler/lib/language/RelayLanguagePluginInterface\";\nimport type { CompiledArtefactModule } from \"./types\";\nimport { Fragment } from \"relay-compiler\";\n\nexport type SupermassiveOutputType = \"V3\" | \"V2\" | \"BOTH\";\n\nexport interface FormatModuleOptions {\n  emitDocuments: boolean;\n  emitNarrowObservables: boolean;\n  emitQueryDebugComments: boolean;\n  emitSupermassiveDocuments: boolean;\n  supermassiveDocumentNodeOutputType: SupermassiveOutputType;\n  schema: string;\n  unstable_emitExecutionDocumentText: boolean;\n}\n\nfunction printDocumentComment(document: DocumentNode) {\n  return `/*\\n${print(document).trim()}\\n*/`;\n}\n\nfunction printDocument(document: DocumentNode) {\n  return `\n// Note: executionDocumentText is necessary for Lazy AST and build-time operations analysis\nconst executionDocumentText = \\`${print(document).trim()}\\`;\n`;\n}\n\nexport async function formatModuleFactory(\n  options: FormatModuleOptions,\n): Promise<FormatModule> {\n  const schema =\n    options.emitNarrowObservables || options.emitSupermassiveDocuments\n      ? buildSchema(\n          new Source(readFileSync(options.schema, \"utf-8\"), options.schema),\n        )\n      : null;\n\n  let addSupermassiveLegacyTypesToRequestDocument:\n    | undefined\n    | typeof import(\"@graphitation/supermassive\").addSupermassiveLegacyTypesToRequestDocument;\n  let addMinimalViableSchemaToRequestDocument:\n    | undefined\n    | typeof import(\"@graphitation/supermassive\").addMinimalViableSchemaToRequestDocument;\n  if (options.emitSupermassiveDocuments) {\n    ({\n      addSupermassiveLegacyTypesToRequestDocument,\n      addMinimalViableSchemaToRequestDocument,\n    } = await import(\"@graphitation/supermassive\"));\n  }\n\n  function generateExports(\n    moduleName: string,\n    docText: string,\n    emitNarrowObservables: boolean,\n  ) {\n    const exports: CompiledArtefactModule = {};\n    const originalDocument = parse(docText, { noLocation: true });\n    const optimizedDocument = optimizeDocumentNode(originalDocument);\n\n    if (!moduleName.endsWith(\"WatchNodeQuery.graphql\")) {\n      exports.executionQueryDocument =\n        stripFragmentReferenceFieldSelectionTransform(optimizedDocument);\n    }\n    if (emitNarrowObservables) {\n      invariant(schema, \"Expected a schema instance\");\n      exports.watchQueryDocument = reduceNodeWatchQueryTransform(\n        schema,\n        optimizedDocument,\n      );\n\n      exports.metadata = extractMetadataTransform(exports.watchQueryDocument);\n    }\n\n    if (options.emitSupermassiveDocuments && exports.executionQueryDocument) {\n      invariant(schema, \"Expected a schema instance\");\n      exports.executionQueryDocument = addTypesToRequestDocument(\n        schema,\n        exports.executionQueryDocument,\n        options.supermassiveDocumentNodeOutputType,\n        addMinimalViableSchemaToRequestDocument,\n        addSupermassiveLegacyTypesToRequestDocument,\n      ) as DocumentNode;\n    }\n\n    return exports;\n  }\n\n  return ({ docText, hash, moduleName, typeText, definition }) => {\n    const exports =\n      options.emitDocuments || options.unstable_emitExecutionDocumentText\n        ? docText &&\n          generateExports(\n            moduleName,\n            docText,\n            options.emitNarrowObservables &&\n              definition.kind === \"Request\" &&\n              definition.root.operation === \"query\",\n          )\n        : null;\n    const reExportWatchNodeQuery =\n      options.emitDocuments && definition.kind === \"Fragment\";\n\n    const components = [\n      typeText,\n      exports &&\n        options.unstable_emitExecutionDocumentText &&\n        exports.executionQueryDocument &&\n        printDocument(exports.executionQueryDocument),\n      exports &&\n        options.emitQueryDebugComments &&\n        !options.unstable_emitExecutionDocumentText &&\n        exports.executionQueryDocument &&\n        printDocumentComment(exports.executionQueryDocument),\n      exports &&\n        options.emitQueryDebugComments &&\n        exports.watchQueryDocument &&\n        printDocumentComment(exports.watchQueryDocument),\n      exports && options.emitDocuments && printExports(exports),\n      reExportWatchNodeQuery && printWatchNodeQueryReExport(definition),\n    ].filter(Boolean) as string[];\n\n    return `// @apollo-react-relay-duct-tape\n/* tslint:disable */\n/* eslint-disable */\n// @ts-nocheck\n${hash ? `/* ${hash} */\\n` : \"\"}\n${components.join(\"\\n\\n\")}`;\n  };\n}\n\n// TODO: hould simply not emit a WatchNodeQuery refetchable directive when there already is a @refetchable directive\nfunction printWatchNodeQueryReExport(definition: Fragment) {\n  const refetchable =\n    definition.directives.find(\n      (d) => d.name === \"refetchable\" && d.loc.kind === \"Source\",\n    ) ||\n    definition.directives.find(\n      (d) => d.name === \"refetchable\" && d.loc.kind === \"Generated\",\n    );\n  if (!refetchable) {\n    return undefined;\n  }\n  const queryNameArg = refetchable.args[0];\n  invariant(\n    queryNameArg.name === \"queryName\" && queryNameArg.value.kind === \"Literal\",\n    \"Expected a @refetchable(queryName:) argument\",\n  );\n\n  return `import { documents } from \"./${queryNameArg.value.value}.graphql\";\\nexport default documents;`;\n}\n\nfunction printExports(exports: CompiledArtefactModule) {\n  return `export const documents: import(\"@graphitation/apollo-react-relay-duct-tape-compiler\").CompiledArtefactModule = ${dedupeJSONStringify(\n    exports,\n  )};\\n\\nexport default documents;`;\n}\n\nfunction addTypesToRequestDocument(\n  schema: GraphQLSchema,\n  document: DocumentNode,\n  supermassiveDocumentNodeOutputType: SupermassiveOutputType,\n  addMinimalViableSchemaToRequestDocument: any,\n  addSupermassiveLegacyTypesToRequestDocument: any,\n) {\n  let finalDocument = document;\n  if (\n    supermassiveDocumentNodeOutputType === \"V3\" ||\n    supermassiveDocumentNodeOutputType === \"BOTH\"\n  ) {\n    finalDocument = addMinimalViableSchemaToRequestDocument(\n      schema,\n      finalDocument,\n      {\n        addTo: \"PROPERTY\",\n      },\n    );\n  }\n\n  if (\n    supermassiveDocumentNodeOutputType === \"V2\" ||\n    supermassiveDocumentNodeOutputType === \"BOTH\" ||\n    !supermassiveDocumentNodeOutputType\n  ) {\n    finalDocument = addSupermassiveLegacyTypesToRequestDocument(\n      schema,\n      finalDocument,\n    ) as unknown as DocumentNode;\n  }\n  return finalDocument;\n}\n"],
  "mappings": ";AAAA,SAAS,OAAO,aAAa;AAC7B,SAAS,4BAA4B;AACrC,SAAS,qCAAqC;AAC9C,OAAO,eAAe;AACtB,SAAS,qDAAqD;AAC9D,SAAS,gCAAgC;AACzC,SAAS,aAAa,cAAc;AACpC,SAAS,oBAAoB;AAC7B,OAAO,yBAAyB;AAmBhC,SAAS,qBAAqB,UAAwB;AACpD,SAAO;AAAA,EAAO,MAAM,QAAQ,EAAE,KAAK;AAAA;AACrC;AAEA,SAAS,cAAc,UAAwB;AAC7C,SAAO;AAAA;AAAA,kCAEyB,MAAM,QAAQ,EAAE,KAAK;AAAA;AAEvD;AAEA,eAAsB,oBACpB,SACuB;AACvB,QAAM,SACJ,QAAQ,yBAAyB,QAAQ,4BACrC;AAAA,IACE,IAAI,OAAO,aAAa,QAAQ,QAAQ,OAAO,GAAG,QAAQ,MAAM;AAAA,EAClE,IACA;AAEN,MAAI;AAGJ,MAAI;AAGJ,MAAI,QAAQ,2BAA2B;AACrC,KAAC;AAAA,MACC;AAAA,MACA;AAAA,IACF,IAAI,MAAM,OAAO,4BAA4B;AAAA,EAC/C;AAEA,WAAS,gBACP,YACA,SACA,uBACA;AACA,UAAM,UAAkC,CAAC;AACzC,UAAM,mBAAmB,MAAM,SAAS,EAAE,YAAY,KAAK,CAAC;AAC5D,UAAM,oBAAoB,qBAAqB,gBAAgB;AAE/D,QAAI,CAAC,WAAW,SAAS,wBAAwB,GAAG;AAClD,cAAQ,yBACN,8CAA8C,iBAAiB;AAAA,IACnE;AACA,QAAI,uBAAuB;AACzB,gBAAU,QAAQ,4BAA4B;AAC9C,cAAQ,qBAAqB;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AAEA,cAAQ,WAAW,yBAAyB,QAAQ,kBAAkB;AAAA,IACxE;AAEA,QAAI,QAAQ,6BAA6B,QAAQ,wBAAwB;AACvE,gBAAU,QAAQ,4BAA4B;AAC9C,cAAQ,yBAAyB;AAAA,QAC/B;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,EAAE,SAAS,MAAM,YAAY,UAAU,WAAW,MAAM;AAC9D,UAAM,UACJ,QAAQ,iBAAiB,QAAQ,qCAC7B,WACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,yBACN,WAAW,SAAS,aACpB,WAAW,KAAK,cAAc;AAAA,IAClC,IACA;AACN,UAAM,yBACJ,QAAQ,iBAAiB,WAAW,SAAS;AAE/C,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,WACE,QAAQ,sCACR,QAAQ,0BACR,cAAc,QAAQ,sBAAsB;AAAA,MAC9C,WACE,QAAQ,0BACR,CAAC,QAAQ,sCACT,QAAQ,0BACR,qBAAqB,QAAQ,sBAAsB;AAAA,MACrD,WACE,QAAQ,0BACR,QAAQ,sBACR,qBAAqB,QAAQ,kBAAkB;AAAA,MACjD,WAAW,QAAQ,iBAAiB,aAAa,OAAO;AAAA,MACxD,0BAA0B,4BAA4B,UAAU;AAAA,IAClE,EAAE,OAAO,OAAO;AAEhB,WAAO;AAAA;AAAA;AAAA;AAAA,EAIT,OAAO,MAAM;AAAA,IAAc;AAAA,EAC3B,WAAW,KAAK,MAAM;AAAA,EACtB;AACF;AAGA,SAAS,4BAA4B,YAAsB;AACzD,QAAM,cACJ,WAAW,WAAW;AAAA,IACpB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,IAAI,SAAS;AAAA,EACpD,KACA,WAAW,WAAW;AAAA,IACpB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,IAAI,SAAS;AAAA,EACpD;AACF,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,QAAM,eAAe,YAAY,KAAK,CAAC;AACvC;AAAA,IACE,aAAa,SAAS,eAAe,aAAa,MAAM,SAAS;AAAA,IACjE;AAAA,EACF;AAEA,SAAO,gCAAgC,aAAa,MAAM;AAAA;AAC5D;AAEA,SAAS,aAAa,SAAiC;AACrD,SAAO,kHAAkH;AAAA,IACvH;AAAA,EACF;AAAA;AAAA;AACF;AAEA,SAAS,0BACP,QACA,UACA,oCACA,yCACA,6CACA;AACA,MAAI,gBAAgB;AACpB,MACE,uCAAuC,QACvC,uCAAuC,QACvC;AACA,oBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MACE,uCAAuC,QACvC,uCAAuC,UACvC,CAAC,oCACD;AACA,oBAAgB;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;",
  "names": []
}
