Skip to content

Commit e5103f7

Browse files
committed
webpack polyfill
1 parent 013e074 commit e5103f7

File tree

4 files changed

+62
-41
lines changed

4 files changed

+62
-41
lines changed

packages/core/src/tools/getGlobalObject.ts

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,26 @@ export function getGlobalObject<T = typeof globalThis>(): T {
66
if (typeof globalThis === 'object') {
77
return globalThis as unknown as T
88
}
9-
10-
// Polyfill globalThis if it doesn't exist
11-
if (typeof globalThis === 'undefined') {
12-
Object.defineProperty(Object.prototype, '_dd_temp_', {
13-
get() {
14-
return this as object
15-
},
16-
configurable: true,
17-
})
18-
// @ts-ignore _dd_temp is defined using defineProperty
19-
let globalObject: unknown = _dd_temp_
20-
// @ts-ignore _dd_temp is defined using defineProperty
21-
delete Object.prototype._dd_temp_
22-
if (typeof globalObject !== 'object') {
23-
// on safari _dd_temp_ is available on window but not globally
24-
// fallback on other browser globals check
25-
if (typeof self === 'object') {
26-
globalObject = self
27-
} else if (typeof window === 'object') {
28-
globalObject = window
29-
} else {
30-
globalObject = {}
31-
}
9+
Object.defineProperty(Object.prototype, '_dd_temp_', {
10+
get() {
11+
return this as object
12+
},
13+
configurable: true,
14+
})
15+
// @ts-ignore _dd_temp is defined using defineProperty
16+
let globalObject: unknown = _dd_temp_
17+
// @ts-ignore _dd_temp is defined using defineProperty
18+
delete Object.prototype._dd_temp_
19+
if (typeof globalObject !== 'object') {
20+
// on safari _dd_temp_ is available on window but not globally
21+
// fallback on other browser globals check
22+
if (typeof self === 'object') {
23+
globalObject = self
24+
} else if (typeof window === 'object') {
25+
globalObject = window
26+
} else {
27+
globalObject = {}
3228
}
33-
34-
// Define globalThis if it doesn't exist
35-
Object.defineProperty(globalObject as object, 'globalThis', {
36-
value: globalObject,
37-
writable: true,
38-
enumerable: false,
39-
configurable: true,
40-
})
4129
}
42-
43-
return globalThis as unknown as T
30+
return globalObject as T
4431
}

packages/flagging/src/entries/main.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
import { defineGlobal, getGlobalObject } from '@datadog/browser-core'
2-
3-
// Apply globalThis polyfill before importing OpenFeature
4-
// The OpenFeature web SDK uses globalThis which is not available in older browsers (like Chrome 63).
5-
// Our getGlobalObject() utility provides a polyfill that makes globalThis available by using
6-
// fallbacks like window or self. We need to call it before importing OpenFeature to ensure
7-
// the polyfill is in place when OpenFeature tries to use globalThis.
8-
getGlobalObject()
2+
import './polyfill'
93

104
import { DatadogProvider } from '../openfeature/provider'
115

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Polyfill for globalThis that runs before any other code
3+
* Based on https://mathiasbynens.be/notes/globalthis
4+
*/
5+
6+
if (typeof globalThis === 'undefined') {
7+
Object.defineProperty(Object.prototype, '_dd_temp_', {
8+
get() {
9+
return this as object
10+
},
11+
configurable: true,
12+
})
13+
// @ts-ignore _dd_temp is defined using defineProperty
14+
let globalObject: unknown = _dd_temp_
15+
// @ts-ignore _dd_temp is defined using defineProperty
16+
delete Object.prototype._dd_temp_
17+
if (typeof globalObject !== 'object') {
18+
// on safari _dd_temp_ is available on window but not globally
19+
// fallback on other browser globals check
20+
if (typeof self === 'object') {
21+
globalObject = self
22+
} else if (typeof window === 'object') {
23+
globalObject = window
24+
} else {
25+
globalObject = {}
26+
}
27+
}
28+
29+
// Define globalThis if it doesn't exist
30+
Object.defineProperty(globalObject as object, 'globalThis', {
31+
value: globalObject,
32+
writable: true,
33+
enumerable: false,
34+
configurable: true,
35+
})
36+
}

packages/flagging/webpack.config.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ const webpackBase = require('../../webpack.base')
55
module.exports = (_env, argv) =>
66
webpackBase({
77
mode: argv.mode,
8-
entry: path.resolve(__dirname, 'src/entries/main.ts'),
8+
// Use polyfill.ts as the entry point to ensure globalThis is defined before any other code runs.
9+
// This is necessary because @openfeature/web-sdk uses globalThis which is not available in older
10+
// browsers (like Chrome 63). The polyfill must run before any other code to prevent
11+
// "globalThis is not defined" errors.
12+
entry: path.resolve(__dirname, 'src/entries/polyfill.ts'),
913
filename: 'datadog-flagging.js',
1014
})

0 commit comments

Comments
 (0)