Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Commit 705268d

Browse files
authored
Fix require('ReactFeatureFlags') in eslint-plugin-react-hooks www build (#36243)
PR #35951 added FB_WWW_DEV builds for eslint-plugin-react-hooks to get www-specific feature flag values. However, the FB_WWW build uses the full ReactFeatureFlags.www.js fork, which contains: const dynamicFeatureFlags = require('ReactFeatureFlags'); This is a www Haste module that only exists in the www runtime. Rollup can't tree-shake CJS require() calls (they're assumed side-effectful), so the bare require('ReactFeatureFlags') survives in the build output even though the eslint plugin only uses the static eprh_* exports. When the built artifact is synced to www at scripts/lint/eslint/rules/eslint-plugin-react-hooks/index.js, Node.js fails with "Cannot find module 'ReactFeatureFlags'" because Haste modules aren't available in the Node.js lint environment. Create a dedicated fork (ReactFeatureFlags.eslint-plugin.www.js) that exports only the static eprh_* flags with www values, without the require('ReactFeatureFlags') dependency. Wire it up in forks.js for the eslint-plugin-react-hooks entry point. <!-- Thanks for submitting a pull request! We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory. Before submitting a pull request, please make sure the following is done: 1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`. 2. Run `yarn` in the repository root. 3. If you've fixed a bug or added code that should be tested, add tests! 4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development. 5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`. 6. If you need a debugger, run `yarn test --debug --watch TestName`, open `chrome://inspect`, and press "Inspect". 7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`). 8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files. 9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`). 10. If you haven't already, complete the CLA. Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html --> Co-authored-by: Eugene Choi <eugenechoi@meta.com>
1 parent 733d3aa commit 705268d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict
8+
*/
9+
10+
// This fork provides www-specific feature flag values for
11+
// eslint-plugin-react-hooks without pulling in the full
12+
// ReactFeatureFlags.www.js fork. The full fork imports dynamic flags
13+
// via require('ReactFeatureFlags'), which is a www Haste module that
14+
// doesn't exist in Node.js environments where the ESLint plugin runs.
15+
//
16+
// Only eprh_* flags are needed by the ESLint plugin.
17+
18+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
19+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
20+
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
21+
|'off'
22+
|'all'
23+
|'extra-only'
24+
|'missing-only'='extra-only';

‎packages/shared/forks/ReactFeatureFlags.www.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ export const enableFragmentRefsInstanceHandles: boolean = true;
114114

115115
exportconstenableOptimisticKey: boolean=false;
116116

117-
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=true;
118-
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=true;
117+
// These flags are only used by eslint-plugin-react-hooks, which has its own
118+
// fork at ReactFeatureFlags.eslint-plugin.www.js with the www-specific values.
119+
// Edit that file to change the www values for these flags.
120+
exportconsteprh_enableUseKeyedStateCompilerLint: boolean=false;
121+
exportconsteprh_enableVerboseNoSetStateInEffectCompilerLint: boolean=false;
119122
exportconsteprh_enableExhaustiveEffectDependenciesCompilerLint:
120123
|'off'
121124
|'all'
122125
|'extra-only'
123-
|'missing-only'='extra-only';
126+
|'missing-only'='off';
124127

125128
// Flow magic to verify the exports of this file match the original version.
126129
((((null: any): ExportsType): FeatureFlagsType): ExportsType);

‎scripts/rollup/forks.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ const forks = Object.freeze({
163163
`Unexpected entry (${entry}) and bundleType (${bundleType})`
164164
);
165165
}
166+
case'eslint-plugin-react-hooks/src/index.ts':
167+
switch(bundleType){
168+
caseFB_WWW_DEV:
169+
caseFB_WWW_PROD:
170+
caseFB_WWW_PROFILING:
171+
return'./packages/shared/forks/ReactFeatureFlags.eslint-plugin.www.js';
172+
}
173+
returnnull;
166174
case'react-test-renderer':
167175
switch(bundleType){
168176
caseRN_FB_DEV:

0 commit comments

Comments
 (0)