@graphitation/apollo-react-relay-duct-tape-compiler 1.0.0-alpha.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.
Files changed (109) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +3 -0
  3. package/lib/cli.d.ts +3 -0
  4. package/lib/cli.d.ts.map +1 -0
  5. package/lib/cli.js +185 -0
  6. package/lib/cli.js.map +7 -0
  7. package/lib/cli.mjs +166 -0
  8. package/lib/cli.mjs.map +7 -0
  9. package/lib/compilerTransforms/annotateFragmentReferenceTransform.d.ts +13 -0
  10. package/lib/compilerTransforms/annotateFragmentReferenceTransform.d.ts.map +1 -0
  11. package/lib/compilerTransforms/annotateFragmentReferenceTransform.js +98 -0
  12. package/lib/compilerTransforms/annotateFragmentReferenceTransform.js.map +7 -0
  13. package/lib/compilerTransforms/annotateFragmentReferenceTransform.mjs +82 -0
  14. package/lib/compilerTransforms/annotateFragmentReferenceTransform.mjs.map +7 -0
  15. package/lib/compilerTransforms/emitApolloClientConnectionTransform.d.ts +12 -0
  16. package/lib/compilerTransforms/emitApolloClientConnectionTransform.d.ts.map +1 -0
  17. package/lib/compilerTransforms/emitApolloClientConnectionTransform.js +116 -0
  18. package/lib/compilerTransforms/emitApolloClientConnectionTransform.js.map +7 -0
  19. package/lib/compilerTransforms/emitApolloClientConnectionTransform.mjs +107 -0
  20. package/lib/compilerTransforms/emitApolloClientConnectionTransform.mjs.map +7 -0
  21. package/lib/compilerTransforms/enableNodeWatchQueryTransform.d.ts +9 -0
  22. package/lib/compilerTransforms/enableNodeWatchQueryTransform.d.ts.map +1 -0
  23. package/lib/compilerTransforms/enableNodeWatchQueryTransform.js +78 -0
  24. package/lib/compilerTransforms/enableNodeWatchQueryTransform.js.map +7 -0
  25. package/lib/compilerTransforms/enableNodeWatchQueryTransform.mjs +62 -0
  26. package/lib/compilerTransforms/enableNodeWatchQueryTransform.mjs.map +7 -0
  27. package/lib/compilerTransforms/retainConnectionDirectiveTransform.d.ts +13 -0
  28. package/lib/compilerTransforms/retainConnectionDirectiveTransform.d.ts.map +1 -0
  29. package/lib/compilerTransforms/retainConnectionDirectiveTransform.js +83 -0
  30. package/lib/compilerTransforms/retainConnectionDirectiveTransform.js.map +7 -0
  31. package/lib/compilerTransforms/retainConnectionDirectiveTransform.mjs +67 -0
  32. package/lib/compilerTransforms/retainConnectionDirectiveTransform.mjs.map +7 -0
  33. package/lib/compilerTransforms/utils.d.ts +3 -0
  34. package/lib/compilerTransforms/utils.d.ts.map +1 -0
  35. package/lib/compilerTransforms/utils.js +43 -0
  36. package/lib/compilerTransforms/utils.js.map +7 -0
  37. package/lib/compilerTransforms/utils.mjs +14 -0
  38. package/lib/compilerTransforms/utils.mjs.map +7 -0
  39. package/lib/findGraphQLTags.d.ts +8 -0
  40. package/lib/findGraphQLTags.d.ts.map +1 -0
  41. package/lib/findGraphQLTags.js +90 -0
  42. package/lib/findGraphQLTags.js.map +7 -0
  43. package/lib/findGraphQLTags.mjs +61 -0
  44. package/lib/findGraphQLTags.mjs.map +7 -0
  45. package/lib/formatModule.d.ts +10 -0
  46. package/lib/formatModule.d.ts.map +1 -0
  47. package/lib/formatModule.js +121 -0
  48. package/lib/formatModule.js.map +7 -0
  49. package/lib/formatModule.mjs +93 -0
  50. package/lib/formatModule.mjs.map +7 -0
  51. package/lib/formatModuleTransforms/extractMetadataTransform.d.ts +33 -0
  52. package/lib/formatModuleTransforms/extractMetadataTransform.d.ts.map +1 -0
  53. package/lib/formatModuleTransforms/extractMetadataTransform.js +208 -0
  54. package/lib/formatModuleTransforms/extractMetadataTransform.js.map +7 -0
  55. package/lib/formatModuleTransforms/extractMetadataTransform.mjs +182 -0
  56. package/lib/formatModuleTransforms/extractMetadataTransform.mjs.map +7 -0
  57. package/lib/formatModuleTransforms/reduceNodeWatchQueryTransform.d.ts +14 -0
  58. package/lib/formatModuleTransforms/reduceNodeWatchQueryTransform.d.ts.map +1 -0
  59. package/lib/formatModuleTransforms/reduceNodeWatchQueryTransform.js +101 -0
  60. package/lib/formatModuleTransforms/reduceNodeWatchQueryTransform.js.map +7 -0
  61. package/lib/formatModuleTransforms/reduceNodeWatchQueryTransform.mjs +79 -0
  62. package/lib/formatModuleTransforms/reduceNodeWatchQueryTransform.mjs.map +7 -0
  63. package/lib/formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform.d.ts +10 -0
  64. package/lib/formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform.d.ts.map +1 -0
  65. package/lib/formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform.js +41 -0
  66. package/lib/formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform.js.map +7 -0
  67. package/lib/formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform.mjs +22 -0
  68. package/lib/formatModuleTransforms/stripFragmentReferenceFieldSelectionTransform.mjs.map +7 -0
  69. package/lib/index.d.ts +3 -0
  70. package/lib/index.d.ts.map +1 -0
  71. package/lib/index.js +19 -0
  72. package/lib/index.js.map +7 -0
  73. package/lib/index.mjs +3 -0
  74. package/lib/index.mjs.map +7 -0
  75. package/lib/relayCompilerLanguagePlugin.d.ts +4 -0
  76. package/lib/relayCompilerLanguagePlugin.d.ts.map +1 -0
  77. package/lib/relayCompilerLanguagePlugin.js +91 -0
  78. package/lib/relayCompilerLanguagePlugin.js.map +7 -0
  79. package/lib/relayCompilerLanguagePlugin.mjs +65 -0
  80. package/lib/relayCompilerLanguagePlugin.mjs.map +7 -0
  81. package/lib/rewriteGraphitationDirectives.d.ts +15 -0
  82. package/lib/rewriteGraphitationDirectives.d.ts.map +1 -0
  83. package/lib/rewriteGraphitationDirectives.js +105 -0
  84. package/lib/rewriteGraphitationDirectives.js.map +7 -0
  85. package/lib/rewriteGraphitationDirectives.mjs +83 -0
  86. package/lib/rewriteGraphitationDirectives.mjs.map +7 -0
  87. package/lib/typeGenerator.d.ts +3 -0
  88. package/lib/typeGenerator.d.ts.map +1 -0
  89. package/lib/typeGenerator.js +30 -0
  90. package/lib/typeGenerator.js.map +7 -0
  91. package/lib/typeGenerator.mjs +11 -0
  92. package/lib/typeGenerator.mjs.map +7 -0
  93. package/lib/types.d.ts +9 -0
  94. package/lib/types.d.ts.map +1 -0
  95. package/lib/types.js +16 -0
  96. package/lib/types.js.map +7 -0
  97. package/lib/types.mjs +0 -0
  98. package/lib/types.mjs.map +7 -0
  99. package/lib/typescriptTransforms/createImportDocumentsTransform.d.ts +10 -0
  100. package/lib/typescriptTransforms/createImportDocumentsTransform.d.ts.map +1 -0
  101. package/lib/typescriptTransforms/createImportDocumentsTransform.js +161 -0
  102. package/lib/typescriptTransforms/createImportDocumentsTransform.js.map +7 -0
  103. package/lib/typescriptTransforms/createImportDocumentsTransform.mjs +134 -0
  104. package/lib/typescriptTransforms/createImportDocumentsTransform.mjs.map +7 -0
  105. package/lib/typings.d.js +1 -0
  106. package/lib/typings.d.js.map +7 -0
  107. package/lib/typings.d.mjs +0 -0
  108. package/lib/typings.d.mjs.map +7 -0
  109. package/package.json +55 -0
@@ -0,0 +1,83 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src/rewriteGraphitationDirectives.ts
22
+ import {
23
+ parse,
24
+ print,
25
+ visit
26
+ } from "graphql";
27
+ import invariant from "invariant";
28
+ function rewriteGraphitationDirectives(document) {
29
+ const documentNode = parse(document);
30
+ const rewrittenDocumentNode = visit(documentNode, {
31
+ Directive(directiveNode, _key, _parent, _path, ancestors) {
32
+ switch (directiveNode.name.value) {
33
+ case "watchNode": {
34
+ const fragmentDefinitionNode = ancestors[ancestors.length - 1];
35
+ invariant(
36
+ !Array.isArray(fragmentDefinitionNode) && fragmentDefinitionNode.kind === "FragmentDefinition",
37
+ "Expected @watchNode to be used on a fragment"
38
+ );
39
+ return emitRefetchableDirective(fragmentDefinitionNode);
40
+ }
41
+ case "graphitation_test_operation": {
42
+ return __spreadProps(__spreadValues({}, directiveNode), {
43
+ name: {
44
+ kind: "Name",
45
+ value: "raw_response_type"
46
+ }
47
+ });
48
+ }
49
+ default: {
50
+ return void 0;
51
+ }
52
+ }
53
+ }
54
+ });
55
+ return print(rewrittenDocumentNode);
56
+ }
57
+ function emitRefetchableDirective(fragmentDefinitionNode) {
58
+ const fragmentName = fragmentDefinitionNode.name.value;
59
+ const fragmentBaseName = fragmentName.replace(/Fragment$/, "");
60
+ return {
61
+ kind: "Directive",
62
+ name: {
63
+ kind: "Name",
64
+ value: "refetchable"
65
+ },
66
+ arguments: [
67
+ {
68
+ kind: "Argument",
69
+ name: {
70
+ kind: "Name",
71
+ value: "queryName"
72
+ },
73
+ value: {
74
+ kind: "StringValue",
75
+ value: `${fragmentBaseName}WatchNodeQuery`
76
+ }
77
+ }
78
+ ]
79
+ };
80
+ }
81
+ export {
82
+ rewriteGraphitationDirectives
83
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/rewriteGraphitationDirectives.ts"],
4
+ "sourcesContent": ["import {\n DirectiveNode,\n parse,\n print,\n visit,\n ASTNode,\n FragmentDefinitionNode,\n} from \"graphql\";\nimport invariant from \"invariant\";\n\ndeclare global {\n interface ArrayConstructor {\n isArray(arg: ReadonlyArray<any> | any): arg is ReadonlyArray<any>;\n }\n}\n\n/**\n * This rewrites graphitation specific directives to relay ones. Currently it does the following:\n *\n * - `@graphitation_test_operation` is rewritten to `@raw_response_type`.\n * In the future this should probably also add `@relay_test_operation`.\n *\n * @param document A single GraphQL document\n */\nexport function rewriteGraphitationDirectives(document: string) {\n const documentNode = parse(document);\n const rewrittenDocumentNode = visit(documentNode, {\n Directive(\n directiveNode,\n _key,\n _parent,\n _path,\n ancestors,\n ): DirectiveNode | undefined {\n switch (directiveNode.name.value) {\n case \"watchNode\": {\n const fragmentDefinitionNode = ancestors[ancestors.length - 1];\n invariant(\n !Array.isArray(fragmentDefinitionNode) &&\n fragmentDefinitionNode.kind === \"FragmentDefinition\",\n \"Expected @watchNode to be used on a fragment\",\n );\n return emitRefetchableDirective(fragmentDefinitionNode);\n }\n case \"graphitation_test_operation\": {\n return {\n ...directiveNode,\n name: {\n kind: \"Name\",\n value: \"raw_response_type\",\n },\n };\n }\n default: {\n return undefined;\n }\n }\n },\n });\n return print(rewrittenDocumentNode);\n}\n\nfunction emitRefetchableDirective(\n fragmentDefinitionNode: FragmentDefinitionNode,\n): DirectiveNode {\n const fragmentName = fragmentDefinitionNode.name.value;\n const fragmentBaseName = fragmentName.replace(/Fragment$/, \"\");\n return {\n kind: \"Directive\",\n name: {\n kind: \"Name\",\n value: \"refetchable\",\n },\n arguments: [\n {\n kind: \"Argument\",\n name: {\n kind: \"Name\",\n value: \"queryName\",\n },\n value: {\n kind: \"StringValue\",\n value: `${fragmentBaseName}WatchNodeQuery`,\n },\n },\n ],\n };\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,OAAO,eAAe;AAgBf,SAAS,8BAA8B,UAAkB;AAC9D,QAAM,eAAe,MAAM,QAAQ;AACnC,QAAM,wBAAwB,MAAM,cAAc;AAAA,IAChD,UACE,eACA,MACA,SACA,OACA,WAC2B;AAC3B,cAAQ,cAAc,KAAK,OAAO;AAAA,QAChC,KAAK,aAAa;AAChB,gBAAM,yBAAyB,UAAU,UAAU,SAAS,CAAC;AAC7D;AAAA,YACE,CAAC,MAAM,QAAQ,sBAAsB,KACnC,uBAAuB,SAAS;AAAA,YAClC;AAAA,UACF;AACA,iBAAO,yBAAyB,sBAAsB;AAAA,QACxD;AAAA,QACA,KAAK,+BAA+B;AAClC,iBAAO,iCACF,gBADE;AAAA,YAEL,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,QACA,SAAS;AACP,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO,MAAM,qBAAqB;AACpC;AAEA,SAAS,yBACP,wBACe;AACf,QAAM,eAAe,uBAAuB,KAAK;AACjD,QAAM,mBAAmB,aAAa,QAAQ,aAAa,EAAE;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO,GAAG;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import { TypeGenerator } from "relay-compiler/lib/language/RelayLanguagePluginInterface";
2
+ export declare function generateFactory(wrappedGenerate: TypeGenerator["generate"]): (schema: import("relay-compiler").Schema, node: import("relay-compiler").Fragment | import("relay-compiler").Root, options: import("relay-compiler/lib/language/RelayLanguagePluginInterface").TypeGeneratorOptions) => string;
3
+ //# sourceMappingURL=typeGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeGenerator.d.ts","sourceRoot":"","sources":["../src/typeGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0DAA0D,CAAC;AAEzF,wBAAgB,eAAe,CAAC,eAAe,EAAE,aAAa,CAAC,UAAU,CAAC,kOAYzE"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var typeGenerator_exports = {};
20
+ __export(typeGenerator_exports, {
21
+ generateFactory: () => generateFactory
22
+ });
23
+ module.exports = __toCommonJS(typeGenerator_exports);
24
+ function generateFactory(wrappedGenerate) {
25
+ const generate = (schema, node, options) => {
26
+ const generated = wrappedGenerate(schema, node, options);
27
+ return generated.replace("relay-runtime", "@graphitation/apollo-react-relay-duct-tape").replace(/^\s+readonly __is[A-Z].+;\n/gm, "");
28
+ };
29
+ return generate;
30
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/typeGenerator.ts"],
4
+ "sourcesContent": ["import { TypeGenerator } from \"relay-compiler/lib/language/RelayLanguagePluginInterface\";\n\nexport function generateFactory(wrappedGenerate: TypeGenerator[\"generate\"]) {\n const generate: TypeGenerator[\"generate\"] = (schema, node, options) => {\n const generated = wrappedGenerate(schema, node, options);\n return (\n generated\n .replace(\"relay-runtime\", \"@graphitation/apollo-react-relay-duct-tape\")\n // These fields in the `@raw_response_type` output are really just for relay-runtime, so for now we can just\n // strip them out entirely.\n .replace(/^\\s+readonly __is[A-Z].+;\\n/gm, \"\")\n );\n };\n return generate;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,gBAAgB,iBAA4C;AAC1E,QAAM,WAAsC,CAAC,QAAQ,MAAM,YAAY;AACrE,UAAM,YAAY,gBAAgB,QAAQ,MAAM,OAAO;AACvD,WACE,UACG,QAAQ,iBAAiB,4CAA4C,EAGrE,QAAQ,iCAAiC,EAAE;AAAA,EAElD;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ // src/typeGenerator.ts
2
+ function generateFactory(wrappedGenerate) {
3
+ const generate = (schema, node, options) => {
4
+ const generated = wrappedGenerate(schema, node, options);
5
+ return generated.replace("relay-runtime", "@graphitation/apollo-react-relay-duct-tape").replace(/^\s+readonly __is[A-Z].+;\n/gm, "");
6
+ };
7
+ return generate;
8
+ }
9
+ export {
10
+ generateFactory
11
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/typeGenerator.ts"],
4
+ "sourcesContent": ["import { TypeGenerator } from \"relay-compiler/lib/language/RelayLanguagePluginInterface\";\n\nexport function generateFactory(wrappedGenerate: TypeGenerator[\"generate\"]) {\n const generate: TypeGenerator[\"generate\"] = (schema, node, options) => {\n const generated = wrappedGenerate(schema, node, options);\n return (\n generated\n .replace(\"relay-runtime\", \"@graphitation/apollo-react-relay-duct-tape\")\n // These fields in the `@raw_response_type` output are really just for relay-runtime, so for now we can just\n // strip them out entirely.\n .replace(/^\\s+readonly __is[A-Z].+;\\n/gm, \"\")\n );\n };\n return generate;\n}\n"],
5
+ "mappings": ";AAEO,SAAS,gBAAgB,iBAA4C;AAC1E,QAAM,WAAsC,CAAC,QAAQ,MAAM,YAAY;AACrE,UAAM,YAAY,gBAAgB,QAAQ,MAAM,OAAO;AACvD,WACE,UACG,QAAQ,iBAAiB,4CAA4C,EAGrE,QAAQ,iCAAiC,EAAE;AAAA,EAElD;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
package/lib/types.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { DocumentNode } from "graphql";
2
+ import type { Metadata } from "./formatModuleTransforms/extractMetadataTransform";
3
+ export type { Metadata };
4
+ export interface CompiledArtefactModule {
5
+ executionQueryDocument?: DocumentNode;
6
+ watchQueryDocument?: DocumentNode;
7
+ metadata?: Metadata;
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mDAAmD,CAAC;AAElF,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,WAAW,sBAAsB;IACrC,sBAAsB,CAAC,EAAE,YAAY,CAAC;IACtC,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB"}
package/lib/types.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/types.ts"],
4
+ "sourcesContent": ["import type { DocumentNode } from \"graphql\";\n\nimport type { Metadata } from \"./formatModuleTransforms/extractMetadataTransform\";\n\nexport type { Metadata };\n\nexport interface CompiledArtefactModule {\n executionQueryDocument?: DocumentNode;\n watchQueryDocument?: DocumentNode;\n metadata?: Metadata;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
+ "names": []
7
+ }
package/lib/types.mjs ADDED
File without changes
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * TODO:
3
+ * - Don't hardcode identifiers but check if they're aliased from their imports.
4
+ * - Support mutations and subscriptions
5
+ * - Properly emit errors from transformer, is invariant ok?
6
+ */
7
+ import * as ts from "typescript";
8
+ export declare function createImportDocumentsTransform(): ts.TransformerFactory<ts.SourceFile>;
9
+ export { createImportDocumentsTransform as factory };
10
+ //# sourceMappingURL=createImportDocumentsTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createImportDocumentsTransform.d.ts","sourceRoot":"","sources":["../../src/typescriptTransforms/createImportDocumentsTransform.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAYjC,wBAAgB,8BAA8B,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,UAAU,CAAC,CA8CrF;AAGD,OAAO,EAAE,8BAA8B,IAAI,OAAO,EAAE,CAAC"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var createImportDocumentsTransform_exports = {};
30
+ __export(createImportDocumentsTransform_exports, {
31
+ createImportDocumentsTransform: () => createImportDocumentsTransform,
32
+ factory: () => createImportDocumentsTransform
33
+ });
34
+ module.exports = __toCommonJS(createImportDocumentsTransform_exports);
35
+ var import_invariant = __toESM(require("invariant"));
36
+ var ts = __toESM(require("typescript"));
37
+ var import_graphql = require("graphql");
38
+ var path = __toESM(require("path"));
39
+ var fs = __toESM(require("fs"));
40
+ const PREFIX = "__graphitation_";
41
+ const QUERIES_NAMESPACE = "generatedQueries";
42
+ function createImportDocumentsTransform() {
43
+ return (context) => {
44
+ const imports = [];
45
+ const visitor = (node) => {
46
+ if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && node.tag.escapedText === "graphql") {
47
+ const documentNodes = createGraphQLDocumentNodes(
48
+ node,
49
+ context.getCompilerOptions().module
50
+ );
51
+ if (documentNodes) {
52
+ const [modulePath, importStatement, replacementNode] = documentNodes;
53
+ const artefactFile = path.join(
54
+ path.dirname(node.getSourceFile().fileName),
55
+ modulePath.text
56
+ ) + ".ts";
57
+ const emitImport = fs.existsSync(artefactFile);
58
+ if (emitImport) {
59
+ imports.push(importStatement);
60
+ return replacementNode;
61
+ }
62
+ }
63
+ }
64
+ return ts.visitEachChild(node, visitor, context);
65
+ };
66
+ return (sourceFile) => {
67
+ const outputSourceFile = ts.visitNode(sourceFile, visitor);
68
+ return ts.factory.updateSourceFile(outputSourceFile, [
69
+ ...imports,
70
+ ...outputSourceFile.statements
71
+ ]);
72
+ };
73
+ };
74
+ }
75
+ function createGraphQLDocumentNodes(graphqlTagTemplateNode, moduleKind = ts.ModuleKind.ES2015) {
76
+ var _a;
77
+ const graphqlDoc = ts.isNoSubstitutionTemplateLiteral(
78
+ graphqlTagTemplateNode.template
79
+ ) ? graphqlTagTemplateNode.template.rawText : graphqlTagTemplateNode.template.head.rawText;
80
+ (0, import_invariant.default)(graphqlDoc, "Expected a GraphQL document");
81
+ const graphqlAST = (0, import_graphql.parse)(graphqlDoc);
82
+ const definitionNode = graphqlAST.definitions[0];
83
+ if (definitionNode.kind === "OperationDefinition") {
84
+ if (definitionNode.operation !== "query") {
85
+ return void 0;
86
+ }
87
+ const operationName = (_a = definitionNode.name) == null ? void 0 : _a.value;
88
+ (0, import_invariant.default)(operationName, "Operations are required to have a name");
89
+ const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${operationName}`;
90
+ const modulePath = createModulePathNode(operationName);
91
+ return [
92
+ modulePath,
93
+ createImportStatement(moduleKind, namespaceName, modulePath),
94
+ ts.factory.createIdentifier(namespaceName)
95
+ ];
96
+ } else if (definitionNode.kind === "FragmentDefinition") {
97
+ const queryName = getQueryName(definitionNode);
98
+ const fragmentName = definitionNode.name.value;
99
+ const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${fragmentName}`;
100
+ const modulePath = createModulePathNode(queryName);
101
+ return [
102
+ modulePath,
103
+ createImportStatement(moduleKind, namespaceName, modulePath),
104
+ ts.factory.createIdentifier(namespaceName)
105
+ ];
106
+ }
107
+ (0, import_invariant.default)(false, `Unhandled GraphQL definition type: ${definitionNode.kind}`);
108
+ }
109
+ function createModulePathNode(baseName) {
110
+ return ts.factory.createStringLiteral(`./__generated__/${baseName}.graphql`);
111
+ }
112
+ function createImportStatement(moduleKind, namespaceName, modulePath) {
113
+ if (moduleKind === ts.ModuleKind.CommonJS) {
114
+ return ts.factory.createVariableStatement(
115
+ void 0,
116
+ ts.factory.createVariableDeclarationList([
117
+ ts.factory.createVariableDeclaration(
118
+ namespaceName,
119
+ void 0,
120
+ void 0,
121
+ ts.factory.createPropertyAccessExpression(
122
+ ts.factory.createCallExpression(
123
+ ts.factory.createIdentifier("require"),
124
+ [],
125
+ [modulePath]
126
+ ),
127
+ ts.factory.createIdentifier("documents")
128
+ )
129
+ )
130
+ ])
131
+ );
132
+ } else {
133
+ return ts.factory.createImportDeclaration(
134
+ void 0,
135
+ void 0,
136
+ ts.factory.createImportClause(
137
+ false,
138
+ void 0,
139
+ ts.factory.createNamedImports([
140
+ ts.factory.createImportSpecifier(
141
+ false,
142
+ ts.factory.createIdentifier("documents"),
143
+ ts.factory.createIdentifier(namespaceName)
144
+ )
145
+ ])
146
+ ),
147
+ modulePath
148
+ );
149
+ }
150
+ }
151
+ function getQueryName(definitionNode) {
152
+ var _a, _b, _c, _d;
153
+ const refetchableQueryNameNode = (_d = (_c = (_b = (_a = definitionNode.directives) == null ? void 0 : _a.find((directive) => directive.name.value === "refetchable")) == null ? void 0 : _b.arguments) == null ? void 0 : _c.find((arg) => arg.name.value === "queryName")) == null ? void 0 : _d.value;
154
+ if (refetchableQueryNameNode) {
155
+ return refetchableQueryNameNode.value;
156
+ } else {
157
+ const fragmentName = definitionNode.name.value;
158
+ const fragmentBaseName = fragmentName.replace(/Fragment$/, "");
159
+ return `${fragmentBaseName}WatchNodeQuery`;
160
+ }
161
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/typescriptTransforms/createImportDocumentsTransform.ts"],
4
+ "sourcesContent": ["/**\n * TODO:\n * - Don't hardcode identifiers but check if they're aliased from their imports.\n * - Support mutations and subscriptions\n * - Properly emit errors from transformer, is invariant ok?\n */\n\nimport invariant from \"invariant\";\nimport * as ts from \"typescript\";\nimport {\n FragmentDefinitionNode,\n parse as parseGraphQL,\n StringValueNode,\n} from \"graphql\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\n\nconst PREFIX = \"__graphitation_\";\nconst QUERIES_NAMESPACE = \"generatedQueries\";\n\nexport function createImportDocumentsTransform(): ts.TransformerFactory<ts.SourceFile> {\n return (context: ts.TransformationContext): ts.Transformer<ts.SourceFile> => {\n const imports: ts.Statement[] = [];\n\n const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult<ts.Node> => {\n if (\n ts.isTaggedTemplateExpression(node) &&\n ts.isIdentifier(node.tag) &&\n node.tag.escapedText === \"graphql\"\n ) {\n const documentNodes = createGraphQLDocumentNodes(\n node,\n context.getCompilerOptions().module,\n );\n if (documentNodes) {\n const [modulePath, importStatement, replacementNode] = documentNodes;\n // Because we currently only emit new watch queries for fragments\n // on Node types, we cannot just assume the artefact exists for\n // every fragment definition. So check if it exists before emitting\n // the import.\n //\n // TODO: This file checking should not exist and is probably not\n // performant.\n const artefactFile =\n path.join(\n path.dirname(node.getSourceFile().fileName),\n modulePath.text,\n ) + \".ts\";\n const emitImport = fs.existsSync(artefactFile);\n if (emitImport) {\n imports.push(importStatement);\n return replacementNode;\n }\n }\n }\n return ts.visitEachChild(node, visitor, context);\n };\n\n return (sourceFile: ts.SourceFile) => {\n const outputSourceFile = ts.visitNode(sourceFile, visitor);\n return ts.factory.updateSourceFile(outputSourceFile, [\n ...imports,\n ...outputSourceFile.statements,\n ]);\n };\n };\n}\n\n// This is for ts-jest\nexport { createImportDocumentsTransform as factory };\n\nfunction createGraphQLDocumentNodes(\n graphqlTagTemplateNode: ts.TaggedTemplateExpression,\n moduleKind: ts.ModuleKind = ts.ModuleKind.ES2015,\n):\n | [\n modulePath: ts.StringLiteral,\n importStatement: ts.Statement,\n importReference: ts.Identifier,\n ]\n | undefined {\n const graphqlDoc = ts.isNoSubstitutionTemplateLiteral(\n graphqlTagTemplateNode.template,\n )\n ? graphqlTagTemplateNode.template.rawText\n : graphqlTagTemplateNode.template.head.rawText;\n invariant(graphqlDoc, \"Expected a GraphQL document\");\n const graphqlAST = parseGraphQL(graphqlDoc);\n const definitionNode = graphqlAST.definitions[0];\n if (definitionNode.kind === \"OperationDefinition\") {\n if (definitionNode.operation !== \"query\") {\n return undefined;\n }\n const operationName = definitionNode.name?.value;\n invariant(operationName, \"Operations are required to have a name\");\n const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${operationName}`;\n const modulePath = createModulePathNode(operationName);\n return [\n modulePath,\n createImportStatement(moduleKind, namespaceName, modulePath),\n ts.factory.createIdentifier(namespaceName),\n ];\n } else if (definitionNode.kind === \"FragmentDefinition\") {\n const queryName = getQueryName(definitionNode);\n const fragmentName = definitionNode.name.value;\n const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${fragmentName}`;\n const modulePath = createModulePathNode(queryName);\n return [\n modulePath,\n createImportStatement(moduleKind, namespaceName, modulePath),\n ts.factory.createIdentifier(namespaceName),\n ];\n }\n invariant(false, `Unhandled GraphQL definition type: ${definitionNode.kind}`);\n}\n\nfunction createModulePathNode(baseName: string) {\n return ts.factory.createStringLiteral(`./__generated__/${baseName}.graphql`);\n}\n\nfunction createImportStatement(\n moduleKind: ts.ModuleKind,\n namespaceName: string,\n modulePath: ts.StringLiteral,\n): ts.Statement {\n if (moduleKind === ts.ModuleKind.CommonJS) {\n return ts.factory.createVariableStatement(\n undefined,\n ts.factory.createVariableDeclarationList([\n ts.factory.createVariableDeclaration(\n namespaceName,\n undefined,\n undefined,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\"require\"),\n [],\n [modulePath],\n ),\n ts.factory.createIdentifier(\"documents\"),\n ),\n ),\n ]),\n );\n } else {\n return ts.factory.createImportDeclaration(\n undefined,\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n false,\n ts.factory.createIdentifier(\"documents\"),\n ts.factory.createIdentifier(namespaceName),\n ),\n ]),\n ),\n modulePath,\n );\n }\n}\n\nfunction getQueryName(definitionNode: FragmentDefinitionNode) {\n const refetchableQueryNameNode = definitionNode.directives\n ?.find((directive) => directive.name.value === \"refetchable\")\n ?.arguments?.find((arg) => arg.name.value === \"queryName\")?.value as\n | StringValueNode\n | undefined;\n if (refetchableQueryNameNode) {\n return refetchableQueryNameNode.value;\n } else {\n const fragmentName = definitionNode.name.value;\n const fragmentBaseName = fragmentName.replace(/Fragment$/, \"\");\n return `${fragmentBaseName}WatchNodeQuery`;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["invariant", "parseGraphQL"]
7
+ }
@@ -0,0 +1,134 @@
1
+ // src/typescriptTransforms/createImportDocumentsTransform.ts
2
+ import invariant from "invariant";
3
+ import * as ts from "typescript";
4
+ import {
5
+ parse as parseGraphQL
6
+ } from "graphql";
7
+ import * as path from "path";
8
+ import * as fs from "fs";
9
+ var PREFIX = "__graphitation_";
10
+ var QUERIES_NAMESPACE = "generatedQueries";
11
+ function createImportDocumentsTransform() {
12
+ return (context) => {
13
+ const imports = [];
14
+ const visitor = (node) => {
15
+ if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && node.tag.escapedText === "graphql") {
16
+ const documentNodes = createGraphQLDocumentNodes(
17
+ node,
18
+ context.getCompilerOptions().module
19
+ );
20
+ if (documentNodes) {
21
+ const [modulePath, importStatement, replacementNode] = documentNodes;
22
+ const artefactFile = path.join(
23
+ path.dirname(node.getSourceFile().fileName),
24
+ modulePath.text
25
+ ) + ".ts";
26
+ const emitImport = fs.existsSync(artefactFile);
27
+ if (emitImport) {
28
+ imports.push(importStatement);
29
+ return replacementNode;
30
+ }
31
+ }
32
+ }
33
+ return ts.visitEachChild(node, visitor, context);
34
+ };
35
+ return (sourceFile) => {
36
+ const outputSourceFile = ts.visitNode(sourceFile, visitor);
37
+ return ts.factory.updateSourceFile(outputSourceFile, [
38
+ ...imports,
39
+ ...outputSourceFile.statements
40
+ ]);
41
+ };
42
+ };
43
+ }
44
+ function createGraphQLDocumentNodes(graphqlTagTemplateNode, moduleKind = ts.ModuleKind.ES2015) {
45
+ var _a;
46
+ const graphqlDoc = ts.isNoSubstitutionTemplateLiteral(
47
+ graphqlTagTemplateNode.template
48
+ ) ? graphqlTagTemplateNode.template.rawText : graphqlTagTemplateNode.template.head.rawText;
49
+ invariant(graphqlDoc, "Expected a GraphQL document");
50
+ const graphqlAST = parseGraphQL(graphqlDoc);
51
+ const definitionNode = graphqlAST.definitions[0];
52
+ if (definitionNode.kind === "OperationDefinition") {
53
+ if (definitionNode.operation !== "query") {
54
+ return void 0;
55
+ }
56
+ const operationName = (_a = definitionNode.name) == null ? void 0 : _a.value;
57
+ invariant(operationName, "Operations are required to have a name");
58
+ const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${operationName}`;
59
+ const modulePath = createModulePathNode(operationName);
60
+ return [
61
+ modulePath,
62
+ createImportStatement(moduleKind, namespaceName, modulePath),
63
+ ts.factory.createIdentifier(namespaceName)
64
+ ];
65
+ } else if (definitionNode.kind === "FragmentDefinition") {
66
+ const queryName = getQueryName(definitionNode);
67
+ const fragmentName = definitionNode.name.value;
68
+ const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${fragmentName}`;
69
+ const modulePath = createModulePathNode(queryName);
70
+ return [
71
+ modulePath,
72
+ createImportStatement(moduleKind, namespaceName, modulePath),
73
+ ts.factory.createIdentifier(namespaceName)
74
+ ];
75
+ }
76
+ invariant(false, `Unhandled GraphQL definition type: ${definitionNode.kind}`);
77
+ }
78
+ function createModulePathNode(baseName) {
79
+ return ts.factory.createStringLiteral(`./__generated__/${baseName}.graphql`);
80
+ }
81
+ function createImportStatement(moduleKind, namespaceName, modulePath) {
82
+ if (moduleKind === ts.ModuleKind.CommonJS) {
83
+ return ts.factory.createVariableStatement(
84
+ void 0,
85
+ ts.factory.createVariableDeclarationList([
86
+ ts.factory.createVariableDeclaration(
87
+ namespaceName,
88
+ void 0,
89
+ void 0,
90
+ ts.factory.createPropertyAccessExpression(
91
+ ts.factory.createCallExpression(
92
+ ts.factory.createIdentifier("require"),
93
+ [],
94
+ [modulePath]
95
+ ),
96
+ ts.factory.createIdentifier("documents")
97
+ )
98
+ )
99
+ ])
100
+ );
101
+ } else {
102
+ return ts.factory.createImportDeclaration(
103
+ void 0,
104
+ void 0,
105
+ ts.factory.createImportClause(
106
+ false,
107
+ void 0,
108
+ ts.factory.createNamedImports([
109
+ ts.factory.createImportSpecifier(
110
+ false,
111
+ ts.factory.createIdentifier("documents"),
112
+ ts.factory.createIdentifier(namespaceName)
113
+ )
114
+ ])
115
+ ),
116
+ modulePath
117
+ );
118
+ }
119
+ }
120
+ function getQueryName(definitionNode) {
121
+ var _a, _b, _c, _d;
122
+ const refetchableQueryNameNode = (_d = (_c = (_b = (_a = definitionNode.directives) == null ? void 0 : _a.find((directive) => directive.name.value === "refetchable")) == null ? void 0 : _b.arguments) == null ? void 0 : _c.find((arg) => arg.name.value === "queryName")) == null ? void 0 : _d.value;
123
+ if (refetchableQueryNameNode) {
124
+ return refetchableQueryNameNode.value;
125
+ } else {
126
+ const fragmentName = definitionNode.name.value;
127
+ const fragmentBaseName = fragmentName.replace(/Fragment$/, "");
128
+ return `${fragmentBaseName}WatchNodeQuery`;
129
+ }
130
+ }
131
+ export {
132
+ createImportDocumentsTransform,
133
+ createImportDocumentsTransform as factory
134
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/typescriptTransforms/createImportDocumentsTransform.ts"],
4
+ "sourcesContent": ["/**\n * TODO:\n * - Don't hardcode identifiers but check if they're aliased from their imports.\n * - Support mutations and subscriptions\n * - Properly emit errors from transformer, is invariant ok?\n */\n\nimport invariant from \"invariant\";\nimport * as ts from \"typescript\";\nimport {\n FragmentDefinitionNode,\n parse as parseGraphQL,\n StringValueNode,\n} from \"graphql\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\n\nconst PREFIX = \"__graphitation_\";\nconst QUERIES_NAMESPACE = \"generatedQueries\";\n\nexport function createImportDocumentsTransform(): ts.TransformerFactory<ts.SourceFile> {\n return (context: ts.TransformationContext): ts.Transformer<ts.SourceFile> => {\n const imports: ts.Statement[] = [];\n\n const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult<ts.Node> => {\n if (\n ts.isTaggedTemplateExpression(node) &&\n ts.isIdentifier(node.tag) &&\n node.tag.escapedText === \"graphql\"\n ) {\n const documentNodes = createGraphQLDocumentNodes(\n node,\n context.getCompilerOptions().module,\n );\n if (documentNodes) {\n const [modulePath, importStatement, replacementNode] = documentNodes;\n // Because we currently only emit new watch queries for fragments\n // on Node types, we cannot just assume the artefact exists for\n // every fragment definition. So check if it exists before emitting\n // the import.\n //\n // TODO: This file checking should not exist and is probably not\n // performant.\n const artefactFile =\n path.join(\n path.dirname(node.getSourceFile().fileName),\n modulePath.text,\n ) + \".ts\";\n const emitImport = fs.existsSync(artefactFile);\n if (emitImport) {\n imports.push(importStatement);\n return replacementNode;\n }\n }\n }\n return ts.visitEachChild(node, visitor, context);\n };\n\n return (sourceFile: ts.SourceFile) => {\n const outputSourceFile = ts.visitNode(sourceFile, visitor);\n return ts.factory.updateSourceFile(outputSourceFile, [\n ...imports,\n ...outputSourceFile.statements,\n ]);\n };\n };\n}\n\n// This is for ts-jest\nexport { createImportDocumentsTransform as factory };\n\nfunction createGraphQLDocumentNodes(\n graphqlTagTemplateNode: ts.TaggedTemplateExpression,\n moduleKind: ts.ModuleKind = ts.ModuleKind.ES2015,\n):\n | [\n modulePath: ts.StringLiteral,\n importStatement: ts.Statement,\n importReference: ts.Identifier,\n ]\n | undefined {\n const graphqlDoc = ts.isNoSubstitutionTemplateLiteral(\n graphqlTagTemplateNode.template,\n )\n ? graphqlTagTemplateNode.template.rawText\n : graphqlTagTemplateNode.template.head.rawText;\n invariant(graphqlDoc, \"Expected a GraphQL document\");\n const graphqlAST = parseGraphQL(graphqlDoc);\n const definitionNode = graphqlAST.definitions[0];\n if (definitionNode.kind === \"OperationDefinition\") {\n if (definitionNode.operation !== \"query\") {\n return undefined;\n }\n const operationName = definitionNode.name?.value;\n invariant(operationName, \"Operations are required to have a name\");\n const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${operationName}`;\n const modulePath = createModulePathNode(operationName);\n return [\n modulePath,\n createImportStatement(moduleKind, namespaceName, modulePath),\n ts.factory.createIdentifier(namespaceName),\n ];\n } else if (definitionNode.kind === \"FragmentDefinition\") {\n const queryName = getQueryName(definitionNode);\n const fragmentName = definitionNode.name.value;\n const namespaceName = `${PREFIX}${QUERIES_NAMESPACE}_${fragmentName}`;\n const modulePath = createModulePathNode(queryName);\n return [\n modulePath,\n createImportStatement(moduleKind, namespaceName, modulePath),\n ts.factory.createIdentifier(namespaceName),\n ];\n }\n invariant(false, `Unhandled GraphQL definition type: ${definitionNode.kind}`);\n}\n\nfunction createModulePathNode(baseName: string) {\n return ts.factory.createStringLiteral(`./__generated__/${baseName}.graphql`);\n}\n\nfunction createImportStatement(\n moduleKind: ts.ModuleKind,\n namespaceName: string,\n modulePath: ts.StringLiteral,\n): ts.Statement {\n if (moduleKind === ts.ModuleKind.CommonJS) {\n return ts.factory.createVariableStatement(\n undefined,\n ts.factory.createVariableDeclarationList([\n ts.factory.createVariableDeclaration(\n namespaceName,\n undefined,\n undefined,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\"require\"),\n [],\n [modulePath],\n ),\n ts.factory.createIdentifier(\"documents\"),\n ),\n ),\n ]),\n );\n } else {\n return ts.factory.createImportDeclaration(\n undefined,\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n false,\n ts.factory.createIdentifier(\"documents\"),\n ts.factory.createIdentifier(namespaceName),\n ),\n ]),\n ),\n modulePath,\n );\n }\n}\n\nfunction getQueryName(definitionNode: FragmentDefinitionNode) {\n const refetchableQueryNameNode = definitionNode.directives\n ?.find((directive) => directive.name.value === \"refetchable\")\n ?.arguments?.find((arg) => arg.name.value === \"queryName\")?.value as\n | StringValueNode\n | undefined;\n if (refetchableQueryNameNode) {\n return refetchableQueryNameNode.value;\n } else {\n const fragmentName = definitionNode.name.value;\n const fragmentBaseName = fragmentName.replace(/Fragment$/, \"\");\n return `${fragmentBaseName}WatchNodeQuery`;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
File without changes
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }