namespace com.keyman.utils { /** * Returns the base global object available to the current JS platform. * - In browsers, returns `window`. * - In WebWorkers, returns `self`. * - In Node, returns `global`. */ export function getGlobalObject(): typeof globalThis { // Evergreen browsers have started defining 'globalThis'. // Refer to https://devblogs.microsoft.com/typescript/announcing-typescript-3-4/#type-checking-for-globalthis // and its referenced polyfill. Said polyfill is very complex, so we opt for this far leaner variant. if(typeof globalThis != 'undefined') { return globalThis; // Not available in IE or older Edge versions // @ts-ignore (TS will throw errors for whatever platform we're not compiling for.) } else if(typeof window != 'undefined') { // @ts-ignore return window; // The browser-based classic // @ts-ignore } else if(typeof self != 'undefined') { // @ts-ignore return self; // WebWorker global } else { // Assumption - if neither of the above exist, we're in Node, for unit-testing. // Node doesn't have as many methods and properties as the other two, but what // matters for us is that it's the base global. // // Some other headless JS solutions use 'this' instead, but Node's enough for our needs. // @ts-ignore return (global as any) as typeof globalThis; } } }