@@ -7,6 +7,9 @@ import { logger } from "@coder/logger";
7
7
8
8
// tslint:disable no-any
9
9
10
+ declare var __non_webpack_require__ : typeof require ;
11
+ declare var __webpack_require__ : typeof require ;
12
+
10
13
export type ForkProvider = ( modulePath : string , args : string [ ] , options : ForkOptions ) => ChildProcess ;
11
14
12
15
export interface Disposer extends IDisposable {
@@ -20,7 +23,7 @@ interface ActiveEvalEmitter {
20
23
}
21
24
22
25
/**
23
- * Helper class for evaluations.
26
+ * Helper class for server-side evaluations.
24
27
*/
25
28
export class EvalHelper {
26
29
/**
@@ -35,15 +38,36 @@ export class EvalHelper {
35
38
options . env = { ...process . env , ...options . env } ;
36
39
}
37
40
}
41
+
42
+ /**
43
+ * Try a non-webpack require, then a webpack require if that fails.
44
+ */
45
+ public require ( modulePath : string ) : any {
46
+ logger . info ( `Attempting to require ${ modulePath } ` ) ;
47
+ try {
48
+ return __non_webpack_require__ ( modulePath ) ;
49
+ } catch ( error ) { /* Nothing. */ }
50
+
51
+ logger . warn ( `Non-webpack require failed for ${ modulePath } ` ) ;
52
+ try {
53
+ return __webpack_require__ ( modulePath ) ;
54
+ } catch ( error ) { /* Nothing. */ }
55
+
56
+ logger . warn ( `Webpack require failed for ${ modulePath } ` ) ;
57
+ try {
58
+ return require ( modulePath ) ;
59
+ } catch ( error ) {
60
+ logger . error ( `Failed to require ${ modulePath } ` ) ;
61
+ throw error ;
62
+ }
63
+ }
38
64
}
39
65
40
66
/**
41
- * Helper class for active evaluations.
67
+ * Helper class for client-side active evaluations.
42
68
*/
43
- export class ActiveEvalHelper extends EvalHelper implements ActiveEvalEmitter {
44
- public constructor ( private readonly emitter : ActiveEvalEmitter ) {
45
- super ( ) ;
46
- }
69
+ export class ActiveEvalHelper implements ActiveEvalEmitter {
70
+ public constructor ( private readonly emitter : ActiveEvalEmitter ) { }
47
71
48
72
public removeAllListeners ( event ?: string ) : void {
49
73
this . emitter . removeAllListeners ( event ) ;
@@ -100,9 +124,19 @@ export class ActiveEvalHelper extends EvalHelper implements ActiveEvalEmitter {
100
124
/**
101
125
* Helper class for server-side active evaluations.
102
126
*/
103
- export class ServerActiveEvalHelper extends ActiveEvalHelper {
127
+ export class ServerActiveEvalHelper extends ActiveEvalHelper implements EvalHelper {
128
+ private readonly evalHelper : EvalHelper ;
104
129
public constructor ( emitter : ActiveEvalEmitter , public readonly fork : ForkProvider ) {
105
130
super ( emitter ) ;
131
+ this . evalHelper = new EvalHelper ( ) ;
132
+ }
133
+
134
+ public preserveEnv ( options : SpawnOptions | ForkOptions ) : void {
135
+ this . evalHelper . preserveEnv ( options ) ;
136
+ }
137
+
138
+ public require ( modulePath : string ) : any {
139
+ return this . evalHelper . require ( modulePath ) ;
106
140
}
107
141
108
142
/**
0 commit comments