gx
chenyc
2025-06-12 7b72ac13a83764a662159d4a49b7fffb90476ecb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { createBrowserEnv } from './createBrowserEnv';
import { createFileSystem } from './createFileSystem';
import { createNodejsEnv } from './createNodejsEnv';
import { isBrowser } from './isBrowser';
import { isNodejs } from './isNodejs';
import { Environment } from './types';
 
let environment: Environment | null;
 
function getEnv(): Environment {
  if (!environment) {
    throw new Error('getEnv - environment is not defined, check isNodejs() and isBrowser()');
  }
  return environment;
}
 
function setEnv(env: Environment) {
  environment = env;
}
 
function initialize() {
  // check for isBrowser() first to prevent electron renderer process
  // to be initialized with wrong environment due to isNodejs() returning true
  if (isBrowser()) return setEnv(createBrowserEnv());
  if (isNodejs()) return setEnv(createNodejsEnv());
  return null;
}
 
function monkeyPatch(env: Partial<Environment>) {
  if (!environment) {
    initialize();
  }
 
  if (!environment) {
    throw new Error('monkeyPatch - environment is not defined, check isNodejs() and isBrowser()');
  }
 
  const { Canvas = environment.Canvas, Image = environment.Image } = env;
  environment.Canvas = Canvas;
  environment.Image = Image;
  environment.createCanvasElement = env.createCanvasElement || (() => new Canvas());
  environment.createImageElement = env.createImageElement || (() => new Image());
 
  environment.ImageData = env.ImageData || environment.ImageData;
  environment.Video = env.Video || environment.Video;
  environment.fetch = env.fetch || environment.fetch;
  environment.readFile = env.readFile || environment.readFile;
}
 
export const env = {
  getEnv,
  setEnv,
  initialize,
  createBrowserEnv,
  createFileSystem,
  createNodejsEnv,
  monkeyPatch,
  isBrowser,
  isNodejs,
};
 
initialize();
 
export * from './types';