@@ -2,6 +2,36 @@ import { FormatModule } from "relay-compiler";
2
2
import * as ts from "typescript" ;
3
3
import addAnyTypeCast from "./addAnyTypeCast" ;
4
4
5
+ const createRequireRegex = ( ) => / r e q u i r e \( " ( .* ) " \) / g;
6
+ const escapeRegexString = ( str : string ) =>
7
+ str . replace ( / [ - \/ \\ ^ $ * + ? . ( ) | [ \] { } ] / g, "\\$&" ) ;
8
+
9
+ // collects all require calls and converts them to top level imports
10
+ const requireToImport = ( content : string ) => {
11
+ const requirePaths = new Set < string > ( ) ;
12
+ const regex = createRequireRegex ( ) ;
13
+ let result : null | RegExpExecArray = null ;
14
+ while ( true ) {
15
+ result = regex . exec ( content ) ;
16
+ if ( result === null ) {
17
+ break ;
18
+ }
19
+ requirePaths . add ( result [ 1 ] ) ;
20
+ }
21
+
22
+ for ( const requirePath of requirePaths ) {
23
+ const [ baseName ] = requirePath . replace ( "./" , "" ) . split ( "." ) ;
24
+ content =
25
+ `import ${ baseName } from "${ requirePath . replace ( ".ts" , "" ) } ";\n` +
26
+ content . replace (
27
+ new RegExp ( escapeRegexString ( `require('${ requirePath } ')` ) , "g" ) ,
28
+ baseName
29
+ ) ;
30
+ }
31
+
32
+ return content ;
33
+ } ;
34
+
5
35
export const formatterFactory = (
6
36
compilerOptions : ts . CompilerOptions = { }
7
37
) : FormatModule => ( {
@@ -11,27 +41,31 @@ export const formatterFactory = (
11
41
concreteText,
12
42
typeText,
13
43
hash,
14
- sourceHash
44
+ sourceHash,
15
45
} ) => {
16
46
const documentTypeImport = documentType
17
47
? `import { ${ documentType } } from "relay-runtime";`
18
48
: "" ;
19
49
const docTextComment = docText ? "\n/*\n" + docText . trim ( ) + "\n*/\n" : "" ;
20
- let nodeStatement = `const node: ${ documentType ||
21
- "never" } = ${ concreteText } ;`;
50
+ let nodeStatement = `const node: ${
51
+ documentType || "never"
52
+ } = ${ concreteText } ;`;
22
53
if ( compilerOptions . noImplicitAny ) {
23
54
nodeStatement = addAnyTypeCast ( nodeStatement ) . trim ( ) ;
24
55
}
25
- return `/* tslint:disable */
26
- /* eslint-disable */
27
- // @ts-nocheck
28
- ${ hash ? `/* ${ hash } */\n` : "" }
29
- ${ documentTypeImport }
30
- ${ typeText || "" }
56
+ const rawContent = `${ typeText || "" }
31
57
32
58
${ docTextComment }
33
59
${ nodeStatement }
34
60
(node as any).hash = '${ sourceHash } ';
35
61
export default node;
36
62
` ;
63
+
64
+ const content = `/* tslint:disable */
65
+ /* eslint-disable */
66
+ // @ts-nocheck
67
+ ${ hash ? `/* ${ hash } */\n` : "" }
68
+ ${ documentTypeImport }
69
+ ${ requireToImport ( rawContent ) } `;
70
+ return content ;
37
71
} ;
0 commit comments