Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.

Commit 27ecdeb

Browse files
committed
create aggregateRuntimeImports function
1 parent ce7cdba commit 27ecdeb

File tree

4 files changed

+68
-11
lines changed

4 files changed

+68
-11
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,21 +89,21 @@
8989
"jest": "^24.8.0",
9090
"jest-cli": "^24.8.0",
9191
"lint-staged": "^9.2.1",
92-
"prettier": "^1.18.2",
92+
"prettier": "^1.19.1",
9393
"relay-compiler": "^7.0.0",
9494
"relay-runtime": "^7.0.0",
9595
"relay-test-utils-internal": "^7.0.0",
9696
"ts-jest": "^22.0.1",
9797
"tslint": "^5.18.0",
9898
"tslint-config-prettier": "^1.18.0",
99-
"typescript": "3.6.4"
99+
"typescript": "^3.7.2"
100100
},
101101
"peerDependencies": {
102102
"@types/react-relay": ">=7.0.0",
103103
"@types/relay-runtime": ">=6.0.7",
104104
"relay-compiler": ">=7.0.0",
105105
"relay-runtime": ">=7.0.0",
106-
"typescript": ">=3.6.4"
106+
"typescript": ">=3.7.2"
107107
},
108108
"publishConfig": {
109109
"registry": "https://registry.npmjs.org/"

src/TypeScriptGenerator.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ const MODULE_IMPORT_FIELD = "MODULE_IMPORT_FIELD";
4848
const DIRECTIVE_NAME = "raw_response_type";
4949

5050
export const generate: TypeGenerator["generate"] = (schema, node, options) => {
51-
const ast: ts.Statement[] = IRVisitor.visit(
51+
let ast: ts.Statement[] = IRVisitor.visit(
5252
node,
5353
createVisitor(schema, options)
5454
);
5555

56+
ast = aggregateRuntimeImports(ast);
57+
5658
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
5759

5860
const resultFile = ts.createSourceFile(
@@ -68,6 +70,57 @@ export const generate: TypeGenerator["generate"] = (schema, node, options) => {
6870
return printer.printNode(ts.EmitHint.SourceFile, fullProgramAst, resultFile);
6971
};
7072

73+
function aggregateRuntimeImports(ast: ts.Statement[]) {
74+
const importNodes = ast.filter(declaration =>
75+
ts.isImportDeclaration(declaration)
76+
) as ts.ImportDeclaration[];
77+
78+
const runtimeImports = importNodes.filter(
79+
importDeclaration =>
80+
// @ts-ignore
81+
importDeclaration.moduleSpecifier.text === "relay-runtime"
82+
);
83+
84+
if (runtimeImports.length > 1) {
85+
const namedImports: string[] = [];
86+
runtimeImports.map(node => {
87+
// @ts-ignore
88+
node.importClause?.namedBindings.elements.map(element => {
89+
namedImports.push(element.name.escapedText);
90+
});
91+
});
92+
93+
const importSpecifiers: ts.ImportSpecifier[] = [];
94+
namedImports.map(namedImport => {
95+
const specifier = ts.createImportSpecifier(
96+
undefined,
97+
ts.createIdentifier(namedImport)
98+
);
99+
importSpecifiers.push(specifier);
100+
});
101+
102+
const namedBindings = ts.createNamedImports(importSpecifiers);
103+
const aggregatedRuntimeImportDeclaration = ts.createImportDeclaration(
104+
undefined,
105+
undefined,
106+
ts.createImportClause(undefined, namedBindings),
107+
ts.createStringLiteral("relay-runtime")
108+
);
109+
110+
const aggregatedRuntimeImportAST = ast.reduce<ts.Statement[]>(
111+
(prev, curr) => {
112+
if (!ts.isImportDeclaration(curr)) prev.push(curr);
113+
return prev;
114+
},
115+
[aggregatedRuntimeImportDeclaration]
116+
);
117+
118+
return aggregatedRuntimeImportAST;
119+
} else {
120+
return ast;
121+
}
122+
}
123+
71124
function nullthrows<T>(obj: T | null | undefined): T {
72125
if (obj == null) {
73126
throw new Error("Obj is null");

test/__snapshots__/TypeScriptGenerator-test.ts.snap

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,8 +1535,7 @@ export type RefetchableFragment$key = {
15351535
15361536
15371537
// RefetchableFragmentQuery.graphql
1538-
import { FragmentReference } from "relay-runtime";
1539-
import { FragmentRefs } from "relay-runtime";
1538+
import { FragmentReference, FragmentRefs } from "relay-runtime";
15401539
export type RefetchableFragmentQueryVariables = {
15411540
id: string;
15421541
};

yarn.lock

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4854,10 +4854,10 @@ preserve@^0.2.0:
48544854
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
48554855
integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
48564856

4857-
prettier@^1.18.2:
4858-
version "1.18.2"
4859-
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
4860-
integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
4857+
prettier@^1.19.1:
4858+
version "1.19.1"
4859+
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
4860+
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
48614861

48624862
pretty-format@^22.4.0, pretty-format@^22.4.3:
48634863
version "22.4.3"
@@ -5943,11 +5943,16 @@ type-fest@^0.6.0:
59435943
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
59445944
integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
59455945

5946-
typescript@3.6.4, typescript@^3.0.0:
5946+
typescript@^3.0.0:
59475947
version "3.6.4"
59485948
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d"
59495949
integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==
59505950

5951+
typescript@^3.7.2:
5952+
version "3.7.2"
5953+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb"
5954+
integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==
5955+
59515956
ua-parser-js@^0.7.18:
59525957
version "0.7.20"
59535958
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098"

0 commit comments

Comments
 (0)