@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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/formatModule.ts"],
4
+ "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 } from \"graphql\";\nimport type { FormatModule } from \"relay-compiler/lib/language/RelayLanguagePluginInterface\";\nimport type { CompiledArtefactModule } from \"./types\";\n\nexport interface FormatModuleOptions {\n emitDocuments: boolean;\n emitNarrowObservables: boolean;\n emitQueryDebugComments: boolean;\n emitSupermassiveDocuments: boolean;\n schema: string;\n}\n\nfunction printDocumentComment(document: DocumentNode) {\n return `/*\\n${print(document).trim()}\\n*/`;\n}\n\nexport async function formatModuleFactory(\n options: FormatModuleOptions,\n): Promise<FormatModule> {\n const schema = options.emitNarrowObservables\n ? buildSchema(\n new Source(readFileSync(options.schema, \"utf-8\"), options.schema),\n )\n : null;\n\n let addTypesToRequestDocument:\n | undefined\n | typeof import(\"@graphitation/supermassive\").addTypesToRequestDocument;\n if (options.emitSupermassiveDocuments) {\n ({ addTypesToRequestDocument } = await import(\n \"@graphitation/supermassive\"\n ));\n }\n\n function generateExports(moduleName: string, docText: string) {\n const exports: CompiledArtefactModule = {};\n const originalDocument = parse(docText, { noLocation: true });\n const optimizedDocument = optimizeDocumentNode(originalDocument);\n\n if (!options.emitNarrowObservables) {\n exports.executionQueryDocument = optimizedDocument;\n } else {\n if (!moduleName.endsWith(\"WatchNodeQuery.graphql\")) {\n exports.executionQueryDocument =\n stripFragmentReferenceFieldSelectionTransform(optimizedDocument);\n }\n\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 (addTypesToRequestDocument && exports.executionQueryDocument) {\n invariant(schema, \"Expected a schema instance\");\n exports.executionQueryDocument = addTypesToRequestDocument(\n schema,\n exports.executionQueryDocument,\n ) as DocumentNode;\n }\n\n return exports;\n }\n\n return ({ docText, hash, moduleName, typeText }) => {\n const exports = options.emitDocuments\n ? docText && generateExports(moduleName, docText)\n : null;\n const components = [\n typeText,\n exports &&\n options.emitQueryDebugComments &&\n exports.executionQueryDocument &&\n printDocumentComment(exports.executionQueryDocument),\n exports &&\n options.emitQueryDebugComments &&\n exports.watchQueryDocument &&\n printDocumentComment(exports.watchQueryDocument),\n exports &&\n `export const documents: import(\"@graphitation/apollo-react-relay-duct-tape-compiler\").CompiledArtefactModule = ${dedupeJSONStringify(\n exports,\n )};`,\n ].filter(Boolean) as string[];\n\n return `/* tslint:disable */\n/* eslint-disable */\n// @ts-nocheck\n${hash ? `/* ${hash} */\\n` : \"\"}\n${components.join(\"\\n\\n\")}`;\n };\n}\n"],
5
+ "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;AAchC,SAAS,qBAAqB,UAAwB;AACpD,SAAO;AAAA,EAAO,MAAM,QAAQ,EAAE,KAAK;AAAA;AACrC;AAEA,SAAsB,oBACpB,SACuB;AAAA;AACvB,UAAM,SAAS,QAAQ,wBACnB;AAAA,MACE,IAAI,OAAO,aAAa,QAAQ,QAAQ,OAAO,GAAG,QAAQ,MAAM;AAAA,IAClE,IACA;AAEJ,QAAI;AAGJ,QAAI,QAAQ,2BAA2B;AACrC,OAAC,EAAE,0BAA0B,IAAI,MAAM,OACrC,4BACF;AAAA,IACF;AAEA,aAAS,gBAAgB,YAAoB,SAAiB;AAC5D,YAAM,UAAkC,CAAC;AACzC,YAAM,mBAAmB,MAAM,SAAS,EAAE,YAAY,KAAK,CAAC;AAC5D,YAAM,oBAAoB,qBAAqB,gBAAgB;AAE/D,UAAI,CAAC,QAAQ,uBAAuB;AAClC,gBAAQ,yBAAyB;AAAA,MACnC,OAAO;AACL,YAAI,CAAC,WAAW,SAAS,wBAAwB,GAAG;AAClD,kBAAQ,yBACN,8CAA8C,iBAAiB;AAAA,QACnE;AAEA,kBAAU,QAAQ,4BAA4B;AAC9C,gBAAQ,qBAAqB;AAAA,UAC3B;AAAA,UACA;AAAA,QACF;AAEA,gBAAQ,WAAW,yBAAyB,QAAQ,kBAAkB;AAAA,MACxE;AAEA,UAAI,6BAA6B,QAAQ,wBAAwB;AAC/D,kBAAU,QAAQ,4BAA4B;AAC9C,gBAAQ,yBAAyB;AAAA,UAC/B;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,CAAC,EAAE,SAAS,MAAM,YAAY,SAAS,MAAM;AAClD,YAAM,UAAU,QAAQ,gBACpB,WAAW,gBAAgB,YAAY,OAAO,IAC9C;AACJ,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,WACE,QAAQ,0BACR,QAAQ,0BACR,qBAAqB,QAAQ,sBAAsB;AAAA,QACrD,WACE,QAAQ,0BACR,QAAQ,sBACR,qBAAqB,QAAQ,kBAAkB;AAAA,QACjD,WACE,kHAAkH;AAAA,UAChH;AAAA,QACF;AAAA,MACJ,EAAE,OAAO,OAAO;AAEhB,aAAO;AAAA;AAAA;AAAA,EAGT,OAAO,MAAM;AAAA,IAAc;AAAA,EAC3B,WAAW,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,33 @@
1
+ import { DocumentNode } from "graphql";
2
+ interface ConnectionMetadata {
3
+ forwardCountVariable?: string;
4
+ forwardCursorVariable?: string;
5
+ backwardCountVariable?: string;
6
+ backwardCursorVariable?: string;
7
+ filterVariableDefaults?: Record<string, any>;
8
+ selectionPath: string[];
9
+ }
10
+ export interface Metadata {
11
+ rootSelection?: string;
12
+ mainFragment?: {
13
+ name: string;
14
+ typeCondition: string;
15
+ };
16
+ connection?: ConnectionMetadata;
17
+ }
18
+ /**
19
+ * This transform extracts metadata needed at runtime for the `use*Fragment`
20
+ * hooks to do their work efficiently. This includes:
21
+ *
22
+ * - Whether or not the observed data starts at the root of the operation or at
23
+ * the `node` root-field.
24
+ * - The name and type-condition of the fragment.
25
+ * - Connection metadata such as location of the connection inside the fragment
26
+ * and the names of the various connection variables.
27
+ *
28
+ * @param document The watch query document
29
+ * @returns The metadata needed at runtime
30
+ */
31
+ export declare function extractMetadataTransform(document: DocumentNode): Metadata | undefined;
32
+ export {};
33
+ //# sourceMappingURL=extractMetadataTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractMetadataTransform.d.ts","sourceRoot":"","sources":["../../src/formatModuleTransforms/extractMetadataTransform.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAWb,MAAM,SAAS,CAAC;AAGjB,UAAU,kBAAkB;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AACD,MAAM,WAAW,QAAQ;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,YAAY,GACrB,QAAQ,GAAG,SAAS,CAkBtB"}
@@ -0,0 +1,208 @@
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 extractMetadataTransform_exports = {};
30
+ __export(extractMetadataTransform_exports, {
31
+ extractMetadataTransform: () => extractMetadataTransform
32
+ });
33
+ module.exports = __toCommonJS(extractMetadataTransform_exports);
34
+ var import_graphql = require("graphql");
35
+ var import_invariant = __toESM(require("invariant"));
36
+ function extractMetadataTransform(document) {
37
+ const metadata = {};
38
+ const nodeFieldSelection = extractNodeFieldSelection(document);
39
+ if (nodeFieldSelection) {
40
+ metadata.rootSelection = "node";
41
+ }
42
+ const mainFragment = getMainFragmentMetadata(
43
+ document,
44
+ nodeFieldSelection == null ? void 0 : nodeFieldSelection.name.value
45
+ );
46
+ if (mainFragment) {
47
+ metadata.mainFragment = mainFragment;
48
+ }
49
+ const connectionMetadata = extractConnectionMetadataTransform(document);
50
+ if (connectionMetadata) {
51
+ metadata.connection = connectionMetadata;
52
+ }
53
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
54
+ }
55
+ function getMainFragmentMetadata(document, rootSelection) {
56
+ const [operationDefinition, ...fragmentDefinitions] = document.definitions;
57
+ (0, import_invariant.default)(
58
+ operationDefinition.kind === "OperationDefinition" && fragmentDefinitions.every((node) => node.kind === "FragmentDefinition"),
59
+ "Expected definition nodes in specific order"
60
+ );
61
+ if (fragmentDefinitions.length === 0) {
62
+ return void 0;
63
+ }
64
+ let selectionSet = operationDefinition.selectionSet;
65
+ if (rootSelection) {
66
+ const field = selectionSet.selections.find(
67
+ (selection) => selection.kind === "Field" && selection.name.value === rootSelection
68
+ );
69
+ (0, import_invariant.default)(
70
+ field == null ? void 0 : field.selectionSet,
71
+ "Expected root selection to exist in document"
72
+ );
73
+ selectionSet = field.selectionSet;
74
+ }
75
+ const mainFragmentSpread = selectionSet.selections.find(
76
+ (selection) => selection.kind === "FragmentSpread"
77
+ );
78
+ if (!mainFragmentSpread) {
79
+ return void 0;
80
+ }
81
+ const mainFragment = fragmentDefinitions.find(
82
+ (fragment) => fragment.name.value === mainFragmentSpread.name.value
83
+ );
84
+ (0, import_invariant.default)(mainFragment, "Expected a main fragment");
85
+ return {
86
+ name: mainFragment.name.value,
87
+ typeCondition: mainFragment.typeCondition.name.value
88
+ };
89
+ }
90
+ function extractNodeFieldSelection(document) {
91
+ const operationDefinition = document.definitions.find(
92
+ (def) => def.kind === "OperationDefinition"
93
+ );
94
+ (0, import_invariant.default)(operationDefinition, "Expected an operation");
95
+ const nodeFieldSelection = operationDefinition.selectionSet.selections.find(
96
+ (selection) => selection.kind === "Field" && selection.name.value === "node"
97
+ );
98
+ return nodeFieldSelection;
99
+ }
100
+ function extractConnectionMetadataTransform(document) {
101
+ let foundConnection = false;
102
+ const metadata = { selectionPath: [] };
103
+ const variableDefaults = /* @__PURE__ */ new Map();
104
+ (0, import_graphql.visit)(document, {
105
+ VariableDefinition: {
106
+ enter(variableNode) {
107
+ variableDefaults.set(
108
+ variableNode.variable.name.value,
109
+ variableNode.defaultValue
110
+ );
111
+ }
112
+ },
113
+ Field: {
114
+ enter(fieldNode) {
115
+ var _a, _b;
116
+ if (!foundConnection) {
117
+ metadata.selectionPath.push(fieldNode.name.value);
118
+ }
119
+ const connectionDirective = (_a = fieldNode.directives) == null ? void 0 : _a.find(
120
+ (directive) => directive.name.value === "connection"
121
+ );
122
+ if (connectionDirective) {
123
+ (0, import_invariant.default)(
124
+ !foundConnection,
125
+ "Expected to find a single connection in one document"
126
+ );
127
+ foundConnection = true;
128
+ const fieldArguments = new Map(
129
+ (_b = fieldNode.arguments) == null ? void 0 : _b.map((arg) => [arg.name.value, arg])
130
+ );
131
+ metadata.forwardCountVariable = getVariableValue(
132
+ fieldArguments.get("first")
133
+ );
134
+ metadata.forwardCursorVariable = getVariableValue(
135
+ fieldArguments.get("after")
136
+ );
137
+ metadata.backwardCountVariable = getVariableValue(
138
+ fieldArguments.get("last")
139
+ );
140
+ metadata.backwardCursorVariable = getVariableValue(
141
+ fieldArguments.get("before")
142
+ );
143
+ metadata.filterVariableDefaults = extractFilterVariableDefaults(
144
+ connectionDirective,
145
+ fieldArguments,
146
+ variableDefaults
147
+ );
148
+ }
149
+ },
150
+ leave() {
151
+ if (!foundConnection) {
152
+ metadata.selectionPath.pop();
153
+ }
154
+ }
155
+ }
156
+ });
157
+ if (foundConnection) {
158
+ (0, import_invariant.default)(
159
+ metadata.forwardCountVariable && metadata.forwardCursorVariable || metadata.backwardCountVariable && metadata.backwardCursorVariable,
160
+ "Expected correct count and cursor variables combinations"
161
+ );
162
+ return metadata;
163
+ } else {
164
+ return void 0;
165
+ }
166
+ }
167
+ function getVariableValue(arg) {
168
+ return arg && arg.value.kind === "Variable" ? arg.value.name.value : void 0;
169
+ }
170
+ function extractFilterVariableDefaults(connectionDirective, fieldArguments, variableDefaults) {
171
+ (0, import_invariant.default)(
172
+ connectionDirective.arguments !== void 0,
173
+ "Expected connection directive to have arguments"
174
+ );
175
+ const filterVariableDefaults = /* @__PURE__ */ new Map();
176
+ const [, filters] = connectionDirective.arguments;
177
+ if (filters) {
178
+ (0, import_invariant.default)(
179
+ filters.name.value === "filter" && filters.value.kind === "ListValue",
180
+ "Expected filters argument to be a list of field arguments"
181
+ );
182
+ const fieldArgumentNames = filters.value.values.map((value) => {
183
+ (0, import_invariant.default)(
184
+ value.kind === "StringValue",
185
+ "Expected field argument to be a string"
186
+ );
187
+ return value.value;
188
+ });
189
+ fieldArgumentNames.forEach((name) => {
190
+ const arg = fieldArguments.get(name);
191
+ (0, import_invariant.default)(
192
+ arg !== void 0,
193
+ "Expected filter name to refer to a field argument"
194
+ );
195
+ const variable = getVariableValue(arg);
196
+ if (variable) {
197
+ const defaultValue = variableDefaults.get(variable);
198
+ if (defaultValue) {
199
+ filterVariableDefaults.set(
200
+ variable,
201
+ (0, import_graphql.valueFromASTUntyped)(defaultValue)
202
+ );
203
+ }
204
+ }
205
+ });
206
+ }
207
+ return filterVariableDefaults.size > 0 ? Object.fromEntries(filterVariableDefaults) : void 0;
208
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/formatModuleTransforms/extractMetadataTransform.ts"],
4
+ "sourcesContent": ["import {\n ArgumentNode,\n DocumentNode,\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n OperationDefinitionNode,\n ValueNode,\n parseValue,\n visit,\n valueFromAST,\n valueFromASTUntyped,\n DirectiveNode,\n} from \"graphql\";\nimport invariant from \"invariant\";\n\ninterface ConnectionMetadata {\n forwardCountVariable?: string;\n forwardCursorVariable?: string;\n backwardCountVariable?: string;\n backwardCursorVariable?: string;\n filterVariableDefaults?: Record<string, any>;\n selectionPath: string[];\n}\nexport interface Metadata {\n rootSelection?: string;\n mainFragment?: {\n name: string;\n typeCondition: string;\n };\n connection?: ConnectionMetadata;\n}\n\n/**\n * This transform extracts metadata needed at runtime for the `use*Fragment`\n * hooks to do their work efficiently. This includes:\n *\n * - Whether or not the observed data starts at the root of the operation or at\n * the `node` root-field.\n * - The name and type-condition of the fragment.\n * - Connection metadata such as location of the connection inside the fragment\n * and the names of the various connection variables.\n *\n * @param document The watch query document\n * @returns The metadata needed at runtime\n */\nexport function extractMetadataTransform(\n document: DocumentNode,\n): Metadata | undefined {\n const metadata: Metadata = {};\n const nodeFieldSelection = extractNodeFieldSelection(document);\n if (nodeFieldSelection) {\n metadata.rootSelection = \"node\";\n }\n const mainFragment = getMainFragmentMetadata(\n document,\n nodeFieldSelection?.name.value,\n );\n if (mainFragment) {\n metadata.mainFragment = mainFragment;\n }\n const connectionMetadata = extractConnectionMetadataTransform(document);\n if (connectionMetadata) {\n metadata.connection = connectionMetadata;\n }\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction getMainFragmentMetadata(\n document: DocumentNode,\n rootSelection: string | undefined,\n):\n | {\n name: string;\n typeCondition: string;\n }\n | undefined {\n const [operationDefinition, ...fragmentDefinitions] =\n document.definitions as [\n OperationDefinitionNode,\n ...FragmentDefinitionNode[],\n ];\n invariant(\n operationDefinition.kind === \"OperationDefinition\" &&\n fragmentDefinitions.every((node) => node.kind === \"FragmentDefinition\"),\n \"Expected definition nodes in specific order\",\n );\n if (fragmentDefinitions.length === 0) {\n return undefined;\n }\n let selectionSet = operationDefinition.selectionSet;\n if (rootSelection) {\n const field = selectionSet.selections.find(\n (selection) =>\n selection.kind === \"Field\" && selection.name.value === rootSelection,\n ) as FieldNode | undefined;\n invariant(\n field?.selectionSet,\n \"Expected root selection to exist in document\",\n );\n selectionSet = field.selectionSet;\n }\n const mainFragmentSpread = selectionSet.selections.find(\n (selection) => selection.kind === \"FragmentSpread\",\n ) as FragmentSpreadNode | undefined;\n if (!mainFragmentSpread) {\n return undefined;\n }\n const mainFragment = fragmentDefinitions.find(\n (fragment) => fragment.name.value === mainFragmentSpread.name.value,\n );\n invariant(mainFragment, \"Expected a main fragment\");\n return {\n name: mainFragment.name.value,\n typeCondition: mainFragment.typeCondition.name.value,\n };\n}\n\nfunction extractNodeFieldSelection(document: DocumentNode) {\n const operationDefinition = document.definitions.find(\n (def) => def.kind === \"OperationDefinition\",\n ) as OperationDefinitionNode | undefined;\n invariant(operationDefinition, \"Expected an operation\");\n const nodeFieldSelection = operationDefinition.selectionSet.selections.find(\n (selection) =>\n selection.kind === \"Field\" && selection.name.value === \"node\",\n ) as FieldNode | undefined;\n return nodeFieldSelection;\n}\n\nfunction extractConnectionMetadataTransform(\n document: DocumentNode,\n): ConnectionMetadata | undefined {\n let foundConnection = false;\n const metadata: ConnectionMetadata = { selectionPath: [] };\n const variableDefaults = new Map<string, ValueNode | undefined>();\n visit(document, {\n VariableDefinition: {\n enter(variableNode) {\n variableDefaults.set(\n variableNode.variable.name.value,\n variableNode.defaultValue,\n );\n },\n },\n Field: {\n enter(fieldNode) {\n if (!foundConnection) {\n metadata.selectionPath.push(fieldNode.name.value);\n }\n const connectionDirective = fieldNode.directives?.find(\n (directive) => directive.name.value === \"connection\",\n );\n if (connectionDirective) {\n invariant(\n !foundConnection,\n \"Expected to find a single connection in one document\",\n );\n foundConnection = true;\n\n const fieldArguments = new Map(\n fieldNode.arguments?.map((arg) => [arg.name.value, arg]),\n );\n\n metadata.forwardCountVariable = getVariableValue(\n fieldArguments.get(\"first\"),\n );\n metadata.forwardCursorVariable = getVariableValue(\n fieldArguments.get(\"after\"),\n );\n metadata.backwardCountVariable = getVariableValue(\n fieldArguments.get(\"last\"),\n );\n metadata.backwardCursorVariable = getVariableValue(\n fieldArguments.get(\"before\"),\n );\n\n metadata.filterVariableDefaults = extractFilterVariableDefaults(\n connectionDirective,\n fieldArguments,\n variableDefaults,\n );\n }\n },\n leave() {\n if (!foundConnection) {\n metadata.selectionPath.pop();\n }\n },\n },\n });\n if (foundConnection) {\n invariant(\n (metadata.forwardCountVariable && metadata.forwardCursorVariable) ||\n (metadata.backwardCountVariable && metadata.backwardCursorVariable),\n \"Expected correct count and cursor variables combinations\",\n );\n return metadata;\n } else {\n return undefined;\n }\n}\n\nfunction getVariableValue(arg: ArgumentNode | undefined) {\n return arg && arg.value.kind === \"Variable\"\n ? arg.value.name.value\n : undefined;\n}\n\nfunction extractFilterVariableDefaults(\n connectionDirective: DirectiveNode,\n fieldArguments: Map<string, ArgumentNode>,\n variableDefaults: Map<string, ValueNode | undefined>,\n) {\n invariant(\n connectionDirective.arguments !== undefined,\n \"Expected connection directive to have arguments\",\n );\n const filterVariableDefaults = new Map<string, any>();\n const [, filters] = connectionDirective.arguments;\n if (filters) {\n invariant(\n filters.name.value === \"filter\" && filters.value.kind === \"ListValue\",\n \"Expected filters argument to be a list of field arguments\",\n );\n const fieldArgumentNames = filters.value.values.map((value) => {\n invariant(\n value.kind === \"StringValue\",\n \"Expected field argument to be a string\",\n );\n return value.value;\n });\n fieldArgumentNames.forEach((name) => {\n const arg = fieldArguments.get(name);\n invariant(\n arg !== undefined,\n \"Expected filter name to refer to a field argument\",\n );\n const variable = getVariableValue(arg);\n if (variable) {\n const defaultValue = variableDefaults.get(variable);\n if (defaultValue) {\n filterVariableDefaults.set(\n variable,\n valueFromASTUntyped(defaultValue),\n );\n }\n }\n });\n }\n return filterVariableDefaults.size > 0\n ? Object.fromEntries(filterVariableDefaults)\n : undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["invariant"]
7
+ }
@@ -0,0 +1,182 @@
1
+ // src/formatModuleTransforms/extractMetadataTransform.ts
2
+ import {
3
+ visit,
4
+ valueFromASTUntyped
5
+ } from "graphql";
6
+ import invariant from "invariant";
7
+ function extractMetadataTransform(document) {
8
+ const metadata = {};
9
+ const nodeFieldSelection = extractNodeFieldSelection(document);
10
+ if (nodeFieldSelection) {
11
+ metadata.rootSelection = "node";
12
+ }
13
+ const mainFragment = getMainFragmentMetadata(
14
+ document,
15
+ nodeFieldSelection == null ? void 0 : nodeFieldSelection.name.value
16
+ );
17
+ if (mainFragment) {
18
+ metadata.mainFragment = mainFragment;
19
+ }
20
+ const connectionMetadata = extractConnectionMetadataTransform(document);
21
+ if (connectionMetadata) {
22
+ metadata.connection = connectionMetadata;
23
+ }
24
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
25
+ }
26
+ function getMainFragmentMetadata(document, rootSelection) {
27
+ const [operationDefinition, ...fragmentDefinitions] = document.definitions;
28
+ invariant(
29
+ operationDefinition.kind === "OperationDefinition" && fragmentDefinitions.every((node) => node.kind === "FragmentDefinition"),
30
+ "Expected definition nodes in specific order"
31
+ );
32
+ if (fragmentDefinitions.length === 0) {
33
+ return void 0;
34
+ }
35
+ let selectionSet = operationDefinition.selectionSet;
36
+ if (rootSelection) {
37
+ const field = selectionSet.selections.find(
38
+ (selection) => selection.kind === "Field" && selection.name.value === rootSelection
39
+ );
40
+ invariant(
41
+ field == null ? void 0 : field.selectionSet,
42
+ "Expected root selection to exist in document"
43
+ );
44
+ selectionSet = field.selectionSet;
45
+ }
46
+ const mainFragmentSpread = selectionSet.selections.find(
47
+ (selection) => selection.kind === "FragmentSpread"
48
+ );
49
+ if (!mainFragmentSpread) {
50
+ return void 0;
51
+ }
52
+ const mainFragment = fragmentDefinitions.find(
53
+ (fragment) => fragment.name.value === mainFragmentSpread.name.value
54
+ );
55
+ invariant(mainFragment, "Expected a main fragment");
56
+ return {
57
+ name: mainFragment.name.value,
58
+ typeCondition: mainFragment.typeCondition.name.value
59
+ };
60
+ }
61
+ function extractNodeFieldSelection(document) {
62
+ const operationDefinition = document.definitions.find(
63
+ (def) => def.kind === "OperationDefinition"
64
+ );
65
+ invariant(operationDefinition, "Expected an operation");
66
+ const nodeFieldSelection = operationDefinition.selectionSet.selections.find(
67
+ (selection) => selection.kind === "Field" && selection.name.value === "node"
68
+ );
69
+ return nodeFieldSelection;
70
+ }
71
+ function extractConnectionMetadataTransform(document) {
72
+ let foundConnection = false;
73
+ const metadata = { selectionPath: [] };
74
+ const variableDefaults = /* @__PURE__ */ new Map();
75
+ visit(document, {
76
+ VariableDefinition: {
77
+ enter(variableNode) {
78
+ variableDefaults.set(
79
+ variableNode.variable.name.value,
80
+ variableNode.defaultValue
81
+ );
82
+ }
83
+ },
84
+ Field: {
85
+ enter(fieldNode) {
86
+ var _a, _b;
87
+ if (!foundConnection) {
88
+ metadata.selectionPath.push(fieldNode.name.value);
89
+ }
90
+ const connectionDirective = (_a = fieldNode.directives) == null ? void 0 : _a.find(
91
+ (directive) => directive.name.value === "connection"
92
+ );
93
+ if (connectionDirective) {
94
+ invariant(
95
+ !foundConnection,
96
+ "Expected to find a single connection in one document"
97
+ );
98
+ foundConnection = true;
99
+ const fieldArguments = new Map(
100
+ (_b = fieldNode.arguments) == null ? void 0 : _b.map((arg) => [arg.name.value, arg])
101
+ );
102
+ metadata.forwardCountVariable = getVariableValue(
103
+ fieldArguments.get("first")
104
+ );
105
+ metadata.forwardCursorVariable = getVariableValue(
106
+ fieldArguments.get("after")
107
+ );
108
+ metadata.backwardCountVariable = getVariableValue(
109
+ fieldArguments.get("last")
110
+ );
111
+ metadata.backwardCursorVariable = getVariableValue(
112
+ fieldArguments.get("before")
113
+ );
114
+ metadata.filterVariableDefaults = extractFilterVariableDefaults(
115
+ connectionDirective,
116
+ fieldArguments,
117
+ variableDefaults
118
+ );
119
+ }
120
+ },
121
+ leave() {
122
+ if (!foundConnection) {
123
+ metadata.selectionPath.pop();
124
+ }
125
+ }
126
+ }
127
+ });
128
+ if (foundConnection) {
129
+ invariant(
130
+ metadata.forwardCountVariable && metadata.forwardCursorVariable || metadata.backwardCountVariable && metadata.backwardCursorVariable,
131
+ "Expected correct count and cursor variables combinations"
132
+ );
133
+ return metadata;
134
+ } else {
135
+ return void 0;
136
+ }
137
+ }
138
+ function getVariableValue(arg) {
139
+ return arg && arg.value.kind === "Variable" ? arg.value.name.value : void 0;
140
+ }
141
+ function extractFilterVariableDefaults(connectionDirective, fieldArguments, variableDefaults) {
142
+ invariant(
143
+ connectionDirective.arguments !== void 0,
144
+ "Expected connection directive to have arguments"
145
+ );
146
+ const filterVariableDefaults = /* @__PURE__ */ new Map();
147
+ const [, filters] = connectionDirective.arguments;
148
+ if (filters) {
149
+ invariant(
150
+ filters.name.value === "filter" && filters.value.kind === "ListValue",
151
+ "Expected filters argument to be a list of field arguments"
152
+ );
153
+ const fieldArgumentNames = filters.value.values.map((value) => {
154
+ invariant(
155
+ value.kind === "StringValue",
156
+ "Expected field argument to be a string"
157
+ );
158
+ return value.value;
159
+ });
160
+ fieldArgumentNames.forEach((name) => {
161
+ const arg = fieldArguments.get(name);
162
+ invariant(
163
+ arg !== void 0,
164
+ "Expected filter name to refer to a field argument"
165
+ );
166
+ const variable = getVariableValue(arg);
167
+ if (variable) {
168
+ const defaultValue = variableDefaults.get(variable);
169
+ if (defaultValue) {
170
+ filterVariableDefaults.set(
171
+ variable,
172
+ valueFromASTUntyped(defaultValue)
173
+ );
174
+ }
175
+ }
176
+ });
177
+ }
178
+ return filterVariableDefaults.size > 0 ? Object.fromEntries(filterVariableDefaults) : void 0;
179
+ }
180
+ export {
181
+ extractMetadataTransform
182
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/formatModuleTransforms/extractMetadataTransform.ts"],
4
+ "sourcesContent": ["import {\n ArgumentNode,\n DocumentNode,\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n OperationDefinitionNode,\n ValueNode,\n parseValue,\n visit,\n valueFromAST,\n valueFromASTUntyped,\n DirectiveNode,\n} from \"graphql\";\nimport invariant from \"invariant\";\n\ninterface ConnectionMetadata {\n forwardCountVariable?: string;\n forwardCursorVariable?: string;\n backwardCountVariable?: string;\n backwardCursorVariable?: string;\n filterVariableDefaults?: Record<string, any>;\n selectionPath: string[];\n}\nexport interface Metadata {\n rootSelection?: string;\n mainFragment?: {\n name: string;\n typeCondition: string;\n };\n connection?: ConnectionMetadata;\n}\n\n/**\n * This transform extracts metadata needed at runtime for the `use*Fragment`\n * hooks to do their work efficiently. This includes:\n *\n * - Whether or not the observed data starts at the root of the operation or at\n * the `node` root-field.\n * - The name and type-condition of the fragment.\n * - Connection metadata such as location of the connection inside the fragment\n * and the names of the various connection variables.\n *\n * @param document The watch query document\n * @returns The metadata needed at runtime\n */\nexport function extractMetadataTransform(\n document: DocumentNode,\n): Metadata | undefined {\n const metadata: Metadata = {};\n const nodeFieldSelection = extractNodeFieldSelection(document);\n if (nodeFieldSelection) {\n metadata.rootSelection = \"node\";\n }\n const mainFragment = getMainFragmentMetadata(\n document,\n nodeFieldSelection?.name.value,\n );\n if (mainFragment) {\n metadata.mainFragment = mainFragment;\n }\n const connectionMetadata = extractConnectionMetadataTransform(document);\n if (connectionMetadata) {\n metadata.connection = connectionMetadata;\n }\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction getMainFragmentMetadata(\n document: DocumentNode,\n rootSelection: string | undefined,\n):\n | {\n name: string;\n typeCondition: string;\n }\n | undefined {\n const [operationDefinition, ...fragmentDefinitions] =\n document.definitions as [\n OperationDefinitionNode,\n ...FragmentDefinitionNode[],\n ];\n invariant(\n operationDefinition.kind === \"OperationDefinition\" &&\n fragmentDefinitions.every((node) => node.kind === \"FragmentDefinition\"),\n \"Expected definition nodes in specific order\",\n );\n if (fragmentDefinitions.length === 0) {\n return undefined;\n }\n let selectionSet = operationDefinition.selectionSet;\n if (rootSelection) {\n const field = selectionSet.selections.find(\n (selection) =>\n selection.kind === \"Field\" && selection.name.value === rootSelection,\n ) as FieldNode | undefined;\n invariant(\n field?.selectionSet,\n \"Expected root selection to exist in document\",\n );\n selectionSet = field.selectionSet;\n }\n const mainFragmentSpread = selectionSet.selections.find(\n (selection) => selection.kind === \"FragmentSpread\",\n ) as FragmentSpreadNode | undefined;\n if (!mainFragmentSpread) {\n return undefined;\n }\n const mainFragment = fragmentDefinitions.find(\n (fragment) => fragment.name.value === mainFragmentSpread.name.value,\n );\n invariant(mainFragment, \"Expected a main fragment\");\n return {\n name: mainFragment.name.value,\n typeCondition: mainFragment.typeCondition.name.value,\n };\n}\n\nfunction extractNodeFieldSelection(document: DocumentNode) {\n const operationDefinition = document.definitions.find(\n (def) => def.kind === \"OperationDefinition\",\n ) as OperationDefinitionNode | undefined;\n invariant(operationDefinition, \"Expected an operation\");\n const nodeFieldSelection = operationDefinition.selectionSet.selections.find(\n (selection) =>\n selection.kind === \"Field\" && selection.name.value === \"node\",\n ) as FieldNode | undefined;\n return nodeFieldSelection;\n}\n\nfunction extractConnectionMetadataTransform(\n document: DocumentNode,\n): ConnectionMetadata | undefined {\n let foundConnection = false;\n const metadata: ConnectionMetadata = { selectionPath: [] };\n const variableDefaults = new Map<string, ValueNode | undefined>();\n visit(document, {\n VariableDefinition: {\n enter(variableNode) {\n variableDefaults.set(\n variableNode.variable.name.value,\n variableNode.defaultValue,\n );\n },\n },\n Field: {\n enter(fieldNode) {\n if (!foundConnection) {\n metadata.selectionPath.push(fieldNode.name.value);\n }\n const connectionDirective = fieldNode.directives?.find(\n (directive) => directive.name.value === \"connection\",\n );\n if (connectionDirective) {\n invariant(\n !foundConnection,\n \"Expected to find a single connection in one document\",\n );\n foundConnection = true;\n\n const fieldArguments = new Map(\n fieldNode.arguments?.map((arg) => [arg.name.value, arg]),\n );\n\n metadata.forwardCountVariable = getVariableValue(\n fieldArguments.get(\"first\"),\n );\n metadata.forwardCursorVariable = getVariableValue(\n fieldArguments.get(\"after\"),\n );\n metadata.backwardCountVariable = getVariableValue(\n fieldArguments.get(\"last\"),\n );\n metadata.backwardCursorVariable = getVariableValue(\n fieldArguments.get(\"before\"),\n );\n\n metadata.filterVariableDefaults = extractFilterVariableDefaults(\n connectionDirective,\n fieldArguments,\n variableDefaults,\n );\n }\n },\n leave() {\n if (!foundConnection) {\n metadata.selectionPath.pop();\n }\n },\n },\n });\n if (foundConnection) {\n invariant(\n (metadata.forwardCountVariable && metadata.forwardCursorVariable) ||\n (metadata.backwardCountVariable && metadata.backwardCursorVariable),\n \"Expected correct count and cursor variables combinations\",\n );\n return metadata;\n } else {\n return undefined;\n }\n}\n\nfunction getVariableValue(arg: ArgumentNode | undefined) {\n return arg && arg.value.kind === \"Variable\"\n ? arg.value.name.value\n : undefined;\n}\n\nfunction extractFilterVariableDefaults(\n connectionDirective: DirectiveNode,\n fieldArguments: Map<string, ArgumentNode>,\n variableDefaults: Map<string, ValueNode | undefined>,\n) {\n invariant(\n connectionDirective.arguments !== undefined,\n \"Expected connection directive to have arguments\",\n );\n const filterVariableDefaults = new Map<string, any>();\n const [, filters] = connectionDirective.arguments;\n if (filters) {\n invariant(\n filters.name.value === \"filter\" && filters.value.kind === \"ListValue\",\n \"Expected filters argument to be a list of field arguments\",\n );\n const fieldArgumentNames = filters.value.values.map((value) => {\n invariant(\n value.kind === \"StringValue\",\n \"Expected field argument to be a string\",\n );\n return value.value;\n });\n fieldArgumentNames.forEach((name) => {\n const arg = fieldArguments.get(name);\n invariant(\n arg !== undefined,\n \"Expected filter name to refer to a field argument\",\n );\n const variable = getVariableValue(arg);\n if (variable) {\n const defaultValue = variableDefaults.get(variable);\n if (defaultValue) {\n filterVariableDefaults.set(\n variable,\n valueFromASTUntyped(defaultValue),\n );\n }\n }\n });\n }\n return filterVariableDefaults.size > 0\n ? Object.fromEntries(filterVariableDefaults)\n : undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import { DocumentNode, GraphQLSchema } from "graphql";
2
+ /**
3
+ * Given the execution query document, that is the fat query that is used to
4
+ * actually fetch the data, this transform will reduce the operation to limit
5
+ * it to just the first fragment (on either a `Node` type of the `Query` type).
6
+ * This is the operation that the `use*Fragment` hooks will use to observe the
7
+ * Apollo Client store for data changes.
8
+ *
9
+ * @param schema The schema that the operation executes on
10
+ * @param document The execution query document
11
+ * @returns The watch query document
12
+ */
13
+ export declare function reduceNodeWatchQueryTransform(schema: GraphQLSchema, document: DocumentNode): DocumentNode;
14
+ //# sourceMappingURL=reduceNodeWatchQueryTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reduceNodeWatchQueryTransform.d.ts","sourceRoot":"","sources":["../../src/formatModuleTransforms/reduceNodeWatchQueryTransform.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EASd,MAAM,SAAS,CAAC;AASjB;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,YAAY,GACrB,YAAY,CAqFd"}
@@ -0,0 +1,101 @@
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 reduceNodeWatchQueryTransform_exports = {};
30
+ __export(reduceNodeWatchQueryTransform_exports, {
31
+ reduceNodeWatchQueryTransform: () => reduceNodeWatchQueryTransform
32
+ });
33
+ module.exports = __toCommonJS(reduceNodeWatchQueryTransform_exports);
34
+ var import_graphql = require("graphql");
35
+ var import_invariant = __toESM(require("invariant"));
36
+ const ALLOWED_REFETCH_QUERY_FIELD_SELECTIONS = [
37
+ "__fragments",
38
+ "__typename",
39
+ "id"
40
+ ];
41
+ function reduceNodeWatchQueryTransform(schema, document) {
42
+ const nodeType = schema.getType("Node");
43
+ (0, import_invariant.default)(
44
+ nodeType && (0, import_graphql.isInterfaceType)(nodeType),
45
+ "Expected schema to define a Node interface in order to support narrow observables."
46
+ );
47
+ const typeInfo = new import_graphql.TypeInfo(schema);
48
+ let retainFragment;
49
+ const removeNonWatchQueryFragmentNodes = (node) => {
50
+ if (retainFragment && node.name.value === retainFragment) {
51
+ return void 0;
52
+ }
53
+ const unnamedTypeConstraint = typeInfo.getType();
54
+ (0, import_invariant.default)(unnamedTypeConstraint, "Expected a type constraint");
55
+ const typeConstraint = (0, import_graphql.getNamedType)(unnamedTypeConstraint);
56
+ if (typeConstraint === schema.getQueryType() || ((0, import_graphql.isObjectType)(typeConstraint) || (0, import_graphql.isInterfaceType)(typeConstraint)) && typeConstraint.getInterfaces().includes(nodeType)) {
57
+ return null;
58
+ }
59
+ return void 0;
60
+ };
61
+ return (0, import_graphql.visit)(
62
+ document,
63
+ (0, import_graphql.visitWithTypeInfo)(typeInfo, {
64
+ OperationDefinition(operationDefinitionNode) {
65
+ const selections = operationDefinitionNode.selectionSet.selections;
66
+ const fragmentSpreadNode = selections.find(
67
+ (sel) => sel.kind === "FragmentSpread"
68
+ );
69
+ if (selections.length === 2 && fragmentSpreadNode && selections.find(
70
+ (sel) => sel.kind === "Field" && sel.name.value === "__fragments"
71
+ )) {
72
+ retainFragment = fragmentSpreadNode.name.value;
73
+ }
74
+ },
75
+ Field(fieldNode) {
76
+ const parentType = typeInfo.getParentType();
77
+ if (fieldNode.name.value === "node" && parentType && parentType.name === "Query") {
78
+ const selections = fieldNode.selectionSet.selections;
79
+ const fragmentSpreadSelections = selections.filter(
80
+ (sel) => sel.kind === "FragmentSpread"
81
+ );
82
+ if (
83
+ // ...there's one fragment spread...
84
+ fragmentSpreadSelections.length === 1 || // ...and no fields but id and __typename...
85
+ selections.filter(
86
+ (sel) => sel.kind === "Field" && !ALLOWED_REFETCH_QUERY_FIELD_SELECTIONS.includes(
87
+ sel.name.value
88
+ )
89
+ ).length === 0 || // ...and no inline fragment.
90
+ selections.filter((sel) => sel.kind === "InlineFragment").length === 0
91
+ ) {
92
+ const fragmentSpreadNode = fragmentSpreadSelections[0];
93
+ retainFragment = fragmentSpreadNode.name.value;
94
+ }
95
+ }
96
+ },
97
+ FragmentSpread: removeNonWatchQueryFragmentNodes,
98
+ FragmentDefinition: removeNonWatchQueryFragmentNodes
99
+ })
100
+ );
101
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/formatModuleTransforms/reduceNodeWatchQueryTransform.ts"],
4
+ "sourcesContent": ["import {\n DocumentNode,\n GraphQLSchema,\n visit,\n visitWithTypeInfo,\n TypeInfo,\n isObjectType,\n isInterfaceType,\n getNamedType,\n FragmentSpreadNode,\n FragmentDefinitionNode,\n} from \"graphql\";\nimport invariant from \"invariant\";\n\nconst ALLOWED_REFETCH_QUERY_FIELD_SELECTIONS = [\n \"__fragments\",\n \"__typename\",\n \"id\",\n];\n\n/**\n * Given the execution query document, that is the fat query that is used to\n * actually fetch the data, this transform will reduce the operation to limit\n * it to just the first fragment (on either a `Node` type of the `Query` type).\n * This is the operation that the `use*Fragment` hooks will use to observe the\n * Apollo Client store for data changes.\n *\n * @param schema The schema that the operation executes on\n * @param document The execution query document\n * @returns The watch query document\n */\nexport function reduceNodeWatchQueryTransform(\n schema: GraphQLSchema,\n document: DocumentNode,\n): DocumentNode {\n const nodeType = schema.getType(\"Node\");\n invariant(\n nodeType && isInterfaceType(nodeType),\n \"Expected schema to define a Node interface in order to support narrow observables.\",\n );\n\n const typeInfo = new TypeInfo(schema);\n let retainFragment: string;\n\n const removeNonWatchQueryFragmentNodes = (\n node: FragmentSpreadNode | FragmentDefinitionNode,\n ) => {\n if (retainFragment && node.name.value === retainFragment) {\n return undefined;\n }\n const unnamedTypeConstraint = typeInfo.getType();\n invariant(unnamedTypeConstraint, \"Expected a type constraint\");\n const typeConstraint = getNamedType(unnamedTypeConstraint);\n if (\n typeConstraint === schema.getQueryType() ||\n ((isObjectType(typeConstraint) || isInterfaceType(typeConstraint)) &&\n typeConstraint.getInterfaces().includes(nodeType))\n ) {\n return null;\n // TODO: Handle fragment on Node ?\n // } else if (isInterfaceType(typeConstraint)) {\n }\n return undefined;\n };\n\n return visit(\n document,\n visitWithTypeInfo(typeInfo, {\n OperationDefinition(operationDefinitionNode) {\n const selections = operationDefinitionNode.selectionSet!.selections;\n const fragmentSpreadNode = selections.find(\n (sel) => sel.kind === \"FragmentSpread\",\n ) as FragmentSpreadNode;\n if (\n selections.length === 2 &&\n fragmentSpreadNode &&\n selections.find(\n (sel) => sel.kind === \"Field\" && sel.name.value === \"__fragments\",\n )\n ) {\n retainFragment = fragmentSpreadNode.name.value;\n }\n },\n Field(fieldNode) {\n const parentType = typeInfo.getParentType();\n if (\n fieldNode.name.value === \"node\" &&\n parentType &&\n parentType.name === \"Query\"\n ) {\n const selections = fieldNode.selectionSet!.selections;\n const fragmentSpreadSelections = selections.filter(\n (sel) => sel.kind === \"FragmentSpread\",\n ) as FragmentSpreadNode[];\n // This is a refetch query only if...\n if (\n // ...there's one fragment spread...\n fragmentSpreadSelections.length === 1 ||\n // ...and no fields but id and __typename...\n selections.filter(\n (sel) =>\n sel.kind === \"Field\" &&\n !ALLOWED_REFETCH_QUERY_FIELD_SELECTIONS.includes(\n sel.name.value,\n ),\n ).length === 0 ||\n // ...and no inline fragment.\n selections.filter((sel) => sel.kind === \"InlineFragment\").length ===\n 0\n ) {\n const fragmentSpreadNode = fragmentSpreadSelections[0];\n retainFragment = fragmentSpreadNode.name.value;\n }\n }\n },\n FragmentSpread: removeNonWatchQueryFragmentNodes,\n FragmentDefinition: removeNonWatchQueryFragmentNodes,\n }),\n );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAWO;AACP,uBAAsB;AAEtB,MAAM,yCAAyC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF;AAaO,SAAS,8BACd,QACA,UACc;AACd,QAAM,WAAW,OAAO,QAAQ,MAAM;AACtC,uBAAAA;AAAA,IACE,gBAAY,gCAAgB,QAAQ;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,wBAAS,MAAM;AACpC,MAAI;AAEJ,QAAM,mCAAmC,CACvC,SACG;AACH,QAAI,kBAAkB,KAAK,KAAK,UAAU,gBAAgB;AACxD,aAAO;AAAA,IACT;AACA,UAAM,wBAAwB,SAAS,QAAQ;AAC/C,yBAAAA,SAAU,uBAAuB,4BAA4B;AAC7D,UAAM,qBAAiB,6BAAa,qBAAqB;AACzD,QACE,mBAAmB,OAAO,aAAa,UACrC,6BAAa,cAAc,SAAK,gCAAgB,cAAc,MAC9D,eAAe,cAAc,EAAE,SAAS,QAAQ,GAClD;AACA,aAAO;AAAA,IAGT;AACA,WAAO;AAAA,EACT;AAEA,aAAO;AAAA,IACL;AAAA,QACA,kCAAkB,UAAU;AAAA,MAC1B,oBAAoB,yBAAyB;AAC3C,cAAM,aAAa,wBAAwB,aAAc;AACzD,cAAM,qBAAqB,WAAW;AAAA,UACpC,CAAC,QAAQ,IAAI,SAAS;AAAA,QACxB;AACA,YACE,WAAW,WAAW,KACtB,sBACA,WAAW;AAAA,UACT,CAAC,QAAQ,IAAI,SAAS,WAAW,IAAI,KAAK,UAAU;AAAA,QACtD,GACA;AACA,2BAAiB,mBAAmB,KAAK;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,MAAM,WAAW;AACf,cAAM,aAAa,SAAS,cAAc;AAC1C,YACE,UAAU,KAAK,UAAU,UACzB,cACA,WAAW,SAAS,SACpB;AACA,gBAAM,aAAa,UAAU,aAAc;AAC3C,gBAAM,2BAA2B,WAAW;AAAA,YAC1C,CAAC,QAAQ,IAAI,SAAS;AAAA,UACxB;AAEA;AAAA;AAAA,YAEE,yBAAyB,WAAW;AAAA,YAEpC,WAAW;AAAA,cACT,CAAC,QACC,IAAI,SAAS,WACb,CAAC,uCAAuC;AAAA,gBACtC,IAAI,KAAK;AAAA,cACX;AAAA,YACJ,EAAE,WAAW;AAAA,YAEb,WAAW,OAAO,CAAC,QAAQ,IAAI,SAAS,gBAAgB,EAAE,WACxD;AAAA,YACF;AACA,kBAAM,qBAAqB,yBAAyB,CAAC;AACrD,6BAAiB,mBAAmB,KAAK;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,IACtB,CAAC;AAAA,EACH;AACF;",
6
+ "names": ["invariant"]
7
+ }