@@ -7,6 +7,9 @@ import { logger } from "@coder/logger";
77
88// tslint:disable no-any
99
10+ declare var __non_webpack_require__ : typeof require ;
11+ declare var __webpack_require__ : typeof require ;
12+
1013export type ForkProvider = ( modulePath : string , args : string [ ] , options : ForkOptions ) => ChildProcess ;
1114
1215export interface Disposer extends IDisposable {
@@ -20,7 +23,7 @@ interface ActiveEvalEmitter {
2023}
2124
2225/**
23- * Helper class for evaluations.
26+ * Helper class for server-side evaluations.
2427 */
2528export class EvalHelper {
2629 /**
@@ -35,15 +38,36 @@ export class EvalHelper {
3538 options . env = { ...process . env , ...options . env } ;
3639 }
3740 }
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+ }
3864}
3965
4066/**
41- * Helper class for active evaluations.
67+ * Helper class for client-side active evaluations.
4268 */
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 ) { }
4771
4872 public removeAllListeners ( event ?: string ) : void {
4973 this . emitter . removeAllListeners ( event ) ;
@@ -100,9 +124,19 @@ export class ActiveEvalHelper extends EvalHelper implements ActiveEvalEmitter {
100124/**
101125 * Helper class for server-side active evaluations.
102126 */
103- export class ServerActiveEvalHelper extends ActiveEvalHelper {
127+ export class ServerActiveEvalHelper extends ActiveEvalHelper implements EvalHelper {
128+ private readonly evalHelper : EvalHelper ;
104129 public constructor ( emitter : ActiveEvalEmitter , public readonly fork : ForkProvider ) {
105130 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 ) ;
106140 }
107141
108142 /**
0 commit comments