1. 'use strict';
    
  2. 
    
  3. const {
    
  4.   es5Paths,
    
  5.   esNextPaths,
    
  6. } = require('./scripts/shared/pathsByLanguageVersion');
    
  7. 
    
  8. const restrictedGlobals = require('confusing-browser-globals');
    
  9. 
    
  10. const OFF = 0;
    
  11. const WARNING = 1;
    
  12. const ERROR = 2;
    
  13. 
    
  14. module.exports = {
    
  15.   extends: ['prettier'],
    
  16. 
    
  17.   // Stop ESLint from looking for a configuration file in parent folders
    
  18.   root: true,
    
  19. 
    
  20.   plugins: [
    
  21.     'babel',
    
  22.     'ft-flow',
    
  23.     'jest',
    
  24.     'no-for-of-loops',
    
  25.     'no-function-declare-after-return',
    
  26.     'react',
    
  27.     'react-internal',
    
  28.   ],
    
  29. 
    
  30.   parser: 'hermes-eslint',
    
  31.   parserOptions: {
    
  32.     ecmaVersion: 9,
    
  33.     sourceType: 'script',
    
  34.   },
    
  35. 
    
  36.   // We're stricter than the default config, mostly. We'll override a few rules
    
  37.   // and then enable some React specific ones.
    
  38.   rules: {
    
  39.     'ft-flow/array-style-complex-type': [OFF, 'verbose'],
    
  40.     'ft-flow/array-style-simple-type': [OFF, 'verbose'], // TODO should be WARNING
    
  41.     'ft-flow/boolean-style': ERROR,
    
  42.     'ft-flow/no-dupe-keys': ERROR,
    
  43.     'ft-flow/no-primitive-constructor-types': ERROR,
    
  44.     'ft-flow/no-types-missing-file-annotation': OFF, // TODO should be ERROR
    
  45.     'ft-flow/no-unused-expressions': ERROR,
    
  46.     // 'ft-flow/no-weak-types': WARNING,
    
  47.     // 'ft-flow/require-valid-file-annotation': ERROR,
    
  48. 
    
  49.     'no-cond-assign': OFF,
    
  50.     'no-constant-condition': OFF,
    
  51.     'no-control-regex': OFF,
    
  52.     'no-debugger': ERROR,
    
  53.     'no-dupe-args': ERROR,
    
  54.     'no-dupe-keys': ERROR,
    
  55.     'no-duplicate-case': WARNING,
    
  56.     'no-empty-character-class': WARNING,
    
  57.     'no-empty': OFF,
    
  58.     'no-ex-assign': WARNING,
    
  59.     'no-extra-boolean-cast': WARNING,
    
  60.     'no-func-assign': ERROR,
    
  61.     'no-invalid-regexp': WARNING,
    
  62.     'no-irregular-whitespace': WARNING,
    
  63.     'no-negated-in-lhs': ERROR,
    
  64.     'no-obj-calls': ERROR,
    
  65.     'no-regex-spaces': WARNING,
    
  66.     'no-sparse-arrays': ERROR,
    
  67.     'no-unreachable': ERROR,
    
  68.     'use-isnan': ERROR,
    
  69.     'valid-jsdoc': OFF,
    
  70.     'block-scoped-var': OFF,
    
  71.     complexity: OFF,
    
  72.     'default-case': OFF,
    
  73.     'guard-for-in': OFF,
    
  74.     'no-alert': OFF,
    
  75.     'no-caller': ERROR,
    
  76.     'no-case-declarations': OFF,
    
  77.     'no-div-regex': OFF,
    
  78.     'no-else-return': OFF,
    
  79.     'no-empty-pattern': WARNING,
    
  80.     'no-eq-null': OFF,
    
  81.     'no-eval': ERROR,
    
  82.     'no-extend-native': WARNING,
    
  83.     'no-extra-bind': WARNING,
    
  84.     'no-fallthrough': WARNING,
    
  85.     'no-implicit-coercion': OFF,
    
  86.     'no-implied-eval': ERROR,
    
  87.     'no-invalid-this': OFF,
    
  88.     'no-iterator': OFF,
    
  89.     'no-labels': [ERROR, {allowLoop: true, allowSwitch: true}],
    
  90.     'no-lone-blocks': WARNING,
    
  91.     'no-loop-func': OFF,
    
  92.     'no-magic-numbers': OFF,
    
  93.     'no-multi-str': ERROR,
    
  94.     'no-native-reassign': [ERROR, {exceptions: ['Map', 'Set']}],
    
  95.     'no-new-func': ERROR,
    
  96.     'no-new': WARNING,
    
  97.     'no-new-wrappers': WARNING,
    
  98.     'no-octal-escape': WARNING,
    
  99.     'no-octal': WARNING,
    
  100.     'no-param-reassign': OFF,
    
  101.     'no-process-env': OFF,
    
  102.     'no-proto': ERROR,
    
  103.     'no-redeclare': OFF, // TODO should be WARNING?
    
  104.     'no-return-assign': OFF,
    
  105.     'no-script-url': ERROR,
    
  106.     'no-self-compare': WARNING,
    
  107.     'no-sequences': WARNING,
    
  108.     'no-throw-literal': ERROR,
    
  109.     'no-useless-call': WARNING,
    
  110.     'no-void': OFF,
    
  111.     'no-warning-comments': OFF,
    
  112.     'no-with': OFF,
    
  113.     radix: WARNING,
    
  114.     'vars-on-top': OFF,
    
  115.     yoda: OFF,
    
  116.     'init-declarations': OFF,
    
  117.     'no-catch-shadow': ERROR,
    
  118.     'no-delete-var': ERROR,
    
  119.     'no-label-var': WARNING,
    
  120.     'no-shadow-restricted-names': WARNING,
    
  121.     'no-undef-init': OFF,
    
  122.     'no-undef': ERROR,
    
  123.     'no-undefined': OFF,
    
  124.     'callback-return': OFF,
    
  125.     'global-require': OFF,
    
  126.     'handle-callback-err': OFF,
    
  127.     'no-mixed-requires': OFF,
    
  128.     'no-new-require': OFF,
    
  129.     'no-path-concat': OFF,
    
  130.     'no-process-exit': OFF,
    
  131.     'no-restricted-modules': OFF,
    
  132.     'no-sync': OFF,
    
  133.     camelcase: [OFF, {properties: 'always'}],
    
  134.     'consistent-this': [OFF, 'self'],
    
  135.     'func-names': OFF,
    
  136.     'func-style': [OFF, 'declaration'],
    
  137.     'id-length': OFF,
    
  138.     'id-match': OFF,
    
  139.     'max-depth': OFF,
    
  140.     'max-nested-callbacks': OFF,
    
  141.     'max-params': OFF,
    
  142.     'max-statements': OFF,
    
  143.     'new-cap': OFF,
    
  144.     'newline-after-var': OFF,
    
  145.     'no-array-constructor': ERROR,
    
  146.     'no-continue': OFF,
    
  147.     'no-inline-comments': OFF,
    
  148.     'no-lonely-if': OFF,
    
  149.     'no-negated-condition': OFF,
    
  150.     'no-nested-ternary': OFF,
    
  151.     'no-new-object': WARNING,
    
  152.     'no-plusplus': OFF,
    
  153.     'no-ternary': OFF,
    
  154.     'no-underscore-dangle': OFF,
    
  155.     'no-unneeded-ternary': WARNING,
    
  156.     'one-var': [WARNING, {initialized: 'never'}],
    
  157.     'operator-assignment': [WARNING, 'always'],
    
  158.     'require-jsdoc': OFF,
    
  159.     'sort-vars': OFF,
    
  160.     'spaced-comment': [
    
  161.       OFF,
    
  162.       'always',
    
  163.       {exceptions: ['jshint', 'jslint', 'eslint', 'global']},
    
  164.     ],
    
  165.     'constructor-super': ERROR,
    
  166.     'no-class-assign': WARNING,
    
  167.     'no-const-assign': ERROR,
    
  168.     'no-dupe-class-members': ERROR,
    
  169.     'no-this-before-super': ERROR,
    
  170.     'object-shorthand': OFF,
    
  171.     'prefer-const': OFF,
    
  172.     'prefer-spread': OFF,
    
  173.     'prefer-reflect': OFF,
    
  174.     'prefer-template': OFF,
    
  175.     'require-yield': OFF,
    
  176.     'babel/generator-star-spacing': OFF,
    
  177.     'babel/new-cap': OFF,
    
  178.     'babel/array-bracket-spacing': OFF,
    
  179.     'babel/object-curly-spacing': OFF,
    
  180.     'babel/object-shorthand': OFF,
    
  181.     'babel/arrow-parens': OFF,
    
  182.     'babel/no-await-in-loop': OFF,
    
  183.     'babel/flow-object-type': OFF,
    
  184.     'react/display-name': OFF,
    
  185.     'react/forbid-prop-types': OFF,
    
  186.     'react/jsx-closing-bracket-location': OFF,
    
  187.     'react/jsx-curly-spacing': OFF,
    
  188.     'react/jsx-equals-spacing': WARNING,
    
  189.     'react/jsx-filename-extension': OFF,
    
  190.     'react/jsx-first-prop-new-line': OFF,
    
  191.     'react/jsx-handler-names': OFF,
    
  192.     'react/jsx-indent': OFF,
    
  193.     'react/jsx-indent-props': OFF,
    
  194.     'react/jsx-key': OFF,
    
  195.     'react/jsx-max-props-per-line': OFF,
    
  196.     'react/jsx-no-bind': OFF,
    
  197.     'react/jsx-no-duplicate-props': ERROR,
    
  198.     'react/jsx-no-literals': OFF,
    
  199.     'react/jsx-no-target-blank': OFF,
    
  200.     'react/jsx-pascal-case': OFF,
    
  201.     'react/jsx-sort-props': OFF,
    
  202.     'react/jsx-uses-vars': ERROR,
    
  203.     'react/no-comment-textnodes': OFF,
    
  204.     'react/no-danger': OFF,
    
  205.     'react/no-deprecated': OFF,
    
  206.     'react/no-did-mount-set-state': OFF,
    
  207.     'react/no-did-update-set-state': OFF,
    
  208.     'react/no-direct-mutation-state': OFF,
    
  209.     'react/no-multi-comp': OFF,
    
  210.     'react/no-render-return-value': OFF,
    
  211.     'react/no-set-state': OFF,
    
  212.     'react/no-string-refs': OFF,
    
  213.     'react/no-unknown-property': OFF,
    
  214.     'react/prefer-es6-class': OFF,
    
  215.     'react/prefer-stateless-function': OFF,
    
  216.     'react/prop-types': OFF,
    
  217.     'react/require-extension': OFF,
    
  218.     'react/require-optimization': OFF,
    
  219.     'react/require-render-return': OFF,
    
  220.     'react/sort-comp': OFF,
    
  221.     'react/sort-prop-types': OFF,
    
  222. 
    
  223.     'accessor-pairs': OFF,
    
  224.     'brace-style': [ERROR, '1tbs'],
    
  225.     'consistent-return': OFF,
    
  226.     'dot-location': [ERROR, 'property'],
    
  227.     // We use console['error']() as a signal to not transform it:
    
  228.     'dot-notation': [ERROR, {allowPattern: '^(error|warn)$'}],
    
  229.     'eol-last': ERROR,
    
  230.     eqeqeq: [ERROR, 'allow-null'],
    
  231.     indent: OFF,
    
  232.     'jsx-quotes': [ERROR, 'prefer-double'],
    
  233.     'keyword-spacing': [ERROR, {after: true, before: true}],
    
  234.     'no-bitwise': OFF,
    
  235.     'no-console': OFF,
    
  236.     'no-inner-declarations': [ERROR, 'functions'],
    
  237.     'no-multi-spaces': ERROR,
    
  238.     'no-restricted-globals': [ERROR].concat(restrictedGlobals),
    
  239.     'no-restricted-syntax': [
    
  240.       ERROR,
    
  241.       'WithStatement',
    
  242.       {
    
  243.         selector: 'MemberExpression[property.name=/^(?:substring|substr)$/]',
    
  244.         message: 'Prefer string.slice() over .substring() and .substr().',
    
  245.       },
    
  246.     ],
    
  247.     'no-shadow': ERROR,
    
  248.     'no-unused-vars': [ERROR, {args: 'none'}],
    
  249.     'no-use-before-define': OFF,
    
  250.     'no-useless-concat': OFF,
    
  251.     quotes: [ERROR, 'single', {avoidEscape: true, allowTemplateLiterals: true}],
    
  252.     'space-before-blocks': ERROR,
    
  253.     'space-before-function-paren': OFF,
    
  254.     'valid-typeof': [ERROR, {requireStringLiterals: true}],
    
  255.     // Flow fails with non-string literal keys
    
  256.     'no-useless-computed-key': OFF,
    
  257. 
    
  258.     // We apply these settings to files that should run on Node.
    
  259.     // They can't use JSX or ES6 modules, and must be in strict mode.
    
  260.     // They can, however, use other ES6 features.
    
  261.     // (Note these rules are overridden later for source files.)
    
  262.     'no-var': ERROR,
    
  263.     strict: ERROR,
    
  264. 
    
  265.     // Enforced by Prettier
    
  266.     // TODO: Prettier doesn't handle long strings or long comments. Not a big
    
  267.     // deal. But I turned it off because loading the plugin causes some obscure
    
  268.     // syntax error and it didn't seem worth investigating.
    
  269.     'max-len': OFF,
    
  270. 
    
  271.     // React & JSX
    
  272.     // Our transforms set this automatically
    
  273.     'react/jsx-boolean-value': [ERROR, 'always'],
    
  274.     'react/jsx-no-undef': ERROR,
    
  275.     // We don't care to do this
    
  276.     'react/jsx-sort-prop-types': OFF,
    
  277.     'react/jsx-space-before-closing': ERROR,
    
  278.     'react/jsx-uses-react': ERROR,
    
  279.     'react/no-is-mounted': OFF,
    
  280.     // This isn't useful in our test code
    
  281.     'react/react-in-jsx-scope': ERROR,
    
  282.     'react/self-closing-comp': ERROR,
    
  283.     // We don't care to do this
    
  284.     'react/jsx-wrap-multilines': [
    
  285.       ERROR,
    
  286.       {declaration: false, assignment: false},
    
  287.     ],
    
  288. 
    
  289.     // Prevent for...of loops because they require a Symbol polyfill.
    
  290.     // You can disable this rule for code that isn't shipped (e.g. build scripts and tests).
    
  291.     'no-for-of-loops/no-for-of-loops': ERROR,
    
  292. 
    
  293.     // Prevent function declarations after return statements
    
  294.     'no-function-declare-after-return/no-function-declare-after-return': ERROR,
    
  295. 
    
  296.     // CUSTOM RULES
    
  297.     // the second argument of warning/invariant should be a literal string
    
  298.     'react-internal/no-primitive-constructors': ERROR,
    
  299.     'react-internal/safe-string-coercion': [
    
  300.       ERROR,
    
  301.       {isProductionUserAppCode: true},
    
  302.     ],
    
  303.     'react-internal/no-to-warn-dev-within-to-throw': ERROR,
    
  304.     'react-internal/warning-args': ERROR,
    
  305.     'react-internal/no-production-logging': ERROR,
    
  306.   },
    
  307. 
    
  308.   overrides: [
    
  309.     {
    
  310.       // By default, anything error message that appears the packages directory
    
  311.       // must have a corresponding error code. The exceptions are defined
    
  312.       // in the next override entry.
    
  313.       files: ['packages/**/*.js'],
    
  314.       rules: {
    
  315.         'react-internal/prod-error-codes': ERROR,
    
  316.       },
    
  317.     },
    
  318.     {
    
  319.       // These are files where it's OK to have unminified error messages. These
    
  320.       // are environments where bundle size isn't a concern, like tests
    
  321.       // or Node.
    
  322.       files: [
    
  323.         'packages/react-dom/src/test-utils/**/*.js',
    
  324.         'packages/react-devtools-shared/**/*.js',
    
  325.         'packages/react-noop-renderer/**/*.js',
    
  326.         'packages/react-refresh/**/*.js',
    
  327.         'packages/react-server-dom-esm/**/*.js',
    
  328.         'packages/react-server-dom-webpack/**/*.js',
    
  329.         'packages/react-server-dom-turbopack/**/*.js',
    
  330.         'packages/react-test-renderer/**/*.js',
    
  331.         'packages/react-debug-tools/**/*.js',
    
  332.         'packages/react-devtools-extensions/**/*.js',
    
  333.         'packages/react-devtools-timeline/**/*.js',
    
  334.         'packages/react-native-renderer/**/*.js',
    
  335.         'packages/eslint-plugin-react-hooks/**/*.js',
    
  336.         'packages/jest-react/**/*.js',
    
  337.         'packages/internal-test-utils/**/*.js',
    
  338.         'packages/**/__tests__/*.js',
    
  339.         'packages/**/npm/*.js',
    
  340.       ],
    
  341.       rules: {
    
  342.         'react-internal/prod-error-codes': OFF,
    
  343.       },
    
  344.     },
    
  345.     {
    
  346.       // We apply these settings to files that we ship through npm.
    
  347.       // They must be ES5.
    
  348.       files: es5Paths,
    
  349.       parser: 'espree',
    
  350.       parserOptions: {
    
  351.         ecmaVersion: 5,
    
  352.         sourceType: 'script',
    
  353.       },
    
  354.       rules: {
    
  355.         'no-var': OFF,
    
  356.         strict: ERROR,
    
  357.       },
    
  358.     },
    
  359.     {
    
  360.       // We apply these settings to the source files that get compiled.
    
  361.       // They can use all features including JSX (but shouldn't use `var`).
    
  362.       files: esNextPaths,
    
  363.       parser: 'hermes-eslint',
    
  364.       parserOptions: {
    
  365.         ecmaVersion: 8,
    
  366.         sourceType: 'module',
    
  367.       },
    
  368.       rules: {
    
  369.         'no-var': ERROR,
    
  370.         'prefer-const': ERROR,
    
  371.         strict: OFF,
    
  372.       },
    
  373.     },
    
  374.     {
    
  375.       files: ['**/__tests__/*.js'],
    
  376.       rules: {
    
  377.         // https://github.com/jest-community/eslint-plugin-jest
    
  378.         'jest/no-focused-tests': ERROR,
    
  379.         'jest/valid-expect': ERROR,
    
  380.         'jest/valid-expect-in-promise': ERROR,
    
  381.       },
    
  382.     },
    
  383.     {
    
  384.       files: [
    
  385.         '**/__tests__/**/*.js',
    
  386.         'scripts/**/*.js',
    
  387.         'packages/*/npm/**/*.js',
    
  388.         'packages/dom-event-testing-library/**/*.js',
    
  389.         'packages/react-devtools*/**/*.js',
    
  390.         'dangerfile.js',
    
  391.         'fixtures',
    
  392.         'packages/react-dom/src/test-utils/*.js',
    
  393.       ],
    
  394.       rules: {
    
  395.         'react-internal/no-production-logging': OFF,
    
  396.         'react-internal/warning-args': OFF,
    
  397.         'react-internal/safe-string-coercion': [
    
  398.           ERROR,
    
  399.           {isProductionUserAppCode: false},
    
  400.         ],
    
  401.       },
    
  402.     },
    
  403.     {
    
  404.       files: [
    
  405.         'scripts/eslint-rules/*.js',
    
  406.         'packages/eslint-plugin-react-hooks/src/*.js',
    
  407.       ],
    
  408.       plugins: ['eslint-plugin'],
    
  409.       rules: {
    
  410.         'eslint-plugin/prefer-object-rule': ERROR,
    
  411.         'eslint-plugin/require-meta-fixable': [
    
  412.           ERROR,
    
  413.           {catchNoFixerButFixableProperty: true},
    
  414.         ],
    
  415.         'eslint-plugin/require-meta-has-suggestions': ERROR,
    
  416.       },
    
  417.     },
    
  418.     {
    
  419.       files: ['packages/react-native-renderer/**/*.js'],
    
  420.       globals: {
    
  421.         nativeFabricUIManager: 'readonly',
    
  422.       },
    
  423.     },
    
  424.     {
    
  425.       files: ['packages/react-server-dom-webpack/**/*.js'],
    
  426.       globals: {
    
  427.         __webpack_chunk_load__: 'readonly',
    
  428.         __webpack_require__: 'readonly',
    
  429.       },
    
  430.     },
    
  431.     {
    
  432.       files: ['packages/react-server-dom-turbopack/**/*.js'],
    
  433.       globals: {
    
  434.         __turbopack_load__: 'readonly',
    
  435.         __turbopack_require__: 'readonly',
    
  436.       },
    
  437.     },
    
  438.     {
    
  439.       files: ['packages/scheduler/**/*.js'],
    
  440.       globals: {
    
  441.         TaskController: 'readonly',
    
  442.       },
    
  443.     },
    
  444.     {
    
  445.       files: ['packages/react-devtools-extensions/**/*.js'],
    
  446.       globals: {
    
  447.         __IS_CHROME__: 'readonly',
    
  448.         __IS_FIREFOX__: 'readonly',
    
  449.         __IS_EDGE__: 'readonly',
    
  450.       },
    
  451.     },
    
  452.   ],
    
  453. 
    
  454.   env: {
    
  455.     browser: true,
    
  456.     es6: true,
    
  457.     node: true,
    
  458.     jest: true,
    
  459.   },
    
  460. 
    
  461.   globals: {
    
  462.     $Call: 'readonly',
    
  463.     $ElementType: 'readonly',
    
  464.     $Flow$ModuleRef: 'readonly',
    
  465.     $FlowFixMe: 'readonly',
    
  466.     $Keys: 'readonly',
    
  467.     $NonMaybeType: 'readonly',
    
  468.     $PropertyType: 'readonly',
    
  469.     $ReadOnly: 'readonly',
    
  470.     $ReadOnlyArray: 'readonly',
    
  471.     $ArrayBufferView: 'readonly',
    
  472.     $Shape: 'readonly',
    
  473.     ReturnType: 'readonly',
    
  474.     AnimationFrameID: 'readonly',
    
  475.     // For Flow type annotation. Only `BigInt` is valid at runtime.
    
  476.     bigint: 'readonly',
    
  477.     BigInt: 'readonly',
    
  478.     BigInt64Array: 'readonly',
    
  479.     BigUint64Array: 'readonly',
    
  480.     Class: 'readonly',
    
  481.     ClientRect: 'readonly',
    
  482.     CopyInspectedElementPath: 'readonly',
    
  483.     DOMHighResTimeStamp: 'readonly',
    
  484.     EventListener: 'readonly',
    
  485.     Iterable: 'readonly',
    
  486.     Iterator: 'readonly',
    
  487.     JSONValue: 'readonly',
    
  488.     JSResourceReference: 'readonly',
    
  489.     MouseEventHandler: 'readonly',
    
  490.     PropagationPhases: 'readonly',
    
  491.     PropertyDescriptor: 'readonly',
    
  492.     React$AbstractComponent: 'readonly',
    
  493.     React$Component: 'readonly',
    
  494.     React$ComponentType: 'readonly',
    
  495.     React$Config: 'readonly',
    
  496.     React$Context: 'readonly',
    
  497.     React$Element: 'readonly',
    
  498.     React$ElementConfig: 'readonly',
    
  499.     React$ElementProps: 'readonly',
    
  500.     React$ElementRef: 'readonly',
    
  501.     React$ElementType: 'readonly',
    
  502.     React$Key: 'readonly',
    
  503.     React$Node: 'readonly',
    
  504.     React$Portal: 'readonly',
    
  505.     React$Ref: 'readonly',
    
  506.     React$StatelessFunctionalComponent: 'readonly',
    
  507.     ReadableStreamController: 'readonly',
    
  508.     RequestInfo: 'readonly',
    
  509.     RequestOptions: 'readonly',
    
  510.     StoreAsGlobal: 'readonly',
    
  511.     symbol: 'readonly',
    
  512.     SyntheticEvent: 'readonly',
    
  513.     SyntheticMouseEvent: 'readonly',
    
  514.     Thenable: 'readonly',
    
  515.     TimeoutID: 'readonly',
    
  516.     WheelEventHandler: 'readonly',
    
  517.     FinalizationRegistry: 'readonly',
    
  518. 
    
  519.     spyOnDev: 'readonly',
    
  520.     spyOnDevAndProd: 'readonly',
    
  521.     spyOnProd: 'readonly',
    
  522.     __DEV__: 'readonly',
    
  523.     __EXPERIMENTAL__: 'readonly',
    
  524.     __EXTENSION__: 'readonly',
    
  525.     __PROFILE__: 'readonly',
    
  526.     __TEST__: 'readonly',
    
  527.     __UMD__: 'readonly',
    
  528.     __VARIANT__: 'readonly',
    
  529.     __unmockReact: 'readonly',
    
  530.     gate: 'readonly',
    
  531.     trustedTypes: 'readonly',
    
  532.     IS_REACT_ACT_ENVIRONMENT: 'readonly',
    
  533.     AsyncLocalStorage: 'readonly',
    
  534.     globalThis: 'readonly',
    
  535.   },
    
  536. };