@trackunit/react-graphql-tools 0.0.59 → 0.0.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [0.0.62](https://github.com/Trackunit/manager/compare/react-graphql-tools/0.0.61...react-graphql-tools/0.0.62) (2024-01-08)
6
+
7
+ ## [0.0.61](https://github.com/Trackunit/manager/compare/react-graphql-tools/0.0.60...react-graphql-tools/0.0.61) (2024-01-08)
8
+
9
+ ## [0.0.60](https://github.com/Trackunit/manager/compare/react-graphql-tools/0.0.59...react-graphql-tools/0.0.60) (2024-01-04)
10
+
11
+ ### Dependency Updates
12
+
13
+ * `test-setup` updated to version `0.0.59`
5
14
  ## [0.0.59](https://github.com/Trackunit/manager/compare/react-graphql-tools/0.0.58...react-graphql-tools/0.0.59) (2023-12-14)
6
15
 
7
16
  ### Dependency Updates
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/react-graphql-tools",
3
- "version": "0.0.59",
3
+ "version": "0.0.62",
4
4
  "main": "./src/index.js",
5
5
  "executors": "./executors.json",
6
6
  "repository": "https://github.com/Trackunit/manager",
@@ -14,7 +14,8 @@
14
14
  "prettier": "3.1.0",
15
15
  "ts-morph": "^20.0.0",
16
16
  "@faker-js/faker": "^8.2.0",
17
- "tslib": "^2.6.2"
17
+ "tslib": "^2.6.2",
18
+ "@graphql-codegen/cli": "^5.0.0"
18
19
  },
19
20
  "type": "commonjs"
20
21
  }
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateHooks = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const child_process_1 = require("child_process");
5
+ const cli_1 = require("@graphql-codegen/cli");
6
6
  /**
7
7
  * Generates React hooks from your graphql files.
8
8
  *
@@ -12,15 +12,24 @@ const child_process_1 = require("child_process");
12
12
  * @param options.isVerbose if true, will log more information.
13
13
  */
14
14
  const generateHooks = (options) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
15
- const cmd = `./node_modules/.bin/graphql-codegen --config "${options.codeGenFilePath}" --require tsconfig-paths/register --debug --verbose --project "${options.tsConfigPath}"`;
15
+ const contextConfig = {
16
+ watch: false,
17
+ overwrite: true,
18
+ silent: !options.isVerbose,
19
+ errorsOnly: false,
20
+ profile: false,
21
+ project: options.tsConfigPath,
22
+ config: options.codeGenFilePath,
23
+ require: [],
24
+ verbose: options.isVerbose,
25
+ debug: options.isVerbose,
26
+ };
16
27
  if (options.isVerbose) {
17
28
  // eslint-disable-next-line no-console
18
- console.log(cmd);
29
+ console.log(contextConfig);
19
30
  }
20
- (0, child_process_1.execSync)(cmd, {
21
- stdio: options.isVerbose ? "inherit" : "ignore",
22
- cwd: options.nxRoot,
23
- });
31
+ const context = yield (0, cli_1.createContext)(contextConfig);
32
+ return yield (0, cli_1.generate)(context);
24
33
  });
25
34
  exports.generateHooks = generateHooks;
26
35
  //# sourceMappingURL=generateHooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateHooks.js","sourceRoot":"","sources":["../../../../../../../libs/react/graphql-tools/src/executors/createHooks/generateHooks.ts"],"names":[],"mappings":";;;;AAAA,iDAAyC;AACzC;;;;;;;GAOG;AACI,MAAM,aAAa,GAAG,CAAO,OAKnC,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,iDAAiD,OAAO,CAAC,eAAe,oEAAoE,OAAO,CAAC,YAAY,GAAG,CAAC;IAChL,IAAI,OAAO,CAAC,SAAS,EAAE;QACrB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAClB;IACD,IAAA,wBAAQ,EAAC,GAAG,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;QAC/C,GAAG,EAAE,OAAO,CAAC,MAAM;KACpB,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AAfW,QAAA,aAAa,iBAexB","sourcesContent":["import { execSync } from \"child_process\";\n/**\n * Generates React hooks from your graphql files.\n *\n * @param options.codeGenFilePath the path to the codegen file.\n * @param options.nxRoot the nx root.\n * @param options.tsConfigPath the path to the tsconfig file.\n * @param options.isVerbose if true, will log more information.\n */\nexport const generateHooks = async (options: {\n codeGenFilePath: string;\n nxRoot: string;\n isVerbose?: boolean;\n tsConfigPath: string;\n}) => {\n const cmd = `./node_modules/.bin/graphql-codegen --config \"${options.codeGenFilePath}\" --require tsconfig-paths/register --debug --verbose --project \"${options.tsConfigPath}\"`;\n if (options.isVerbose) {\n // eslint-disable-next-line no-console\n console.log(cmd);\n }\n execSync(cmd, {\n stdio: options.isVerbose ? \"inherit\" : \"ignore\",\n cwd: options.nxRoot,\n });\n};\n"]}
1
+ {"version":3,"file":"generateHooks.js","sourceRoot":"","sources":["../../../../../../../libs/react/graphql-tools/src/executors/createHooks/generateHooks.ts"],"names":[],"mappings":";;;;AAAA,8CAA+D;AAC/D;;;;;;;GAOG;AACI,MAAM,aAAa,GAAG,CAAO,OAKnC,EAAE,EAAE;IACH,MAAM,aAAa,GAAG;QACpB,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,OAAO,CAAC,YAAY;QAC7B,MAAM,EAAE,OAAO,CAAC,eAAe;QAC/B,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,OAAO,CAAC,SAAS;QAC1B,KAAK,EAAE,OAAO,CAAC,SAAS;KACzB,CAAC;IACF,IAAI,OAAO,CAAC,SAAS,EAAE;QACrB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;KAC5B;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAa,EAAC,aAAa,CAAC,CAAC;IAEnD,OAAO,MAAM,IAAA,cAAQ,EAAC,OAAO,CAAC,CAAC;AACjC,CAAC,CAAA,CAAC;AA1BW,QAAA,aAAa,iBA0BxB","sourcesContent":["import { createContext, generate } from \"@graphql-codegen/cli\";\n/**\n * Generates React hooks from your graphql files.\n *\n * @param options.codeGenFilePath the path to the codegen file.\n * @param options.nxRoot the nx root.\n * @param options.tsConfigPath the path to the tsconfig file.\n * @param options.isVerbose if true, will log more information.\n */\nexport const generateHooks = async (options: {\n codeGenFilePath: string;\n nxRoot: string;\n isVerbose?: boolean;\n tsConfigPath: string;\n}) => {\n const contextConfig = {\n watch: false,\n overwrite: true,\n silent: !options.isVerbose,\n errorsOnly: false,\n profile: false,\n project: options.tsConfigPath,\n config: options.codeGenFilePath,\n require: [],\n verbose: options.isVerbose,\n debug: options.isVerbose,\n };\n if (options.isVerbose) {\n // eslint-disable-next-line no-console\n console.log(contextConfig);\n }\n\n const context = await createContext(contextConfig);\n\n return await generate(context);\n};\n"]}
@@ -6,111 +6,47 @@ const tslib_1 = require("tslib");
6
6
  const fs_1 = require("fs");
7
7
  const path_1 = require("path");
8
8
  const prettier = tslib_1.__importStar(require("prettier"));
9
- const ts_morph_1 = require("ts-morph");
10
9
  const scrubMockFile_1 = require("./scrubMockFile");
11
- /**
12
- * Removes unused identifiers from the source file.
13
- *
14
- * This does more then sourceFile.fixUnusedIdentifiers(diagnostic) as it also removes unused enums and interfaces.
15
- *
16
- * @param sourceFile The source file to remove unused identifiers from.
17
- */
18
- const removeUnusedIdentifiers = (sourceFile) => {
19
- const diagnostics = sourceFile.getPreEmitDiagnostics();
20
- diagnostics.forEach(diagnostic => {
21
- var _a;
22
- const messageText = diagnostic.getMessageText();
23
- if (typeof messageText === "string" && messageText.startsWith("'")) {
24
- const identifierName = (_a = messageText.match(/'([^']+)'/)) === null || _a === void 0 ? void 0 : _a[1];
25
- if (identifierName) {
26
- if (messageText.includes("is declared but never used")) {
27
- const identifier = sourceFile.getVariableDeclaration(identifierName) ||
28
- sourceFile.getInterface(identifierName) ||
29
- sourceFile.getEnum(identifierName) ||
30
- sourceFile.getClass(identifierName) ||
31
- sourceFile.getTypeAlias(identifierName);
32
- if (!identifier) {
33
- // eslint-disable-next-line no-console
34
- console.log("Could not find: ", messageText);
35
- }
36
- else {
37
- identifier.remove();
38
- }
39
- }
40
- }
41
- }
42
- });
43
- };
44
- const convertEnumToConstObject = (enumDeclaration) => {
45
- const enumName = enumDeclaration.getName();
46
- const members = enumDeclaration.getMembers();
47
- const properties = members.map(member => {
48
- const name = member.getName();
49
- const value = member.getValue();
50
- return `${name}: '${value}'`;
51
- });
52
- const lowerCaseFirstLetter = enumName[0].toLowerCase() + enumName.slice(1);
53
- const constObjectText = `export const ${lowerCaseFirstLetter} = {\n ${properties.join(",\n ")},\n} as const;\nexport type ${enumName} = typeof ${lowerCaseFirstLetter}[keyof typeof ${lowerCaseFirstLetter}];`;
54
- // Replace the EnumDeclaration with the const object text
55
- enumDeclaration.replaceWithText(constObjectText);
56
- };
10
+ const utils_1 = require("./utils");
57
11
  /**
58
12
  * Generates React hooks from your graphql files.
59
13
  */
60
14
  const scrubFileContent = (fileContent, nxRoot, isVerbose) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
61
15
  const start = new Date().getTime();
62
- const project = new ts_morph_1.Project({
63
- compilerOptions: {
64
- noUnusedLocals: true,
65
- noUnusedParameters: true,
66
- },
67
- });
68
- const generatedFile = project.createSourceFile("tmp.ts", fileContent);
69
- generatedFile.insertStatements(0, "/* eslint-disable @typescript-eslint/no-explicit-any */");
70
- generatedFile.insertStatements(1, "/* eslint-disable @typescript-eslint/array-type */");
71
- generatedFile.getTypeAliases().forEach(node => {
72
- if (!node.getName().startsWith("Incremental")) {
73
- node.setIsExported(false);
74
- }
75
- if (node.getName().startsWith("Query") ||
76
- node.getName().startsWith("Mutation") ||
77
- // Since they reference each other we remove them here.
78
- node.getName() === "Site" ||
79
- node.getName() === "Event" ||
80
- node.getName() === "Operator" ||
81
- node.getName() === "Account" ||
82
- node.getName() === "Operator" ||
83
- node.getName() === "Asset") {
84
- node.remove();
16
+ const sourceFile = (0, utils_1.createSourceFile)(fileContent);
17
+ let resultFileContent = "";
18
+ const scalarsType = sourceFile.getTypeAliasOrThrow("Scalars");
19
+ scalarsType.getEndLineNumber();
20
+ resultFileContent += fileContent.split("\n").slice(0, scalarsType.getEndLineNumber()).join("\n") + "\n";
21
+ const alreadyAdded = sourceFile
22
+ .getTypeAliases()
23
+ .filter(typeAlias => typeAlias.getStartLineNumber() < scalarsType.getEndLineNumber())
24
+ .map(typeAlias => typeAlias.getName());
25
+ resultFileContent = resultFileContent.replace("export type InputMaybe<T> = Maybe<T>;", "export type InputMaybe<T> = Maybe<T> | undefined;");
26
+ const { preservedTypes, queryAndMutations } = (0, utils_1.getPreservedTypes)(sourceFile, isVerbose);
27
+ isVerbose && console.log("PreservedTypes:", preservedTypes);
28
+ sourceFile.getEnums().forEach(enumType => {
29
+ const typeName = enumType.getName();
30
+ if (preservedTypes.includes(typeName) && !alreadyAdded.includes(typeName) && !(0, utils_1.isFragment)(typeName)) {
31
+ alreadyAdded.push(typeName);
32
+ resultFileContent += "\n" + (0, utils_1.convertEnumToConstObject)(enumType) + "\n";
85
33
  }
86
34
  });
87
- generatedFile.getEnums().forEach(node => {
88
- node.setIsExported(false);
89
- });
90
- let lastWidth = 0;
91
- do {
92
- lastWidth = generatedFile.getFullWidth();
93
- removeUnusedIdentifiers(generatedFile);
94
- if (isVerbose) {
95
- console.log("Cleanup", lastWidth, generatedFile.getFullWidth());
35
+ sourceFile.getTypeAliases().forEach(typeAlias => {
36
+ const typeName = typeAlias.getName();
37
+ if (preservedTypes.includes(typeName) && !alreadyAdded.includes(typeName) && !(0, utils_1.isFragment)(typeName)) {
38
+ alreadyAdded.push(typeName);
39
+ resultFileContent += "\n" + typeAlias.getText() + "\n";
96
40
  }
97
- } while (lastWidth !== generatedFile.getFullWidth());
98
- generatedFile.getTypeAliases().forEach(node => {
99
- node.setIsExported(true);
100
- });
101
- generatedFile.getVariableStatements().forEach(variableStatement => {
102
- variableStatement.setIsExported(true);
103
- });
104
- generatedFile.getEnums().forEach(node => {
105
- node.setIsExported(true);
106
- convertEnumToConstObject(node);
107
41
  });
42
+ const resultQueryAndMutations = queryAndMutations.map(queryOrMutation => queryOrMutation.getFullText()).join("\n");
43
+ const result = resultFileContent + "\n" + resultQueryAndMutations;
108
44
  if (isVerbose) {
109
45
  const end = new Date().getTime();
110
46
  const time = end - start;
111
47
  console.log("Execution time: " + time);
112
48
  }
113
- return generatedFile.getFullText();
49
+ return result;
114
50
  });
115
51
  exports.scrubFileContent = scrubFileContent;
116
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scrubFile.js","sourceRoot":"","sources":["../../../../../../../libs/react/graphql-tools/src/executors/createHooks/scrubFile.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport * as prettier from \"prettier\";\nimport { EnumDeclaration, Project, SourceFile } from \"ts-morph\";\nimport { scrubMockFileContent } from \"./scrubMockFile\";\n\n/**\n * Removes unused identifiers from the source file.\n *\n * This does more then sourceFile.fixUnusedIdentifiers(diagnostic) as it also removes unused enums and interfaces.\n *\n * @param sourceFile The source file to remove unused identifiers from.\n */\nconst removeUnusedIdentifiers = (sourceFile: SourceFile) => {\n const diagnostics = sourceFile.getPreEmitDiagnostics();\n diagnostics.forEach(diagnostic => {\n const messageText = diagnostic.getMessageText();\n\n if (typeof messageText === \"string\" && messageText.startsWith(\"'\")) {\n const identifierName = messageText.match(/'([^']+)'/)?.[1];\n if (identifierName) {\n if (messageText.includes(\"is declared but never used\")) {\n const identifier =\n sourceFile.getVariableDeclaration(identifierName) ||\n sourceFile.getInterface(identifierName) ||\n sourceFile.getEnum(identifierName) ||\n sourceFile.getClass(identifierName) ||\n sourceFile.getTypeAlias(identifierName);\n\n if (!identifier) {\n // eslint-disable-next-line no-console\n console.log(\"Could not find: \", messageText);\n } else {\n identifier.remove();\n }\n }\n }\n }\n });\n};\n\nconst convertEnumToConstObject = (enumDeclaration: EnumDeclaration) => {\n const enumName = enumDeclaration.getName();\n const members = enumDeclaration.getMembers();\n\n const properties = members.map(member => {\n const name = member.getName();\n const value = member.getValue();\n return `${name}: '${value}'`;\n });\n\n const lowerCaseFirstLetter = enumName[0].toLowerCase() + enumName.slice(1);\n const constObjectText = `export const ${lowerCaseFirstLetter} = {\\n ${properties.join(\n \",\\n \"\n )},\\n} as const;\\nexport type ${enumName} = typeof ${lowerCaseFirstLetter}[keyof typeof ${lowerCaseFirstLetter}];`;\n\n // Replace the EnumDeclaration with the const object text\n enumDeclaration.replaceWithText(constObjectText);\n};\n\n/**\n * Generates React hooks from your graphql files.\n */\nexport const scrubFileContent = async (fileContent: string, nxRoot: string, isVerbose?: boolean) => {\n const start = new Date().getTime();\n\n const project = new Project({\n compilerOptions: {\n noUnusedLocals: true,\n noUnusedParameters: true,\n },\n });\n const generatedFile = project.createSourceFile(\"tmp.ts\", fileContent);\n\n generatedFile.insertStatements(0, \"/* eslint-disable @typescript-eslint/no-explicit-any */\");\n generatedFile.insertStatements(1, \"/* eslint-disable @typescript-eslint/array-type */\");\n\n generatedFile.getTypeAliases().forEach(node => {\n if (!node.getName().startsWith(\"Incremental\")) {\n node.setIsExported(false);\n }\n\n if (\n node.getName().startsWith(\"Query\") ||\n node.getName().startsWith(\"Mutation\") ||\n // Since they reference each other we remove them here.\n node.getName() === \"Site\" ||\n node.getName() === \"Event\" ||\n node.getName() === \"Operator\" ||\n node.getName() === \"Account\" ||\n node.getName() === \"Operator\" ||\n node.getName() === \"Asset\"\n ) {\n node.remove();\n }\n });\n generatedFile.getEnums().forEach(node => {\n node.setIsExported(false);\n });\n let lastWidth = 0;\n do {\n lastWidth = generatedFile.getFullWidth();\n removeUnusedIdentifiers(generatedFile);\n if (isVerbose) {\n console.log(\"Cleanup\", lastWidth, generatedFile.getFullWidth());\n }\n } while (lastWidth !== generatedFile.getFullWidth());\n\n generatedFile.getTypeAliases().forEach(node => {\n node.setIsExported(true);\n });\n generatedFile.getVariableStatements().forEach(variableStatement => {\n variableStatement.setIsExported(true);\n });\n generatedFile.getEnums().forEach(node => {\n node.setIsExported(true);\n convertEnumToConstObject(node);\n });\n\n if (isVerbose) {\n const end = new Date().getTime();\n const time = end - start;\n console.log(\"Execution time: \" + time);\n }\n\n return generatedFile.getFullText();\n};\n\n/**\n * Scrubs the file content.\n *\n * @param file The file to scrub.\n */\nexport const scrubFile = async (file: string, nxRoot: string, isVerbose?: boolean) => {\n const fileContent = readFileSync(file, { encoding: \"utf-8\" });\n if (fileContent.length === 0) {\n console.warn(`File ${file} is empty`);\n }\n const scrubbedMockFileContent = await scrubMockFileContent(fileContent, nxRoot, isVerbose);\n\n const scrubbedFileContent = await scrubFileContent(fileContent, nxRoot, isVerbose);\n\n let options = null;\n try {\n options = prettier\n .resolveConfig(join(nxRoot, \".prettierrc\"), {\n useCache: false,\n editorconfig: false,\n config: join(nxRoot, \".prettierrc\"),\n })\n .catch((error: Error) => console.log(error));\n } catch (e) {\n console.log(e);\n }\n if (!options) {\n throw new Error(\"Could not find prettier config\");\n }\n const prettierOptions = await options;\n\n let prettySrc = scrubbedFileContent;\n if (prettierOptions) {\n prettierOptions.parser = \"typescript\";\n try {\n prettySrc = await prettier.format(scrubbedFileContent, prettierOptions);\n } catch (error) {\n console.error(\"Error in prettier.format:\", error);\n }\n }\n writeFileSync(file, prettySrc, { encoding: \"utf-8\" });\n\n let prettyMockSrc = scrubbedMockFileContent;\n if (prettierOptions) {\n prettierOptions.parser = \"typescript\";\n try {\n prettyMockSrc = await prettier.format(scrubbedMockFileContent, prettierOptions);\n } catch (error) {\n console.error(\"Error in prettier.format:\", error);\n }\n }\n const parentDir = file.split(\"/\").slice(0, -1).join(\"/\");\n writeFileSync(parentDir + \"/mock.ts\", prettyMockSrc, { encoding: \"utf-8\" });\n return prettySrc;\n};\n"]}
1
+ {"version":3,"file":"scrubFile.js","sourceRoot":"","sources":["../../../../../../../libs/react/graphql-tools/src/executors/createHooks/scrubFile.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport * as prettier from \"prettier\";\nimport { scrubMockFileContent } from \"./scrubMockFile\";\nimport { convertEnumToConstObject, createSourceFile, getPreservedTypes, isFragment } from \"./utils\";\n\n/**\n * Generates React hooks from your graphql files.\n */\nexport const scrubFileContent = async (fileContent: string, nxRoot: string, isVerbose?: boolean) => {\n const start = new Date().getTime();\n\n const sourceFile = createSourceFile(fileContent);\n\n let resultFileContent = \"\";\n const scalarsType = sourceFile.getTypeAliasOrThrow(\"Scalars\");\n scalarsType.getEndLineNumber();\n resultFileContent += fileContent.split(\"\\n\").slice(0, scalarsType.getEndLineNumber()).join(\"\\n\") + \"\\n\";\n const alreadyAdded = sourceFile\n .getTypeAliases()\n .filter(typeAlias => typeAlias.getStartLineNumber() < scalarsType.getEndLineNumber())\n .map(typeAlias => typeAlias.getName());\n\n resultFileContent = resultFileContent.replace(\n \"export type InputMaybe<T> = Maybe<T>;\",\n \"export type InputMaybe<T> = Maybe<T> | undefined;\"\n );\n\n const { preservedTypes, queryAndMutations } = getPreservedTypes(sourceFile, isVerbose);\n isVerbose && console.log(\"PreservedTypes:\", preservedTypes);\n\n sourceFile.getEnums().forEach(enumType => {\n const typeName = enumType.getName();\n if (preservedTypes.includes(typeName) && !alreadyAdded.includes(typeName) && !isFragment(typeName)) {\n alreadyAdded.push(typeName);\n resultFileContent += \"\\n\" + convertEnumToConstObject(enumType) + \"\\n\";\n }\n });\n sourceFile.getTypeAliases().forEach(typeAlias => {\n const typeName = typeAlias.getName();\n if (preservedTypes.includes(typeName) && !alreadyAdded.includes(typeName) && !isFragment(typeName)) {\n alreadyAdded.push(typeName);\n resultFileContent += \"\\n\" + typeAlias.getText() + \"\\n\";\n }\n });\n\n const resultQueryAndMutations = queryAndMutations.map(queryOrMutation => queryOrMutation.getFullText()).join(\"\\n\");\n\n const result = resultFileContent + \"\\n\" + resultQueryAndMutations;\n if (isVerbose) {\n const end = new Date().getTime();\n const time = end - start;\n console.log(\"Execution time: \" + time);\n }\n\n return result;\n};\n\n/**\n * Scrubs the file content.\n *\n * @param file The file to scrub.\n */\nexport const scrubFile = async (file: string, nxRoot: string, isVerbose?: boolean) => {\n const fileContent = readFileSync(file, { encoding: \"utf-8\" });\n if (fileContent.length === 0) {\n console.warn(`File ${file} is empty`);\n }\n const scrubbedMockFileContent = await scrubMockFileContent(fileContent, nxRoot, isVerbose);\n\n const scrubbedFileContent = await scrubFileContent(fileContent, nxRoot, isVerbose);\n\n let options = null;\n try {\n options = prettier\n .resolveConfig(join(nxRoot, \".prettierrc\"), {\n useCache: false,\n editorconfig: false,\n config: join(nxRoot, \".prettierrc\"),\n })\n .catch((error: Error) => console.log(error));\n } catch (e) {\n console.log(e);\n }\n if (!options) {\n throw new Error(\"Could not find prettier config\");\n }\n const prettierOptions = await options;\n\n let prettySrc = scrubbedFileContent;\n if (prettierOptions) {\n prettierOptions.parser = \"typescript\";\n try {\n prettySrc = await prettier.format(scrubbedFileContent, prettierOptions);\n } catch (error) {\n console.error(\"Error in prettier.format:\", error);\n }\n }\n writeFileSync(file, prettySrc, { encoding: \"utf-8\" });\n\n let prettyMockSrc = scrubbedMockFileContent;\n if (prettierOptions) {\n prettierOptions.parser = \"typescript\";\n try {\n prettyMockSrc = await prettier.format(scrubbedMockFileContent, prettierOptions);\n } catch (error) {\n console.error(\"Error in prettier.format:\", error);\n }\n }\n const parentDir = file.split(\"/\").slice(0, -1).join(\"/\");\n writeFileSync(parentDir + \"/mock.ts\", prettyMockSrc, { encoding: \"utf-8\" });\n return prettySrc;\n};\n"]}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSourceFile = exports.convertEnumToConstObject = exports.getPreservedTypes = exports.isFragment = exports.isMutationVariables = exports.isMutation = exports.isQueryVariables = exports.isQuery = void 0;
4
+ const ts_morph_1 = require("ts-morph");
5
+ /**
6
+ * Check if the name is a *Query
7
+ */
8
+ const isQuery = (name) => {
9
+ return name.endsWith("Query") && name.length > "Query".length;
10
+ };
11
+ exports.isQuery = isQuery;
12
+ /**
13
+ * Check if the name is a *QueryVariables
14
+ */
15
+ const isQueryVariables = (name) => {
16
+ return name.endsWith("QueryVariables");
17
+ };
18
+ exports.isQueryVariables = isQueryVariables;
19
+ /**
20
+ * Check if the name is a Mutation
21
+ */
22
+ const isMutation = (name) => {
23
+ return name.endsWith("Mutation") && name.length > "Mutation".length;
24
+ };
25
+ exports.isMutation = isMutation;
26
+ /**
27
+ * Check if the name is a *QueryVariables
28
+ */
29
+ const isMutationVariables = (name) => {
30
+ return name.endsWith("MutationVariables");
31
+ };
32
+ exports.isMutationVariables = isMutationVariables;
33
+ /**
34
+ * Check if the name is a *Fragment and not *_Fragment
35
+ */
36
+ const isFragment = (name) => {
37
+ return name.endsWith("Fragment") && !name.endsWith("_Fragment");
38
+ };
39
+ exports.isFragment = isFragment;
40
+ /**
41
+ * Debug where you are in the tree
42
+ */
43
+ const getFullPathUpOfNode = (node) => {
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
+ let currentNode = node;
46
+ const paths = [];
47
+ while (currentNode) {
48
+ // You can customize what details to include for each node (e.g., kind, text)
49
+ let name = currentNode.getName ? currentNode.getName() : currentNode.getKindName();
50
+ if (node.getKind() === ts_morph_1.SyntaxKind.TypeLiteral) {
51
+ const typeLiteral = node.asKindOrThrow(ts_morph_1.SyntaxKind.TypeLiteral);
52
+ name = typeLiteral.getText();
53
+ }
54
+ paths.unshift(`${name}`);
55
+ currentNode = currentNode.getParent();
56
+ }
57
+ return paths.join(">>");
58
+ };
59
+ /**
60
+ * Get the types that should be preserved
61
+ */
62
+ const getPreservedTypes = (sourceFile, isVerbose) => {
63
+ const typeAliases = sourceFile.getTypeAliases();
64
+ const queryAndMutations = [];
65
+ const preservedTypes = [];
66
+ const variablesListToProcess = [];
67
+ const queryMutationListToProcess = [];
68
+ typeAliases.forEach(typeAlias => {
69
+ const name = typeAlias.getName();
70
+ if ((0, exports.isQueryVariables)(name) || (0, exports.isMutationVariables)(name) || (0, exports.isFragment)(name)) {
71
+ variablesListToProcess.push(typeAlias);
72
+ queryAndMutations.push(typeAlias);
73
+ }
74
+ else if ((0, exports.isQuery)(name) || (0, exports.isMutation)(name)) {
75
+ queryMutationListToProcess.push(typeAlias);
76
+ queryAndMutations.push(typeAlias);
77
+ }
78
+ });
79
+ sourceFile.getVariableStatements().forEach(variableStatement => {
80
+ var _a;
81
+ const variable = (_a = variableStatement
82
+ .getFirstChildByKind(ts_morph_1.SyntaxKind.VariableDeclarationList)) === null || _a === void 0 ? void 0 : _a.getFirstChildByKind(ts_morph_1.SyntaxKind.VariableDeclaration);
83
+ if (variable === null || variable === void 0 ? void 0 : variable.getName().endsWith("Document")) {
84
+ queryAndMutations.push(variableStatement);
85
+ }
86
+ else if (variable === null || variable === void 0 ? void 0 : variable.getName().endsWith("FragmentDoc")) {
87
+ queryAndMutations.push(variableStatement);
88
+ }
89
+ });
90
+ // RUN VARAIABLES FIRST since it will force full props if nessasary
91
+ // VARIABLES are input so force include all props
92
+ variablesListToProcess.forEach(typeAlias => {
93
+ preserveTypes(typeAlias, preservedTypes, sourceFile, isVerbose);
94
+ });
95
+ // QUERY and MUTATION are dynamic so dont force props
96
+ queryMutationListToProcess.forEach(typeAlias => {
97
+ preserveTypes(typeAlias, preservedTypes, sourceFile, isVerbose);
98
+ });
99
+ return { preservedTypes, queryAndMutations };
100
+ };
101
+ exports.getPreservedTypes = getPreservedTypes;
102
+ const preserveTypes = (node, preservedTypes, sourceFile, isVerbose) => {
103
+ const typeReferences = [];
104
+ if (!node.getText().startsWith("export type Query") && !node.getText().startsWith("export type Mutation")) {
105
+ node.forEachDescendant(descendant => {
106
+ if (descendant.getKind() === ts_morph_1.SyntaxKind.TypeReference) {
107
+ if (!descendant.getText().startsWith("Scalars") &&
108
+ !descendant.getText().startsWith("Maybe<") &&
109
+ !descendant.getText().startsWith("InputMaybe<") &&
110
+ !descendant.getText().startsWith("Array<") &&
111
+ !descendant.getText().startsWith("Exact<") &&
112
+ !descendant.getText().includes("__typename")) {
113
+ if (isVerbose) {
114
+ // eslint-disable-next-line no-console
115
+ console.log("ADDING", getFullPathUpOfNode(descendant), ":", descendant.getText(), descendant.getKindName());
116
+ }
117
+ if (!preservedTypes.includes(descendant.getText())) {
118
+ const foundTypeAlias = sourceFile.getTypeAlias(descendant.getText());
119
+ preservedTypes.push(descendant.getText());
120
+ if (foundTypeAlias) {
121
+ preserveTypes(foundTypeAlias, preservedTypes, sourceFile, isVerbose);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ });
127
+ }
128
+ return typeReferences;
129
+ };
130
+ /**
131
+ * Convert an enum to a const object and string literal type
132
+ */
133
+ const convertEnumToConstObject = (enumDeclaration) => {
134
+ const enumName = enumDeclaration.getName();
135
+ const members = enumDeclaration.getMembers();
136
+ const properties = members.map(member => {
137
+ const name = member.getName();
138
+ const value = member.getValue();
139
+ return `${name}: '${value}'`;
140
+ });
141
+ const lowerCaseFirstLetter = enumName[0].toLowerCase() + enumName.slice(1);
142
+ const constObjectText = `export const ${lowerCaseFirstLetter} = {\n ${properties.join(",\n ")},\n} as const;\nexport type ${enumName} = typeof ${lowerCaseFirstLetter}[keyof typeof ${lowerCaseFirstLetter}];`;
143
+ return constObjectText;
144
+ };
145
+ exports.convertEnumToConstObject = convertEnumToConstObject;
146
+ /**
147
+ * Create a source file from a string
148
+ */
149
+ const createSourceFile = (fileContent) => {
150
+ const project = new ts_morph_1.Project({
151
+ compilerOptions: {
152
+ noUnusedLocals: true,
153
+ noUnusedParameters: true,
154
+ },
155
+ });
156
+ return project.createSourceFile("tmp.ts", fileContent);
157
+ };
158
+ exports.createSourceFile = createSourceFile;
159
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../../libs/react/graphql-tools/src/executors/createHooks/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { EnumDeclaration, Node, Project, SourceFile, SyntaxKind, TypeAliasDeclaration } from \"ts-morph\";\n\n/**\n * Check if the name is a *Query\n */\nexport const isQuery = (name: string) => {\n return name.endsWith(\"Query\") && name.length > \"Query\".length;\n};\n/**\n * Check if the name is a *QueryVariables\n */\nexport const isQueryVariables = (name: string) => {\n return name.endsWith(\"QueryVariables\");\n};\n\n/**\n * Check if the name is a Mutation\n */\nexport const isMutation = (name: string) => {\n return name.endsWith(\"Mutation\") && name.length > \"Mutation\".length;\n};\n\n/**\n * Check if the name is a *QueryVariables\n */\nexport const isMutationVariables = (name: string) => {\n return name.endsWith(\"MutationVariables\");\n};\n\n/**\n * Check if the name is a *Fragment and not *_Fragment\n */\nexport const isFragment = (name: string) => {\n return name.endsWith(\"Fragment\") && !name.endsWith(\"_Fragment\");\n};\n\n/**\n * Debug where you are in the tree\n */\nconst getFullPathUpOfNode = (node: Node) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let currentNode: any | undefined = node;\n const paths = [];\n\n while (currentNode) {\n // You can customize what details to include for each node (e.g., kind, text)\n let name = currentNode.getName ? currentNode.getName() : currentNode.getKindName();\n if (node.getKind() === SyntaxKind.TypeLiteral) {\n const typeLiteral = node.asKindOrThrow(SyntaxKind.TypeLiteral);\n name = typeLiteral.getText();\n }\n\n paths.unshift(`${name}`);\n currentNode = currentNode.getParent();\n }\n\n return paths.join(\">>\");\n};\n\n/**\n * Get the types that should be preserved\n */\nexport const getPreservedTypes = (\n sourceFile: SourceFile,\n isVerbose?: boolean\n): {\n preservedTypes: string[];\n queryAndMutations: Node[];\n} => {\n const typeAliases = sourceFile.getTypeAliases();\n const queryAndMutations: Node[] = [];\n\n const preservedTypes: string[] = [];\n\n const variablesListToProcess: TypeAliasDeclaration[] = [];\n const queryMutationListToProcess: TypeAliasDeclaration[] = [];\n\n typeAliases.forEach(typeAlias => {\n const name = typeAlias.getName();\n if (isQueryVariables(name) || isMutationVariables(name) || isFragment(name)) {\n variablesListToProcess.push(typeAlias);\n queryAndMutations.push(typeAlias);\n } else if (isQuery(name) || isMutation(name)) {\n queryMutationListToProcess.push(typeAlias);\n queryAndMutations.push(typeAlias);\n }\n });\n\n sourceFile.getVariableStatements().forEach(variableStatement => {\n const variable = variableStatement\n .getFirstChildByKind(SyntaxKind.VariableDeclarationList)\n ?.getFirstChildByKind(SyntaxKind.VariableDeclaration);\n if (variable?.getName().endsWith(\"Document\")) {\n queryAndMutations.push(variableStatement);\n } else if (variable?.getName().endsWith(\"FragmentDoc\")) {\n queryAndMutations.push(variableStatement);\n }\n });\n\n // RUN VARAIABLES FIRST since it will force full props if nessasary\n\n // VARIABLES are input so force include all props\n variablesListToProcess.forEach(typeAlias => {\n preserveTypes(typeAlias, preservedTypes, sourceFile, isVerbose);\n });\n\n // QUERY and MUTATION are dynamic so dont force props\n queryMutationListToProcess.forEach(typeAlias => {\n preserveTypes(typeAlias, preservedTypes, sourceFile, isVerbose);\n });\n\n return { preservedTypes, queryAndMutations };\n};\n\nconst preserveTypes = (node: Node, preservedTypes: string[], sourceFile: SourceFile, isVerbose?: boolean): Node[] => {\n const typeReferences: Node[] = [];\n if (!node.getText().startsWith(\"export type Query\") && !node.getText().startsWith(\"export type Mutation\")) {\n node.forEachDescendant(descendant => {\n if (descendant.getKind() === SyntaxKind.TypeReference) {\n if (\n !descendant.getText().startsWith(\"Scalars\") &&\n !descendant.getText().startsWith(\"Maybe<\") &&\n !descendant.getText().startsWith(\"InputMaybe<\") &&\n !descendant.getText().startsWith(\"Array<\") &&\n !descendant.getText().startsWith(\"Exact<\") &&\n !descendant.getText().includes(\"__typename\")\n ) {\n if (isVerbose) {\n // eslint-disable-next-line no-console\n console.log(\"ADDING\", getFullPathUpOfNode(descendant), \":\", descendant.getText(), descendant.getKindName());\n }\n if (!preservedTypes.includes(descendant.getText())) {\n const foundTypeAlias = sourceFile.getTypeAlias(descendant.getText());\n preservedTypes.push(descendant.getText());\n if (foundTypeAlias) {\n preserveTypes(foundTypeAlias, preservedTypes, sourceFile, isVerbose);\n }\n }\n }\n }\n });\n }\n\n return typeReferences;\n};\n\n/**\n * Convert an enum to a const object and string literal type\n */\nexport const convertEnumToConstObject = (enumDeclaration: EnumDeclaration) => {\n const enumName = enumDeclaration.getName();\n const members = enumDeclaration.getMembers();\n\n const properties = members.map(member => {\n const name = member.getName();\n const value = member.getValue();\n return `${name}: '${value}'`;\n });\n\n const lowerCaseFirstLetter = enumName[0].toLowerCase() + enumName.slice(1);\n const constObjectText = `export const ${lowerCaseFirstLetter} = {\\n ${properties.join(\n \",\\n \"\n )},\\n} as const;\\nexport type ${enumName} = typeof ${lowerCaseFirstLetter}[keyof typeof ${lowerCaseFirstLetter}];`;\n\n return constObjectText;\n};\n\n/**\n * Create a source file from a string\n */\nexport const createSourceFile = (fileContent: string) => {\n const project = new Project({\n compilerOptions: {\n noUnusedLocals: true,\n noUnusedParameters: true,\n },\n });\n\n return project.createSourceFile(\"tmp.ts\", fileContent);\n};\n"]}