Skip to content

Commit 3a9d4b5

Browse files
committed
fix(openfeature): keep provider fallback opaque to webpack
Webpack parses a bare dynamic require even behind the non-webpack branch, reintroducing a critical expression-dependency warning when the peer is absent. The fallback must remain recognizable to nft without exposing that expression dependency to webpack.
1 parent 3e7767f commit 3a9d4b5

2 files changed

Lines changed: 21 additions & 14 deletions

File tree

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
'use strict'
22

3-
/**
4-
* @param {string} request
5-
* @returns {typeof import('@datadog/openfeature-node-server')}
6-
*/
7-
function requireOptionalPeer (request) {
8-
// @ts-expect-error webpack exposes this escape hatch as a free variable.
9-
// eslint-disable-next-line camelcase, no-undef
10-
if (typeof __non_webpack_require__ === 'function') return __non_webpack_require__(request)
11-
// eslint-disable-next-line sonarjs/prefer-immediate-return -- nft recognizes this bound-require shape.
12-
const optionalPeer = require(request)
13-
return optionalPeer
3+
/** @type {typeof import('@datadog/openfeature-node-server')} */
4+
let provider
5+
6+
// @ts-expect-error webpack exposes this escape hatch as a free variable.
7+
// eslint-disable-next-line camelcase
8+
if (typeof __non_webpack_require__ === 'function') {
9+
// eslint-disable-next-line no-undef
10+
provider = __non_webpack_require__('@datadog/openfeature-node-server')
11+
} else {
12+
// nft recognizes createRequire through a binding named `module`.
13+
const module = require('node:module')
14+
const requireOptionalPeer = module.createRequire(__filename)
15+
provider = requireOptionalPeer('@datadog/openfeature-node-server')
1416
}
1517

16-
module.exports = requireOptionalPeer('@datadog/openfeature-node-server')
18+
module.exports = provider

packages/dd-trace/test/openfeature/flagging_provider.spec.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22

33
const assert = require('node:assert/strict')
4+
const fs = require('node:fs')
45

56
const { describe, it, beforeEach, afterEach } = require('mocha')
67
const sinon = require('sinon')
@@ -267,15 +268,19 @@ describe('FlaggingProvider', () => {
267268
assert.strictEqual(typeof ReloadedFlaggingProvider, 'function')
268269
})
269270

270-
it('does not statically require `@datadog/openfeature-node-server`', () => {
271-
const fs = require('node:fs')
271+
it('keeps the provider load opaque to bundlers', () => {
272272
const source = fs.readFileSync(providerModulePath, 'utf8')
273273

274274
assert.doesNotMatch(
275275
source,
276276
/require\(\s*['"]@datadog\/openfeature-node-server['"]\s*\)/,
277277
'a literal require would let bundlers resolve the optional peer chain at build time'
278278
)
279+
assert.doesNotMatch(
280+
source,
281+
/\brequire\(\s*[^'"\s]/,
282+
'a dynamic require would create a webpack expression dependency'
283+
)
279284
})
280285
})
281286
})

0 commit comments

Comments
 (0)