diff --git a/.babelrc b/.babelrc deleted file mode 100644 index cda595ba652..00000000000 --- a/.babelrc +++ /dev/null @@ -1,28 +0,0 @@ -{ - "presets": ["react"], - "ignore": ["third_party"], - "plugins": [ - "transform-class-properties", - "syntax-trailing-function-commas", - "transform-object-rest-spread", - "transform-es2015-template-literals", - "transform-es2015-literals", - "transform-es2015-arrow-functions", - "transform-es2015-block-scoped-functions", - ["transform-es2015-classes", { "loose": true }], - "transform-es2015-object-super", - "transform-es2015-shorthand-properties", - "transform-es2015-computed-properties", - "transform-es2015-for-of", - "check-es2015-constants", - ["transform-es2015-spread", { "loose": true }], - "transform-es2015-parameters", - ["transform-es2015-destructuring", { "loose": true }], - ["transform-es2015-block-scoping", { "throwIfClosureRequired": true }], - "transform-es2015-modules-commonjs", - "transform-es3-member-expression-literals", - "transform-es3-property-literals", - "./scripts/babel/transform-object-assign-require", - "transform-react-jsx-source" - ] -} diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json new file mode 100644 index 00000000000..2164efec0c8 --- /dev/null +++ b/.codesandbox/ci.json @@ -0,0 +1,13 @@ +{ + "packages": ["packages/react", "packages/react-dom", "packages/react-server-dom-webpack", "packages/scheduler"], + "buildCommand": "download-build-in-codesandbox-ci", + "node": "20", + "publishDirectory": { + "react": "build/oss-experimental/react", + "react-dom": "build/oss-experimental/react-dom", + "react-server-dom-webpack": "build/oss-experimental/react-server-dom-webpack", + "scheduler": "build/oss-experimental/scheduler" + }, + "sandboxes": ["new"], + "silent": true +} diff --git a/.editorconfig b/.editorconfig index d7638731d07..48d2b3d27e8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# http://editorconfig.org +# https://editorconfig.org root = true [*] @@ -8,11 +8,9 @@ indent_size = 2 indent_style = space insert_final_newline = true max_line_length = 80 -trim_trailing_whitespace = true [*.md] max_line_length = 0 -trim_trailing_whitespace = false [COMMIT_EDITMSG] max_line_length = 0 diff --git a/.eslintignore b/.eslintignore index 22567165338..fd9cc6bdca2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,19 +1,33 @@ -# We can probably lint these later but not important at this point -src/renderers/art -src/__mocks__/vendor -# But not in docs/_js/examples/* -docs/_js/*.js -docs/js/ -docs/_site/ -# gems -docs/vendor/bundle/ -# This should be more like examples/**/thirdparty/** but -# we should fix https://github.com/facebook/esprima/pull/85 first -examples/ -fixtures/ -# Ignore built files. +# Third party +**/node_modules + +# Not written by hand +packages/react-art/npm/lib + +# Build products build/ coverage/ -scripts/bench/bench-*.js -vendor/* -**/node_modules +fixtures/ +scripts/bench/benchmarks/**/*.js + +# React repository clone +scripts/bench/remote-repo/ + +# Compiler uses its own lint setup +compiler/ + +packages/react-devtools-core/dist +packages/react-devtools-extensions/chrome/build +packages/react-devtools-extensions/firefox/build +packages/react-devtools-extensions/shared/build +packages/react-devtools-extensions/src/ErrorTesterCompiled.js +packages/react-devtools-fusebox/dist +packages/react-devtools-inline/dist +packages/react-devtools-shared/src/hooks/__tests__/__source__/__compiled__/ +packages/react-devtools-shared/src/hooks/__tests__/__source__/__untransformed__/ +packages/react-devtools-shell/dist +packages/react-devtools-timeline/dist +packages/react-devtools-timeline/static + +# Imported third-party Flow types +flow-typed/ diff --git a/.eslintrc.js b/.eslintrc.js index 71cac5b6d72..dec7cd8f304 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,42 +1,275 @@ 'use strict'; +const { + es5Paths, + esNextPaths, +} = require('./scripts/shared/pathsByLanguageVersion'); + +const restrictedGlobals = require('confusing-browser-globals'); + const OFF = 0; -// const WARNING = 1; +const WARNING = 1; const ERROR = 2; module.exports = { - extends: 'fbjs', + extends: ['prettier', 'plugin:jest/recommended'], + + // Stop ESLint from looking for a configuration file in parent folders + root: true, + + reportUnusedDisableDirectives: true, plugins: [ + 'babel', + 'ft-flow', + 'jest', + 'es', + 'no-for-of-loops', + 'no-function-declare-after-return', 'react', 'react-internal', ], + parser: 'hermes-eslint', + parserOptions: { + ecmaVersion: 9, + sourceType: 'script', + }, + // We're stricter than the default config, mostly. We'll override a few rules // and then enable some React specific ones. rules: { + 'ft-flow/array-style-complex-type': [OFF, 'verbose'], + 'ft-flow/array-style-simple-type': [OFF, 'verbose'], // TODO should be WARNING + 'ft-flow/boolean-style': ERROR, + 'ft-flow/no-dupe-keys': ERROR, + 'ft-flow/no-primitive-constructor-types': ERROR, + 'ft-flow/no-types-missing-file-annotation': OFF, // TODO should be ERROR + 'ft-flow/no-unused-expressions': ERROR, + // 'ft-flow/no-weak-types': WARNING, + // 'ft-flow/require-valid-file-annotation': ERROR, + 'es/no-optional-chaining': ERROR, + 'no-cond-assign': OFF, + 'no-constant-condition': OFF, + 'no-control-regex': OFF, + 'no-debugger': ERROR, + 'no-dupe-args': ERROR, + 'no-dupe-keys': ERROR, + 'no-duplicate-case': WARNING, + 'no-empty-character-class': WARNING, + 'no-empty': OFF, + 'no-ex-assign': WARNING, + 'no-extra-boolean-cast': WARNING, + 'no-func-assign': ERROR, + 'no-invalid-regexp': WARNING, + 'no-irregular-whitespace': WARNING, + 'no-negated-in-lhs': ERROR, + 'no-obj-calls': ERROR, + 'no-regex-spaces': WARNING, + 'no-sparse-arrays': ERROR, + 'no-unreachable': ERROR, + 'use-isnan': ERROR, + 'valid-jsdoc': OFF, + 'block-scoped-var': OFF, + complexity: OFF, + 'default-case': OFF, + 'guard-for-in': OFF, + 'no-alert': OFF, + 'no-caller': ERROR, + 'no-case-declarations': OFF, + 'no-div-regex': OFF, + 'no-else-return': OFF, + 'no-empty-pattern': WARNING, + 'no-eq-null': OFF, + 'no-eval': ERROR, + 'no-extend-native': WARNING, + 'no-extra-bind': WARNING, + 'no-fallthrough': WARNING, + 'no-implicit-coercion': OFF, + 'no-implied-eval': ERROR, + 'no-invalid-this': OFF, + 'no-iterator': OFF, + 'no-labels': [ERROR, {allowLoop: true, allowSwitch: true}], + 'no-lone-blocks': WARNING, + 'no-loop-func': OFF, + 'no-magic-numbers': OFF, + 'no-multi-str': ERROR, + 'no-native-reassign': [ERROR, {exceptions: ['Map', 'Set']}], + 'no-new-func': ERROR, + 'no-new': WARNING, + 'no-new-wrappers': WARNING, + 'no-octal-escape': WARNING, + 'no-octal': WARNING, + 'no-param-reassign': OFF, + 'no-process-env': OFF, + 'no-proto': ERROR, + 'no-redeclare': OFF, // TODO should be WARNING? + 'no-return-assign': OFF, + 'no-script-url': ERROR, + 'no-self-compare': WARNING, + 'no-sequences': WARNING, + 'no-throw-literal': ERROR, + 'no-useless-call': WARNING, + 'no-void': OFF, + 'no-warning-comments': OFF, + 'no-with': OFF, + radix: WARNING, + 'vars-on-top': OFF, + yoda: OFF, + 'init-declarations': OFF, + 'no-catch-shadow': ERROR, + 'no-delete-var': ERROR, + 'no-label-var': WARNING, + 'no-shadow-restricted-names': WARNING, + 'no-undef-init': OFF, + 'no-undef': ERROR, + 'no-undefined': OFF, + 'callback-return': OFF, + 'global-require': OFF, + 'handle-callback-err': OFF, + 'no-mixed-requires': OFF, + 'no-new-require': OFF, + 'no-path-concat': OFF, + 'no-process-exit': OFF, + 'no-restricted-modules': OFF, + 'no-sync': OFF, + camelcase: [OFF, {properties: 'always'}], + 'consistent-this': [OFF, 'self'], + 'func-names': OFF, + 'func-style': [OFF, 'declaration'], + 'id-length': OFF, + 'id-match': OFF, + 'max-depth': OFF, + 'max-nested-callbacks': OFF, + 'max-params': OFF, + 'max-statements': OFF, + 'new-cap': OFF, + 'newline-after-var': OFF, + 'no-array-constructor': ERROR, + 'no-continue': OFF, + 'no-inline-comments': OFF, + 'no-lonely-if': OFF, + 'no-negated-condition': OFF, + 'no-nested-ternary': OFF, + 'no-new-object': WARNING, + 'no-plusplus': OFF, + 'no-ternary': OFF, + 'no-underscore-dangle': OFF, + 'no-unneeded-ternary': WARNING, + 'one-var': [WARNING, {initialized: 'never'}], + 'operator-assignment': [WARNING, 'always'], + 'require-jsdoc': OFF, + 'sort-vars': OFF, + 'spaced-comment': [ + OFF, + 'always', + {exceptions: ['jshint', 'jslint', 'eslint', 'global']}, + ], + 'constructor-super': ERROR, + 'no-class-assign': WARNING, + 'no-const-assign': ERROR, + 'no-dupe-class-members': ERROR, + 'no-this-before-super': ERROR, + 'object-shorthand': OFF, + 'prefer-const': OFF, + 'prefer-spread': OFF, + 'prefer-reflect': OFF, + 'prefer-template': OFF, + 'require-yield': OFF, + 'babel/generator-star-spacing': OFF, + 'babel/new-cap': OFF, + 'babel/array-bracket-spacing': OFF, + 'babel/object-curly-spacing': OFF, + 'babel/object-shorthand': OFF, + 'babel/arrow-parens': OFF, + 'babel/no-await-in-loop': OFF, + 'babel/flow-object-type': OFF, + 'react/display-name': OFF, + 'react/forbid-prop-types': OFF, + 'react/jsx-closing-bracket-location': OFF, + 'react/jsx-curly-spacing': OFF, + 'react/jsx-equals-spacing': WARNING, + 'react/jsx-filename-extension': OFF, + 'react/jsx-first-prop-new-line': OFF, + 'react/jsx-handler-names': OFF, + 'react/jsx-indent': OFF, + 'react/jsx-indent-props': OFF, + 'react/jsx-key': OFF, + 'react/jsx-max-props-per-line': OFF, + 'react/jsx-no-bind': OFF, + 'react/jsx-no-duplicate-props': ERROR, + 'react/jsx-no-literals': OFF, + 'react/jsx-no-target-blank': OFF, + 'react/jsx-pascal-case': OFF, + 'react/jsx-sort-props': OFF, + 'react/jsx-uses-vars': ERROR, + 'react/no-comment-textnodes': OFF, + 'react/no-danger': OFF, + 'react/no-deprecated': OFF, + 'react/no-did-mount-set-state': OFF, + 'react/no-did-update-set-state': OFF, + 'react/no-direct-mutation-state': OFF, + 'react/no-multi-comp': OFF, + 'react/no-render-return-value': OFF, + 'react/no-set-state': OFF, + 'react/no-string-refs': OFF, + 'react/no-unknown-property': OFF, + 'react/prefer-es6-class': OFF, + 'react/prefer-stateless-function': OFF, + 'react/prop-types': OFF, + 'react/require-extension': OFF, + 'react/require-optimization': OFF, + 'react/require-render-return': OFF, + 'react/sort-comp': OFF, + 'react/sort-prop-types': OFF, + 'accessor-pairs': OFF, 'brace-style': [ERROR, '1tbs'], - 'comma-dangle': [ERROR, 'always-multiline'], 'consistent-return': OFF, 'dot-location': [ERROR, 'property'], - 'dot-notation': ERROR, + // We use console['error']() as a signal to not transform it: + 'dot-notation': [ERROR, {allowPattern: '^(error|warn)$'}], 'eol-last': ERROR, - 'eqeqeq': [ERROR, 'allow-null'], - 'indent': OFF, + eqeqeq: [ERROR, 'allow-null'], + indent: OFF, 'jsx-quotes': [ERROR, 'prefer-double'], 'keyword-spacing': [ERROR, {after: true, before: true}], 'no-bitwise': OFF, + 'no-console': OFF, 'no-inner-declarations': [ERROR, 'functions'], 'no-multi-spaces': ERROR, - 'no-restricted-syntax': [ERROR, 'WithStatement'], + 'no-restricted-globals': [ERROR].concat(restrictedGlobals), + 'no-restricted-syntax': [ + ERROR, + 'WithStatement', + { + selector: 'MemberExpression[property.name=/^(?:substring|substr)$/]', + message: 'Prefer string.slice() over .substring() and .substr().', + }, + ], 'no-shadow': ERROR, - 'no-unused-expressions': ERROR, - 'no-unused-vars': [ERROR, {args: 'none'}], + 'no-unused-vars': [ERROR, {args: 'none', ignoreRestSiblings: true}], + 'no-use-before-define': OFF, 'no-useless-concat': OFF, - 'quotes': [ERROR, 'single', {avoidEscape: true, allowTemplateLiterals: true }], + quotes: [ERROR, 'single', {avoidEscape: true, allowTemplateLiterals: true}], 'space-before-blocks': ERROR, 'space-before-function-paren': OFF, + 'valid-typeof': [ERROR, {requireStringLiterals: true}], + // Flow fails with non-string literal keys + 'no-useless-computed-key': OFF, + + // We apply these settings to files that should run on Node. + // They can't use JSX or ES6 modules, and must be in strict mode. + // They can, however, use other ES6 features. + // (Note these rules are overridden later for source files.) + 'no-var': ERROR, + strict: ERROR, + + // Enforced by Prettier + // TODO: Prettier doesn't handle long strings or long comments. Not a big + // deal. But I turned it off because loading the plugin causes some obscure + // syntax error and it didn't seem worth investigating. + 'max-len': OFF, // React & JSX // Our transforms set this automatically @@ -51,15 +284,374 @@ module.exports = { 'react/react-in-jsx-scope': ERROR, 'react/self-closing-comp': ERROR, // We don't care to do this - 'react/jsx-wrap-multilines': [ERROR, {declaration: false, assignment: false}], + 'react/jsx-wrap-multilines': [ + ERROR, + {declaration: false, assignment: false}, + ], + + // Prevent for...of loops because they require a Symbol polyfill. + // You can disable this rule for code that isn't shipped (e.g. build scripts and tests). + 'no-for-of-loops/no-for-of-loops': ERROR, + + // Prevent function declarations after return statements + 'no-function-declare-after-return/no-function-declare-after-return': ERROR, // CUSTOM RULES // the second argument of warning/invariant should be a literal string - 'react-internal/warning-and-invariant-args': ERROR, 'react-internal/no-primitive-constructors': ERROR, + 'react-internal/safe-string-coercion': [ + ERROR, + {isProductionUserAppCode: true}, + ], + 'react-internal/warning-args': ERROR, + 'react-internal/no-production-logging': ERROR, + }, + + overrides: [ + { + // By default, anything error message that appears the packages directory + // must have a corresponding error code. The exceptions are defined + // in the next override entry. + files: ['packages/**/*.js'], + rules: { + 'react-internal/prod-error-codes': ERROR, + }, + }, + { + // These are files where it's OK to have unminified error messages. These + // are environments where bundle size isn't a concern, like tests + // or Node. + files: [ + 'packages/react-dom/src/test-utils/**/*.js', + 'packages/react-devtools-shared/**/*.js', + 'packages/react-noop-renderer/**/*.js', + 'packages/react-refresh/**/*.js', + 'packages/react-server-dom-esm/**/*.js', + 'packages/react-server-dom-webpack/**/*.js', + 'packages/react-server-dom-turbopack/**/*.js', + 'packages/react-server-dom-parcel/**/*.js', + 'packages/react-server-dom-fb/**/*.js', + 'packages/react-server-dom-unbundled/**/*.js', + 'packages/react-test-renderer/**/*.js', + 'packages/react-debug-tools/**/*.js', + 'packages/react-devtools-extensions/**/*.js', + 'packages/react-devtools-timeline/**/*.js', + 'packages/react-native-renderer/**/*.js', + 'packages/eslint-plugin-react-hooks/**/*.js', + 'packages/jest-react/**/*.js', + 'packages/internal-test-utils/**/*.js', + 'packages/**/__tests__/*.js', + 'packages/**/npm/*.js', + ], + rules: { + 'react-internal/prod-error-codes': OFF, + }, + }, + { + // We apply these settings to files that we ship through npm. + // They must be ES5. + files: es5Paths, + parser: 'espree', + parserOptions: { + ecmaVersion: 5, + sourceType: 'script', + }, + rules: { + 'no-var': OFF, + strict: ERROR, + }, + }, + { + // We apply these settings to the source files that get compiled. + // They can use all features including JSX (but shouldn't use `var`). + files: esNextPaths, + parser: 'hermes-eslint', + parserOptions: { + ecmaVersion: 8, + sourceType: 'module', + }, + rules: { + 'no-var': ERROR, + 'prefer-const': ERROR, + strict: OFF, + }, + }, + { + files: ['**/__tests__/*.js'], + rules: { + // https://github.com/jest-community/eslint-plugin-jest + // Meh, who cares. + 'jest/consistent-test-it': OFF, + // Meh, we have a lot of these, who cares. + 'jest/no-alias-methods': OFF, + // We do conditions based on feature flags. + 'jest/no-conditional-expect': OFF, + // We have our own assertion helpers. + 'jest/expect-expect': OFF, + // Lame rule that fires in itRender helpers or in render methods. + 'jest/no-standalone-expect': OFF, + }, + }, + { + // Rules specific to test setup helper files. + files: [ + '**/setupTests.js', + '**/setupEnv.js', + '**/jest/TestFlags.js', + '**/dom-event-testing-library/testHelpers.js', + '**/utils/ReactDOMServerIntegrationTestUtils.js', + '**/babel/transform-react-version-pragma.js', + '**/babel/transform-test-gate-pragma.js', + ], + rules: { + // Some helpers intentionally focus tests. + 'jest/no-focused-tests': OFF, + // Test fn helpers don't use static text names. + 'jest/valid-title': OFF, + // We have our own assertion helpers. + 'jest/expect-expect': OFF, + // Some helpers intentionally disable tests. + 'jest/no-disabled-tests': OFF, + // Helpers export text function helpers. + 'jest/no-export': OFF, + // The examples in comments trigger false errors. + 'jest/no-commented-out-tests': OFF, + }, + }, + { + files: ['**/jest/TestFlags.js'], + rules: { + // The examples in comments trigger false errors. + 'jest/no-commented-out-tests': OFF, + }, + }, + { + files: [ + '**/__tests__/**/*.js', + 'scripts/**/*.js', + 'packages/*/npm/**/*.js', + 'packages/dom-event-testing-library/**/*.js', + 'packages/react-devtools*/**/*.js', + 'dangerfile.js', + 'fixtures', + 'packages/react-dom/src/test-utils/*.js', + ], + rules: { + 'es/no-optional-chaining': OFF, + 'react-internal/no-production-logging': OFF, + 'react-internal/warning-args': OFF, + 'react-internal/safe-string-coercion': [ + ERROR, + {isProductionUserAppCode: false}, + ], + }, + }, + { + files: ['scripts/eslint-rules/*.js'], + plugins: ['eslint-plugin'], + rules: { + 'eslint-plugin/prefer-object-rule': ERROR, + 'eslint-plugin/require-meta-fixable': [ + ERROR, + {catchNoFixerButFixableProperty: true}, + ], + 'eslint-plugin/require-meta-has-suggestions': ERROR, + }, + }, + { + files: ['packages/react-native-renderer/**/*.js'], + globals: { + nativeFabricUIManager: 'readonly', + RN$enableMicrotasksInReact: 'readonly', + }, + }, + { + files: ['packages/react-server-dom-webpack/**/*.js'], + globals: { + __webpack_chunk_load__: 'readonly', + __webpack_get_script_filename__: 'readonly', + __webpack_require__: 'readonly', + }, + }, + { + files: ['packages/react-server-dom-turbopack/**/*.js'], + globals: { + __turbopack_load_by_url__: 'readonly', + __turbopack_require__: 'readonly', + }, + }, + { + files: ['packages/react-server-dom-parcel/**/*.js'], + globals: { + parcelRequire: 'readonly', + }, + }, + { + files: ['packages/scheduler/**/*.js'], + globals: { + TaskController: 'readonly', + }, + }, + { + files: [ + 'packages/react-devtools-extensions/**/*.js', + 'packages/react-devtools-shared/src/devtools/views/**/*.js', + 'packages/react-devtools-shared/src/hook.js', + 'packages/react-devtools-shared/src/backend/console.js', + 'packages/react-devtools-shared/src/backend/fiber/renderer.js', + 'packages/react-devtools-shared/src/backend/shared/DevToolsComponentStackFrame.js', + 'packages/react-devtools-shared/src/frontend/utils/withPermissionsCheck.js', + ], + globals: { + __IS_CHROME__: 'readonly', + __IS_FIREFOX__: 'readonly', + __IS_EDGE__: 'readonly', + __IS_NATIVE__: 'readonly', + __IS_INTERNAL_MCP_BUILD__: 'readonly', + __IS_INTERNAL_VERSION__: 'readonly', + chrome: 'readonly', + }, + }, + { + files: ['packages/react-devtools-shared/**/*.js'], + globals: { + __IS_INTERNAL_VERSION__: 'readonly', + }, + }, + { + files: ['packages/react-devtools-*/**/*.js'], + excludedFiles: '**/__tests__/**/*.js', + plugins: ['eslint-plugin-react-hooks-published'], + rules: { + 'react-hooks-published/rules-of-hooks': ERROR, + }, + }, + { + files: ['packages/eslint-plugin-react-hooks/src/**/*'], + extends: ['plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'eslint-plugin'], + rules: { + '@typescript-eslint/no-explicit-any': OFF, + '@typescript-eslint/no-non-null-assertion': OFF, + '@typescript-eslint/array-type': [ERROR, {default: 'generic'}], + + 'es/no-optional-chaining': OFF, + + 'eslint-plugin/prefer-object-rule': ERROR, + 'eslint-plugin/require-meta-fixable': [ + ERROR, + {catchNoFixerButFixableProperty: true}, + ], + 'eslint-plugin/require-meta-has-suggestions': ERROR, + }, + }, + ], + + env: { + browser: true, + es6: true, + node: true, + jest: true, }, globals: { - expectDev: true, + $Flow$ModuleRef: 'readonly', + $FlowFixMe: 'readonly', + $Keys: 'readonly', + $NonMaybeType: 'readonly', + $ReadOnly: 'readonly', + $ReadOnlyArray: 'readonly', + $ArrayBufferView: 'readonly', + $Shape: 'readonly', + CallSite: 'readonly', + ConsoleTask: 'readonly', // TOOD: Figure out what the official name of this will be. + ReturnType: 'readonly', + AnimationFrameID: 'readonly', + WeakRef: 'readonly', + // For Flow type annotation. Only `BigInt` is valid at runtime. + bigint: 'readonly', + BigInt: 'readonly', + BigInt64Array: 'readonly', + BigUint64Array: 'readonly', + CacheType: 'readonly', + Class: 'readonly', + ClientRect: 'readonly', + CopyInspectedElementPath: 'readonly', + DOMHighResTimeStamp: 'readonly', + EventListener: 'readonly', + Iterable: 'readonly', + AsyncIterable: 'readonly', + $AsyncIterable: 'readonly', + $AsyncIterator: 'readonly', + Iterator: 'readonly', + AsyncIterator: 'readonly', + IntervalID: 'readonly', + IteratorResult: 'readonly', + JSONValue: 'readonly', + JSResourceReference: 'readonly', + mixin$Animatable: 'readonly', + MouseEventHandler: 'readonly', + NavigateEvent: 'readonly', + PerformanceMeasureOptions: 'readonly', + PropagationPhases: 'readonly', + PropertyDescriptor: 'readonly', + PropertyDescriptorMap: 'readonly', + Proxy$traps: 'readonly', + React$Component: 'readonly', + React$Config: 'readonly', + React$Context: 'readonly', + React$Element: 'readonly', + React$ElementConfig: 'readonly', + React$ElementProps: 'readonly', + React$ElementRef: 'readonly', + React$ElementType: 'readonly', + React$Key: 'readonly', + React$Node: 'readonly', + React$Portal: 'readonly', + React$Ref: 'readonly', + React$RefSetter: 'readonly', + ReadableStreamController: 'readonly', + ReadableStreamReader: 'readonly', + RequestInfo: 'readonly', + RequestOptions: 'readonly', + StoreAsGlobal: 'readonly', + symbol: 'readonly', + SyntheticEvent: 'readonly', + SyntheticMouseEvent: 'readonly', + SyntheticPointerEvent: 'readonly', + Thenable: 'readonly', + TimeoutID: 'readonly', + WheelEventHandler: 'readonly', + FinalizationRegistry: 'readonly', + Exclude: 'readonly', + Omit: 'readonly', + Keyframe: 'readonly', + PropertyIndexedKeyframes: 'readonly', + KeyframeAnimationOptions: 'readonly', + GetAnimationsOptions: 'readonly', + ScrollTimeline: 'readonly', + EventListenerOptionsOrUseCapture: 'readonly', + FocusOptions: 'readonly', + OptionalEffectTiming: 'readonly', + + __REACT_ROOT_PATH_TEST__: 'readonly', + spyOnDev: 'readonly', + spyOnDevAndProd: 'readonly', + spyOnProd: 'readonly', + __DEV__: 'readonly', + __EXPERIMENTAL__: 'readonly', + __EXTENSION__: 'readonly', + __PROFILE__: 'readonly', + __TEST__: 'readonly', + __VARIANT__: 'readonly', + __unmockReact: 'readonly', + gate: 'readonly', + trustedTypes: 'readonly', + IS_REACT_ACT_ENVIRONMENT: 'readonly', + AsyncLocalStorage: 'readonly', + async_hooks: 'readonly', + globalThis: 'readonly', + navigation: 'readonly', }, }; diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 4c856010327..00000000000 --- a/.flowconfig +++ /dev/null @@ -1,39 +0,0 @@ -[ignore] - -/examples/.* -/fixtures/.* -/build/.* -/.*/node_modules/y18n/.* -/.*/__mocks__/.* -/.*/__tests__/.* - -# Ignore Docs -/docs/.* -/.*/docs/.* - -[include] - -[libs] -./node_modules/fbjs/flow/lib/dev.js -./flow - -[options] -module.system=haste - -esproposal.class_static_fields=enable -esproposal.class_instance_fields=enable - -munge_underscores=false - -suppress_type=$FlowIssue -suppress_type=$FlowFixMe -suppress_type=$FixMe -suppress_type=$FlowExpectedError - -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-3]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*www[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-3]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*www[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy -suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError - -[version] -^0.41.0 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000000..2c19b248459 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +c998bb1ed4b3285398c9c7797135d3f060243c6a +fd2b3e13d330a4559f5aa21462e1cb2cbbcf144b diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 31ac4312535..00000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,9 +0,0 @@ -**Do you want to request a *feature* or report a *bug*?** - -**What is the current behavior?** - -**If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem via https://jsfiddle.net or similar (template: https://jsfiddle.net/84v837e9/).** - -**What is the expected behavior?** - -**Which versions of React, and which browser / OS are affected by this issue? Did this work in previous versions of React?** diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..e561f9d2615 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: "🐛 Bug Report" +about: Report a reproducible bug or regression. +title: 'Bug: ' +labels: 'Status: Unconfirmed' + +--- + + + +React version: + +## Steps To Reproduce + +1. +2. + + + +Link to code example: + + + +## The current behavior + + +## The expected behavior diff --git a/.github/ISSUE_TEMPLATE/compiler_bug_report.yml b/.github/ISSUE_TEMPLATE/compiler_bug_report.yml new file mode 100644 index 00000000000..a2c0e3d7aa3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/compiler_bug_report.yml @@ -0,0 +1,64 @@ +name: "⚛️ ✨ Compiler bug report" +description: "Report a problem with React Compiler. Please provide enough information that we can reproduce the problem." +title: "[Compiler Bug]: " +labels: ["Component: Optimizing Compiler", "Type: Bug", "Status: Unconfirmed"] +body: +- type: checkboxes + attributes: + label: What kind of issue is this? + description: | + Please indicate if this issue affects the following tools provided by React Compiler. + options: + - label: React Compiler core (the JS output is incorrect, or your app works incorrectly after optimization) + - label: babel-plugin-react-compiler (build issue installing or using the Babel plugin) + - label: eslint-plugin-react-hooks (build issue installing or using the eslint plugin) + - label: react-compiler-healthcheck (build issue installing or using the healthcheck script) +- type: input + attributes: + label: Link to repro + description: | + Please provide a repro by either sharing a [Playground link](https://playground.react.dev), or a public GitHub repo so the React team can reproduce the error being reported. Please do not share localhost links! + placeholder: | + e.g. public GitHub repo, or Playground link + validations: + required: true +- type: textarea + attributes: + label: Repro steps + description: | + What were you doing when the bug happened? Detailed information helps maintainers reproduce and fix bugs. + + Issues filed without repro steps will be closed. + placeholder: | + Example bug report: + 1. Log in with username/password + 2. Click "Messages" on the left menu + 3. Open any message in the list + validations: + required: true +- type: dropdown + attributes: + label: How often does this bug happen? + description: | + Following the repro steps above, how easily are you able to reproduce this bug? + options: + - Every time + - Often + - Sometimes + - Only once + validations: + required: true +- type: input + attributes: + label: What version of React are you using? + description: | + Please provide your React version in the app where this issue occurred. + validations: + required: true +- type: input + attributes: + label: What version of React Compiler are you using? + description: | + Please provide the exact React Compiler version in the app where this issue occurred. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000000..2b1404175e6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: 📃 Documentation Issue + url: https://github.com/reactjs/react.dev/issues/new/choose + about: This issue tracker is not for documentation issues. Please file documentation issues here. + - name: 🤔 Questions and Help + url: https://reactjs.org/community/support.html + about: This issue tracker is not for support questions. Please refer to the React community's help and discussion forums. diff --git a/.github/ISSUE_TEMPLATE/devtools_bug_report.yml b/.github/ISSUE_TEMPLATE/devtools_bug_report.yml new file mode 100644 index 00000000000..f9020976468 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/devtools_bug_report.yml @@ -0,0 +1,81 @@ +name: "⚛️ 🛠 DevTools bug report" +description: "Report a problem with React DevTools. Please provide enough information that we can reproduce the problem." +title: "[DevTools Bug]: " +labels: ["Component: Developer Tools", "Type: Bug", "Status: Unconfirmed"] +body: +- type: input + attributes: + label: Website or app + description: | + Which website or app were you using when the bug happened? + + This should be a public URL, GitHub repo, or Code Sandbox app so the React team can reproduce the error being reported. (Please no localhost URLs.) + placeholder: | + e.g. website URL, public GitHub repo, or Code Sandbox app + validations: + required: true +- type: textarea + attributes: + label: Repro steps + description: | + What were you doing on the website or app when the bug happened? Detailed information helps maintainers reproduce and fix bugs. + + Issues filed without repro steps will be closed. + placeholder: | + Example bug report: + 1. Log in with username/password + 2. Click "Messages" on the left menu + 3. Open any message in the list + validations: + required: true +- type: dropdown + attributes: + label: How often does this bug happen? + description: | + Following the repro steps above, how easily are you able to reproduce this bug? + options: + - Every time + - Often + - Sometimes + - Only once + validations: + required: true +- type: input + id: automated_package + attributes: + label: DevTools package (automated) + description: | + Please do not edit this field. +- type: input + id: automated_version + attributes: + label: DevTools version (automated) + description: | + Please do not edit this field. +- type: input + id: automated_error_message + attributes: + label: Error message (automated) + description: | + Please do not edit this field. +- type: textarea + id: automated_call_stack + attributes: + label: Error call stack (automated) + description: | + Please do not edit this field. + render: text +- type: textarea + id: automated_component_stack + attributes: + label: Error component stack (automated) + description: | + Please do not edit this field. + render: text +- type: textarea + id: automated_github_query_string + attributes: + label: GitHub query string (automated) + description: | + Please do not edit this field. + render: text diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5de9012e125..23fbc65ab57 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,11 +1,33 @@ -**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 `master`. -2. If you've added code that should be tested, add tests! -3. If you've changed APIs, update the documentation. -4. Ensure the test suite passes (`npm test`). -5. Make sure your code lints (`npm run lint`). -6. Format your code with [prettier](https://github.com/prettier/prettier) (`npm run prettier`). -7. Run the [Flow](https://flowtype.org/) typechecks (`npm run flow`). -8. If you added or removed any tests, run `./scripts/fiber/record-tests` before submitting the pull request, and commit the resulting changes. -9. If you haven't already, complete the CLA. + + +## Summary + + + +## How did you test this change? + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..11800ad7575 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directories: + - "/fixtures/*" + schedule: + interval: "monthly" + open-pull-requests-limit: 0 + ignore: + - dependency-name: "*" diff --git a/.github/workflows/compiler_discord_notify.yml b/.github/workflows/compiler_discord_notify.yml new file mode 100644 index 00000000000..5a57cf6a32c --- /dev/null +++ b/.github/workflows/compiler_discord_notify.yml @@ -0,0 +1,49 @@ +name: (Compiler) Discord Notify + +on: + pull_request_target: + types: [opened, ready_for_review] + paths: + - compiler/** + - .github/workflows/compiler_**.yml + +permissions: {} + +jobs: + check_access: + if: ${{ github.event.pull_request.draft == false }} + runs-on: ubuntu-latest + outputs: + is_member_or_collaborator: ${{ steps.check_is_member_or_collaborator.outputs.is_member_or_collaborator }} + steps: + - run: echo ${{ github.event.pull_request.author_association }} + - name: Check is member or collaborator + id: check_is_member_or_collaborator + if: ${{ github.event.pull_request.author_association == 'MEMBER' || github.event.pull_request.author_association == 'COLLABORATOR' }} + run: echo "is_member_or_collaborator=true" >> "$GITHUB_OUTPUT" + + check_maintainer: + if: ${{ needs.check_access.outputs.is_member_or_collaborator == 'true' || needs.check_access.outputs.is_member_or_collaborator == true }} + needs: [check_access] + uses: facebook/react/.github/workflows/shared_check_maintainer.yml@main + permissions: + # Used by check_maintainer + contents: read + with: + actor: ${{ github.event.pull_request.user.login }} + + notify: + if: ${{ needs.check_maintainer.outputs.is_core_team == 'true' }} + needs: check_maintainer + runs-on: ubuntu-latest + steps: + - name: Discord Webhook Action + uses: tsickert/discord-webhook@86dc739f3f165f16dadc5666051c367efa1692f4 + with: + webhook-url: ${{ secrets.COMPILER_DISCORD_WEBHOOK_URL }} + embed-author-name: ${{ github.event.pull_request.user.login }} + embed-author-url: ${{ github.event.pull_request.user.html_url }} + embed-author-icon-url: ${{ github.event.pull_request.user.avatar_url }} + embed-title: '#${{ github.event.number }} (+${{github.event.pull_request.additions}} -${{github.event.pull_request.deletions}}): ${{ github.event.pull_request.title }}' + embed-description: ${{ github.event.pull_request.body }} + embed-url: ${{ github.event.pull_request.html_url }} diff --git a/.github/workflows/compiler_playground.yml b/.github/workflows/compiler_playground.yml new file mode 100644 index 00000000000..a19e87e25e7 --- /dev/null +++ b/.github/workflows/compiler_playground.yml @@ -0,0 +1,69 @@ +name: (Compiler) Playground + +on: + push: + branches: [main] + pull_request: + paths: + - compiler/** + - .github/workflows/compiler_playground.yml + +permissions: {} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +defaults: + run: + working-directory: compiler/apps/playground + +jobs: + playground: + name: Test playground + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: compiler/**/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: compiler-and-playground-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('compiler/**/yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + working-directory: compiler + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Check Playwright version + id: playwright_version + run: echo "playwright_version=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//' | head -1)" >> "$GITHUB_OUTPUT" + - name: Cache Playwright Browsers for version ${{ steps.playwright_version.outputs.playwright_version }} + id: cache_playwright_browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-v6-${{ runner.arch }}-${{ runner.os }}-${{ steps.playwright_version.outputs.playwright_version }} + - run: npx playwright install --with-deps chromium + if: steps.cache_playwright_browsers.outputs.cache-hit != 'true' + - run: CI=true yarn test + - run: ls -R test-results + if: '!cancelled()' + - name: Archive test results + if: '!cancelled()' + uses: actions/upload-artifact@v4 + with: + name: test-results + path: compiler/apps/playground/test-results + if-no-files-found: ignore diff --git a/.github/workflows/compiler_prereleases.yml b/.github/workflows/compiler_prereleases.yml new file mode 100644 index 00000000000..76cd3310b1a --- /dev/null +++ b/.github/workflows/compiler_prereleases.yml @@ -0,0 +1,70 @@ +name: (Compiler) Publish Prereleases + +on: + workflow_call: + inputs: + commit_sha: + required: true + default: '' + type: string + release_channel: + required: true + type: string + dist_tag: + required: true + type: string + version_name: + required: true + type: string + tag_version: + required: false + type: string + dry_run: + required: false + type: boolean + secrets: + NPM_TOKEN: + required: true + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + +defaults: + run: + working-directory: compiler + +jobs: + publish_prerelease: + name: Publish prelease (${{ inputs.release_channel }}) ${{ inputs.commit_sha }} @${{ inputs.dist_tag }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: compiler-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('compiler/yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - if: inputs.dry_run == true + name: Publish packages to npm (dry run) + run: | + cp ./scripts/release/ci-npmrc ~/.npmrc + scripts/release/publish.js --frfr --debug --ci --versionName=${{ inputs.version_name }} --tag=${{ inputs.dist_tag }} ${{ inputs.tag_version && format('--tagVersion={0}', inputs.tag_version) || '' }} + - if: inputs.dry_run != true + name: Publish packages to npm + run: | + cp ./scripts/release/ci-npmrc ~/.npmrc + scripts/release/publish.js --frfr --ci --versionName=${{ inputs.version_name }} --tag=${{ inputs.dist_tag }} ${{ inputs.tag_version && format('--tagVersion={0}', inputs.tag_version) || '' }} diff --git a/.github/workflows/compiler_prereleases_manual.yml b/.github/workflows/compiler_prereleases_manual.yml new file mode 100644 index 00000000000..c4a7a16aca3 --- /dev/null +++ b/.github/workflows/compiler_prereleases_manual.yml @@ -0,0 +1,41 @@ +name: (Compiler) Publish Prereleases Manual + +on: + workflow_dispatch: + inputs: + prerelease_commit_sha: + required: false + release_channel: + required: true + type: string + dist_tag: + required: true + type: string + version_name: + required: true + type: string + tag_version: + required: false + type: string + dry_run: + required: false + type: boolean + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + publish_prerelease_experimental: + name: Publish to Experimental channel + uses: facebook/react/.github/workflows/compiler_prereleases.yml@main + with: + commit_sha: ${{ inputs.prerelease_commit_sha || github.sha }} + release_channel: ${{ inputs.release_channel }} + dist_tag: ${{ inputs.dist_tag }} + version_name: ${{ inputs.version_name }} + tag_version: ${{ inputs.tag_version }} + dry_run: ${{ inputs.dry_run }} + secrets: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/compiler_prereleases_nightly.yml b/.github/workflows/compiler_prereleases_nightly.yml new file mode 100644 index 00000000000..ca2b5589def --- /dev/null +++ b/.github/workflows/compiler_prereleases_nightly.yml @@ -0,0 +1,24 @@ +name: (Compiler) Publish Prereleases Nightly + +on: + schedule: + # At 10 minutes past 16:00 on Mon, Tue, Wed, Thu, and Fri + - cron: 10 16 * * 1,2,3,4,5 + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + publish_prerelease_experimental: + name: Publish to Experimental channel + uses: facebook/react/.github/workflows/compiler_prereleases.yml@main + with: + commit_sha: ${{ github.sha }} + release_channel: experimental + dist_tag: experimental + version_name: '0.0.0' + dry_run: false + secrets: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/compiler_typescript.yml b/.github/workflows/compiler_typescript.yml new file mode 100644 index 00000000000..6a3b52e21ae --- /dev/null +++ b/.github/workflows/compiler_typescript.yml @@ -0,0 +1,108 @@ +name: (Compiler) TypeScript + +on: + push: + branches: [main] + pull_request: + paths: + - compiler/** + - .github/workflows/compiler_typescript.yml + +permissions: {} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +defaults: + run: + working-directory: compiler + +jobs: + discover_yarn_workspaces: + name: Discover yarn workspaces + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - id: set-matrix + run: echo "matrix=$(find packages -mindepth 1 -maxdepth 1 -type d | sed 's!packages/!!g' | tr '\n' ',' | sed s/.$// | jq -Rsc '. / "," - [""]')" >> $GITHUB_OUTPUT + + # Hardcoded to improve parallelism + lint: + name: Lint babel-plugin-react-compiler + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: compiler-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('compiler/yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn workspace babel-plugin-react-compiler lint + + # Hardcoded to improve parallelism + jest: + name: Jest babel-plugin-react-compiler + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: compiler-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('compiler/yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn workspace babel-plugin-react-compiler jest + + test: + name: Test ${{ matrix.workspace_name }} + needs: discover_yarn_workspaces + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + workspace_name: ${{ fromJSON(needs.discover_yarn_workspaces.outputs.matrix) }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: compiler-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('compiler/yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: xvfb-run -a yarn workspace ${{ matrix.workspace_name }} test + if: runner.os == 'Linux' && matrix.workspace_name == 'react-forgive' + - run: yarn workspace ${{ matrix.workspace_name }} test + if: matrix.workspace_name != 'react-forgive' diff --git a/.github/workflows/devtools_discord_notify.yml b/.github/workflows/devtools_discord_notify.yml new file mode 100644 index 00000000000..bb498f00371 --- /dev/null +++ b/.github/workflows/devtools_discord_notify.yml @@ -0,0 +1,49 @@ +name: (DevTools) Discord Notify + +on: + pull_request_target: + types: [opened, ready_for_review] + paths: + - packages/react-devtools** + - .github/workflows/devtools_**.yml + +permissions: {} + +jobs: + check_access: + if: ${{ github.event.pull_request.draft == false }} + runs-on: ubuntu-latest + outputs: + is_member_or_collaborator: ${{ steps.check_is_member_or_collaborator.outputs.is_member_or_collaborator }} + steps: + - run: echo ${{ github.event.pull_request.author_association }} + - name: Check is member or collaborator + id: check_is_member_or_collaborator + if: ${{ github.event.pull_request.author_association == 'MEMBER' || github.event.pull_request.author_association == 'COLLABORATOR' }} + run: echo "is_member_or_collaborator=true" >> "$GITHUB_OUTPUT" + + check_maintainer: + if: ${{ needs.check_access.outputs.is_member_or_collaborator == 'true' || needs.check_access.outputs.is_member_or_collaborator == true }} + needs: [check_access] + uses: facebook/react/.github/workflows/shared_check_maintainer.yml@main + permissions: + # Used by check_maintainer + contents: read + with: + actor: ${{ github.event.pull_request.user.login }} + + notify: + if: ${{ needs.check_maintainer.outputs.is_core_team == 'true' }} + needs: check_maintainer + runs-on: ubuntu-latest + steps: + - name: Discord Webhook Action + uses: tsickert/discord-webhook@86dc739f3f165f16dadc5666051c367efa1692f4 + with: + webhook-url: ${{ secrets.DEVTOOLS_DISCORD_WEBHOOK_URL }} + embed-author-name: ${{ github.event.pull_request.user.login }} + embed-author-url: ${{ github.event.pull_request.user.html_url }} + embed-author-icon-url: ${{ github.event.pull_request.user.avatar_url }} + embed-title: '#${{ github.event.number }} (+${{github.event.pull_request.additions}} -${{github.event.pull_request.deletions}}): ${{ github.event.pull_request.title }}' + embed-description: ${{ github.event.pull_request.body }} + embed-url: ${{ github.event.pull_request.html_url }} diff --git a/.github/workflows/devtools_regression_tests.yml b/.github/workflows/devtools_regression_tests.yml new file mode 100644 index 00000000000..9fe0c55e0bd --- /dev/null +++ b/.github/workflows/devtools_regression_tests.yml @@ -0,0 +1,205 @@ +name: (DevTools) Regression Tests + +on: + schedule: + - cron: 0 0 * * * + workflow_dispatch: + inputs: + commit_sha: + required: false + type: string + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + download_build: + name: Download base build + runs-on: ubuntu-latest + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-release-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd scripts/release install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Download react-devtools artifacts for base revision + run: | + git fetch origin main + GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build.js --commit=${{ inputs.commit_sha || '$(git rev-parse origin/main)' }} + - name: Display structure of build + run: ls -R build + - name: Archive build + uses: actions/upload-artifact@v4 + with: + name: build + path: build + if-no-files-found: error + + build_devtools_and_process_artifacts: + name: Build DevTools and process artifacts + needs: download_build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + name: build + path: build + - run: ./scripts/ci/pack_and_store_devtools_artifacts.sh + env: + RELEASE_CHANNEL: experimental + - name: Display structure of build + run: ls -R build + - name: Archive devtools build + uses: actions/upload-artifact@v4 + with: + name: react-devtools + path: build/devtools + if-no-files-found: error + # Simplifies getting the extension for local testing + - name: Archive chrome extension + uses: actions/upload-artifact@v4 + with: + name: react-devtools-chrome-extension + path: build/devtools/chrome-extension.zip + if-no-files-found: error + - name: Archive firefox extension + uses: actions/upload-artifact@v4 + with: + name: react-devtools-firefox-extension + path: build/devtools/firefox-extension.zip + if-no-files-found: error + + run_devtools_tests_for_versions: + name: Run DevTools tests for versions + needs: build_devtools_and_process_artifacts + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + version: + - "16.0" + - "16.5" # schedule package + - "16.8" # hooks + - "17.0" + - "18.0" + - "18.2" # compiler polyfill + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore all archived build artifacts + uses: actions/download-artifact@v4 + - name: Display structure of build + run: ls -R build + - run: ./scripts/ci/download_devtools_regression_build.js ${{ matrix.version }} --replaceBuild + - run: node ./scripts/jest/jest-cli.js --build --project devtools --release-channel=experimental --reactVersion ${{ matrix.version }} --ci + + run_devtools_e2e_tests_for_versions: + name: Run DevTools e2e tests for versions + needs: build_devtools_and_process_artifacts + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + version: + - "16.0" + - "16.5" # schedule package + - "16.8" # hooks + - "17.0" + - "18.0" + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore all archived build artifacts + uses: actions/download-artifact@v4 + - name: Display structure of build + run: ls -R build + - name: Check Playwright version + id: playwright_version + run: echo "playwright_version=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//' | head -1)" >> "$GITHUB_OUTPUT" + - name: Cache Playwright Browsers for version ${{ steps.playwright_version.outputs.playwright_version }} + id: cache_playwright_browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-v6-${{ runner.arch }}-${{ runner.os }}-${{ steps.playwright_version.outputs.playwright_version }} + - run: npx playwright install --with-deps + if: steps.cache_playwright_browsers.outputs.cache-hit != 'true' + - run: npx playwright install-deps + if: steps.cache_playwright_browsers.outputs.cache-hit == 'true' + - run: ./scripts/ci/download_devtools_regression_build.js ${{ matrix.version }} + - run: ls -R build-regression + - run: ./scripts/ci/run_devtools_e2e_tests.js ${{ matrix.version }} + env: + RELEASE_CHANNEL: experimental + - name: Cleanup build regression folder + run: rm -r ./build-regression + - uses: actions/upload-artifact@v4 + with: + name: screenshots + path: ./tmp/playwright-artifacts + if-no-files-found: warn diff --git a/.github/workflows/runtime_build_and_test.yml b/.github/workflows/runtime_build_and_test.yml new file mode 100644 index 00000000000..c1cc8df2eb7 --- /dev/null +++ b/.github/workflows/runtime_build_and_test.yml @@ -0,0 +1,889 @@ +name: (Runtime) Build and Test + +on: + push: + branches: [main] + tags: + # To get CI for backport releases. + # This will duplicate CI for releases from main which is acceptable + - "v*" + pull_request: + paths-ignore: + - compiler/** + workflow_dispatch: + inputs: + commit_sha: + required: false + type: string + default: '' + +permissions: {} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + # ----- NODE_MODULES CACHE ----- + # Centralize the node_modules cache so it is saved once and each subsequent job only needs to + # restore the cache. Prevents race conditions where multiple workflows try to write to the cache. + runtime_node_modules_cache: + name: Cache Runtime node_modules + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - name: Check cache hit + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + lookup-only: true + - uses: actions/setup-node@v4 + if: steps.node_modules.outputs.cache-hit != 'true' + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Warm with old cache + if: steps.node_modules.outputs.cache-hit != 'true' + uses: actions/cache/restore@v4 + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Save cache + if: steps.node_modules.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + + runtime_compiler_node_modules_cache: + name: Cache Runtime, Compiler node_modules + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - name: Check cache hit + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + lookup-only: true + - uses: actions/setup-node@v4 + if: steps.node_modules.outputs.cache-hit != 'true' + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: | + yarn.lock + compiler/yarn.lock + - name: Warm with old cache + if: steps.node_modules.outputs.cache-hit != 'true' + uses: actions/cache/restore@v4 + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd compiler install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Save cache + if: steps.node_modules.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + + # ----- FLOW ----- + discover_flow_inline_configs: + name: Discover flow inline configs + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.result }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/github-script@v7 + id: set-matrix + with: + script: | + const inlinedHostConfigs = require('./scripts/shared/inlinedHostConfigs.js'); + return inlinedHostConfigs.map(config => config.shortName); + + flow: + name: Flow check ${{ matrix.flow_inline_config_shortname }} + needs: [discover_flow_inline_configs, runtime_node_modules_cache] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + flow_inline_config_shortname: ${{ fromJSON(needs.discover_flow_inline_configs.outputs.matrix) }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: node ./scripts/tasks/flow-ci ${{ matrix.flow_inline_config_shortname }} + + # ----- FIZZ ----- + check_generated_fizz_runtime: + name: Confirm generated inline Fizz runtime is up to date + needs: [runtime_node_modules_cache] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: | + yarn generate-inline-fizz-runtime + git diff --exit-code || (echo "There was a change to the Fizz runtime. Run \`yarn generate-inline-fizz-runtime\` and check in the result." && false) + + # ----- FEATURE FLAGS ----- + flags: + name: Check flags + needs: [runtime_node_modules_cache] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn flags + + # ----- TESTS ----- + test: + name: yarn test ${{ matrix.params }} (Shard ${{ matrix.shard }}) + needs: [runtime_compiler_node_modules_cache] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + params: + - "-r=stable --env=development" + - "-r=stable --env=production" + - "-r=experimental --env=development" + - "-r=experimental --env=production" + - "-r=www-classic --env=development --variant=false" + - "-r=www-classic --env=production --variant=false" + - "-r=www-classic --env=development --variant=true" + - "-r=www-classic --env=production --variant=true" + - "-r=www-modern --env=development --variant=false" + - "-r=www-modern --env=production --variant=false" + - "-r=www-modern --env=development --variant=true" + - "-r=www-modern --env=production --variant=true" + - "-r=xplat --env=development --variant=false" + - "-r=xplat --env=development --variant=true" + - "-r=xplat --env=production --variant=false" + - "-r=xplat --env=production --variant=true" + # TODO: Test more persistent configurations? + - "-r=stable --env=development --persistent" + - "-r=experimental --env=development --persistent" + shard: + - 1/5 + - 2/5 + - 3/5 + - 4/5 + - 5/5 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: | + yarn.lock + compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd compiler install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn test ${{ matrix.params }} --ci --shard=${{ matrix.shard }} + + # Hardcoded to improve parallelism + test-linter: + name: Test eslint-plugin-react-hooks + needs: [runtime_compiler_node_modules_cache] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: | + yarn.lock + compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + - name: Install runtime dependencies + run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Install compiler dependencies + run: yarn install --frozen-lockfile + working-directory: compiler + if: steps.node_modules.outputs.cache-hit != 'true' + - run: ./scripts/react-compiler/build-compiler.sh && ./scripts/react-compiler/link-compiler.sh + - run: yarn workspace eslint-plugin-react-hooks test + + # ----- BUILD ----- + build_and_lint: + name: yarn build and lint + needs: [runtime_compiler_node_modules_cache] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # yml is dumb. update the --total arg to yarn build if you change the number of workers + worker_id: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24] + release_channel: [stable, experimental] + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: | + yarn.lock + compiler/yarn.lock + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 11.0.22 + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd compiler install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn build --index=${{ matrix.worker_id }} --total=25 --r=${{ matrix.release_channel }} --ci + env: + CI: github + RELEASE_CHANNEL: ${{ matrix.release_channel }} + NODE_INDEX: ${{ matrix.worker_id }} + - name: Lint build + run: yarn lint-build + - name: Display structure of build + run: ls -R build + - name: Archive build + uses: actions/upload-artifact@v4 + with: + name: _build_${{ matrix.worker_id }}_${{ matrix.release_channel }} + path: build + if-no-files-found: error + + test_build: + name: yarn test-build + needs: [build_and_lint, runtime_compiler_node_modules_cache] + strategy: + fail-fast: false + matrix: + test_params: [ + # Intentionally passing these as strings instead of creating a + # separate parameter per CLI argument, since it's easier to + # control/see which combinations we want to run. + -r=stable --env=development, + -r=stable --env=production, + -r=experimental --env=development, + -r=experimental --env=production, + + # Dev Tools + --project=devtools -r=experimental, + + # TODO: Update test config to support www build tests + # - "-r=www-classic --env=development --variant=false" + # - "-r=www-classic --env=production --variant=false" + # - "-r=www-classic --env=development --variant=true" + # - "-r=www-classic --env=production --variant=true" + # - "-r=www-modern --env=development --variant=false" + # - "-r=www-modern --env=production --variant=false" + # - "-r=www-modern --env=development --variant=true" + # - "-r=www-modern --env=production --variant=true" + + # TODO: Update test config to support xplat build tests + # - "-r=xplat --env=development --variant=false" + # - "-r=xplat --env=development --variant=true" + # - "-r=xplat --env=production --variant=false" + # - "-r=xplat --env=production --variant=true" + + # TODO: Test more persistent configurations? + ] + shard: + - 1/10 + - 2/10 + - 3/10 + - 4/10 + - 5/10 + - 6/10 + - 7/10 + - 8/10 + - 9/10 + - 10/10 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: | + yarn.lock + compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-and-compiler-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd compiler install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Display structure of build + run: ls -R build + - run: yarn test --build ${{ matrix.test_params }} --shard=${{ matrix.shard }} --ci + + process_artifacts_combined: + name: Process artifacts combined + needs: [build_and_lint, runtime_node_modules_cache] + permissions: + # https://github.com/actions/attest-build-provenance + id-token: write + attestations: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Display structure of build + run: ls -R build + - run: echo ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} >> build/COMMIT_SHA + - name: Scrape warning messages + run: | + mkdir -p ./build/__test_utils__ + node ./scripts/print-warnings/print-warnings.js > build/__test_utils__/ReactAllWarnings.js + # Compress build directory into a single tarball for easy download + - run: tar -zcvf ./build.tgz ./build + # TODO: Migrate scripts to use `build` directory instead of `build2` + - run: cp ./build.tgz ./build2.tgz + - name: Archive build artifacts + id: upload_artifacts_combined + uses: actions/upload-artifact@v4 + with: + name: artifacts_combined + path: | + ./build.tgz + ./build2.tgz + if-no-files-found: error + - uses: actions/attest-build-provenance@v2 + # We don't verify builds generated from pull requests not originating from facebook/react. + # However, if the PR lands, the run on `main` will generate the attestation which can then + # be used to download a build via scripts/release/download-experimental-build.js. + # + # Note that this means that scripts/release/download-experimental-build.js must be run with + # --no-verify when downloading a build from a fork. + if: github.event_name == 'push' && github.ref_name == 'main' || github.event.pull_request.head.repo.full_name == github.repository + with: + subject-name: artifacts_combined.zip + subject-digest: sha256:${{ steps.upload_artifacts_combined.outputs.artifact-digest }} + + check_error_codes: + name: Search build artifacts for unminified errors + needs: [build_and_lint, runtime_node_modules_cache] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Display structure of build + run: ls -R build + - name: Search build artifacts for unminified errors + run: | + yarn extract-errors + git diff --exit-code || (echo "Found unminified errors. Either update the error codes map or disable error minification for the affected build, if appropriate." && false) + + check_release_dependencies: + name: Check release dependencies + needs: [build_and_lint, runtime_node_modules_cache] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Display structure of build + run: ls -R build + - run: yarn check-release-dependencies + + RELEASE_CHANNEL_stable_yarn_test_dom_fixtures: + name: Check fixtures DOM (stable) + needs: build_and_lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 # note: this does not reuse centralized cache since it has unique cache key + id: node_modules + with: + path: | + **/node_modules + key: fixtures_dom-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'fixtures/dom/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn --cwd fixtures/dom install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Display structure of build + run: ls -R build + - name: Run DOM fixture tests + run: | + yarn predev + yarn test + working-directory: fixtures/dom + env: + RELEASE_CHANNEL: stable + + # ----- FLIGHT ----- + run_fixtures_flight_tests: + name: Run fixtures Flight tests + needs: build_and_lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + # Fixture copies some built packages from the workroot after install. + # That means dependencies of the built packages are not installed. + # We need to install dependencies of the workroot to fulfill all dependency constraints + - name: Restore cached node_modules + uses: actions/cache@v4 # note: this does not reuse centralized cache since it has unique cache key + id: node_modules + with: + path: | + **/node_modules + key: fixtures_flight-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'fixtures/flight/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd fixtures/flight install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Check Playwright version + id: playwright_version + run: echo "playwright_version=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//' | head -1)" >> "$GITHUB_OUTPUT" + - name: Cache Playwright Browsers for version ${{ steps.playwright_version.outputs.playwright_version }} + id: cache_playwright_browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-v6-${{ runner.arch }}-${{ runner.os }}-${{ steps.playwright_version.outputs.playwright_version }} + - name: Playwright install deps + if: steps.cache_playwright_browsers.outputs.cache-hit != 'true' + working-directory: fixtures/flight + run: npx playwright install --with-deps chromium + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Display structure of build + run: ls -R build + - name: Run tests + working-directory: fixtures/flight + run: yarn test + env: + # Otherwise the webserver is a blackbox + DEBUG: pw:webserver + - name: Archive Flight fixture artifacts + uses: actions/upload-artifact@v4 + with: + name: flight-playwright-report + path: fixtures/flight/playwright-report + if-no-files-found: warn + - name: Archive Flight fixture artifacts + uses: actions/upload-artifact@v4 + with: + name: flight-test-results + path: fixtures/flight/test-results + if-no-files-found: ignore + + # ----- DEVTOOLS ----- + build_devtools_and_process_artifacts: + name: Build DevTools and process artifacts + needs: [build_and_lint, runtime_node_modules_cache] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + browser: [chrome, firefox, edge] + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - run: ./scripts/ci/pack_and_store_devtools_artifacts.sh ${{ matrix.browser }} + env: + RELEASE_CHANNEL: experimental + - name: Display structure of build + run: ls -R build + # Simplifies getting the extension for local testing + - name: Archive ${{ matrix.browser }} extension + uses: actions/upload-artifact@v4 + with: + name: react-devtools-${{ matrix.browser }}-extension + path: build/devtools/${{ matrix.browser }}-extension.zip + if-no-files-found: error + - name: Archive ${{ matrix.browser }} metadata + uses: actions/upload-artifact@v4 + with: + name: react-devtools-${{ matrix.browser }}-metadata + path: build/devtools/webpack-stats.*.json + + merge_devtools_artifacts: + name: Merge DevTools artifacts + needs: build_devtools_and_process_artifacts + runs-on: ubuntu-latest + steps: + - name: Merge artifacts + uses: actions/upload-artifact/merge@v4 + with: + name: react-devtools + pattern: react-devtools-* + + run_devtools_e2e_tests: + name: Run DevTools e2e tests + needs: [build_and_lint, runtime_node_modules_cache] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache/restore@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-node_modules-v7-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + # Don't use restore-keys here. Otherwise the cache grows indefinitely. + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Restore archived build + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Check Playwright version + id: playwright_version + run: echo "playwright_version=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//' | head -1)" >> "$GITHUB_OUTPUT" + - name: Cache Playwright Browsers for version ${{ steps.playwright_version.outputs.playwright_version }} + id: cache_playwright_browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-v6-${{ runner.arch }}-${{ runner.os }}-${{ steps.playwright_version.outputs.playwright_version }} + - name: Playwright install deps + if: steps.cache_playwright_browsers.outputs.cache-hit != 'true' + run: npx playwright install --with-deps chromium + - run: ./scripts/ci/run_devtools_e2e_tests.js + env: + RELEASE_CHANNEL: experimental + - name: Archive Playwright report + uses: actions/upload-artifact@v4 + with: + name: devtools-playwright-artifacts + path: tmp/playwright-artifacts + if-no-files-found: warn + + # ----- SIZEBOT ----- + sizebot: + if: ${{ github.event_name == 'pull_request' && github.ref_name != 'main' && github.event.pull_request.base.ref == 'main' }} + name: Run sizebot + needs: [build_and_lint] + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 # note: this does not reuse centralized cache since it has unique cache key + id: node_modules + with: + path: | + **/node_modules + key: runtime-release-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd scripts/release install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Download artifacts for base revision + # The build could have been generated from a fork, so we must download the build without + # any verification. This is safe since we only use this for sizebot calculation and the + # unverified artifact is not used. Additionally this workflow runs in the pull_request + # trigger so only restricted permissions are available. + run: | + GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build.js --commit=$(git rev-parse ${{ github.event.pull_request.base.sha }}) ${{ (github.event.pull_request.head.repo.full_name != github.repository && '--noVerify') || ''}} + mv ./build ./base-build + - name: Delete extraneous files + # TODO: The `download-experimental-build` script copies the npm + # packages into the `node_modules` directory. This is a historical + # quirk of how the release script works. Let's pretend they + # don't exist. + run: rm -rf ./base-build/node_modules + - name: Display structure of base-build from origin/main + run: ls -R base-build + - name: Ensure clean build directory + run: rm -rf build + - name: Restore archived build for PR + uses: actions/download-artifact@v4 + with: + pattern: _build_* + path: build + merge-multiple: true + - name: Scrape warning messages + run: | + mkdir -p ./build/__test_utils__ + node ./scripts/print-warnings/print-warnings.js > build/__test_utils__/ReactAllWarnings.js + - name: Display structure of build for PR + run: ls -R build + - run: echo ${{ github.event.inputs.commit_sha != '' && github.event.inputs.commit_sha || github.event.pull_request.head.sha || github.sha }} >> build/COMMIT_SHA + - run: node ./scripts/tasks/danger + - name: Archive sizebot results + uses: actions/upload-artifact@v4 + with: + name: sizebot-message + path: sizebot-message.md + if-no-files-found: ignore diff --git a/.github/workflows/runtime_commit_artifacts.yml b/.github/workflows/runtime_commit_artifacts.yml new file mode 100644 index 00000000000..1b98673cd4d --- /dev/null +++ b/.github/workflows/runtime_commit_artifacts.yml @@ -0,0 +1,474 @@ +name: (Runtime) Commit Artifacts for Meta WWW and fbsource V2 + +on: + workflow_run: + workflows: ["(Runtime) Build and Test"] + types: [completed] + branches: + - main + workflow_dispatch: + inputs: + commit_sha: + required: false + type: string + force: + description: 'Force a commit to the builds/... branches' + required: true + default: false + type: boolean + dry_run: + description: Perform a dry run (run everything except push) + required: true + default: false + type: boolean + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + download_artifacts: + runs-on: ubuntu-latest + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + steps: + - uses: actions/checkout@v4 + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-release-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd scripts/release install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Download artifacts for base revision + run: | + GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build.js --commit=${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} + - name: Display structure of build + run: ls -R build + - name: Archive build + uses: actions/upload-artifact@v4 + with: + name: build + path: build/ + if-no-files-found: error + + + process_artifacts: + runs-on: ubuntu-latest + needs: [download_artifacts] + outputs: + www_branch_count: ${{ steps.check_branches.outputs.www_branch_count }} + fbsource_branch_count: ${{ steps.check_branches.outputs.fbsource_branch_count }} + last_version_classic: ${{ steps.get_last_version_www.outputs.last_version_classic }} + last_version_modern: ${{ steps.get_last_version_www.outputs.last_version_modern }} + last_version_rn: ${{ steps.get_last_version_rn.outputs.last_version_rn }} + current_version_classic: ${{ steps.get_current_version.outputs.current_version_classic }} + current_version_modern: ${{ steps.get_current_version.outputs.current_version_modern }} + current_version_rn: ${{ steps.get_current_version.outputs.current_version_rn }} + steps: + - uses: actions/checkout@v4 + with: + ref: builds/facebook-www + - name: "Get last version string for www" + id: get_last_version_www + run: | + # Empty checks only needed for backwards compatibility,can remove later. + VERSION_CLASSIC=$( [ -f ./compiled/facebook-www/VERSION_CLASSIC ] && cat ./compiled/facebook-www/VERSION_CLASSIC || echo '' ) + VERSION_MODERN=$( [ -f ./compiled/facebook-www/VERSION_MODERN ] && cat ./compiled/facebook-www/VERSION_MODERN || echo '' ) + echo "Last classic version is $VERSION_CLASSIC" + echo "Last modern version is $VERSION_MODERN" + echo "last_version_classic=$VERSION_CLASSIC" >> "$GITHUB_OUTPUT" + echo "last_version_modern=$VERSION_MODERN" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + with: + ref: builds/facebook-fbsource + - name: "Get last version string for rn" + id: get_last_version_rn + run: | + # Empty checks only needed for backwards compatibility,can remove later. + VERSION_NATIVE_FB=$( [ -f ./compiled-rn/VERSION_NATIVE_FB ] && cat ./compiled-rn/VERSION_NATIVE_FB || echo '' ) + echo "Last rn version is $VERSION_NATIVE_FB" + echo "last_version_rn=$VERSION_NATIVE_FB" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + - name: "Check branches" + id: check_branches + run: | + echo "www_branch_count=$(git ls-remote --heads origin "refs/heads/meta-www" | wc -l)" >> "$GITHUB_OUTPUT" + echo "fbsource_branch_count=$(git ls-remote --heads origin "refs/heads/meta-fbsource" | wc -l)" >> "$GITHUB_OUTPUT" + - name: Restore downloaded build + uses: actions/download-artifact@v4 + with: + name: build + path: build + - name: Display structure of build + run: ls -R build + - name: Strip @license from eslint plugin and react-refresh + run: | + sed -i -e 's/ @license React*//' \ + build/oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js \ + build/oss-experimental/react-refresh/cjs/react-refresh-babel.development.js + - name: Insert @headers into eslint plugin and react-refresh + run: | + sed -i -e 's/ LICENSE file in the root directory of this source tree./ LICENSE file in the root directory of this source tree.\n *\n * @noformat\n * @nolint\n * @lightSyntaxTransform\n * @preventMunge\n * @oncall react_core/' \ + build/oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js \ + build/oss-experimental/react-refresh/cjs/react-refresh-babel.development.js + - name: Move relevant files for React in www into compiled + run: | + # Move the facebook-www folder into compiled + mkdir ./compiled + mv build/facebook-www ./compiled + + # Move ReactAllWarnings.js to facebook-www + mkdir ./compiled/facebook-www/__test_utils__ + mv build/__test_utils__/ReactAllWarnings.js ./compiled/facebook-www/__test_utils__/ReactAllWarnings.js + + # Copy eslint-plugin-react-hooks + mkdir ./compiled/eslint-plugin-react-hooks + cp build/oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js \ + ./compiled/eslint-plugin-react-hooks/index.js + + # Move unstable_server-external-runtime.js into facebook-www + mv build/oss-experimental/react-dom/unstable_server-external-runtime.js \ + ./compiled/facebook-www/unstable_server-external-runtime.js + + # Move react-refresh-babel.development.js into babel-plugin-react-refresh + mkdir ./compiled/babel-plugin-react-refresh + mv build/oss-experimental/react-refresh/cjs/react-refresh-babel.development.js \ + ./compiled/babel-plugin-react-refresh/index.js + + ls -R ./compiled + - name: Move relevant files for React in fbsource into compiled-rn + run: | + BASE_FOLDER='compiled-rn/facebook-fbsource/xplat/js' + mkdir -p ${BASE_FOLDER}/react-native-github/Libraries/Renderer/ + mkdir -p ${BASE_FOLDER}/RKJSModules/vendor/react/{scheduler,react,react-dom,react-is,react-test-renderer}/ + + # Move React Native renderer + mv build/react-native/implementations/ $BASE_FOLDER/react-native-github/Libraries/Renderer/ + mv build/react-native/shims/ $BASE_FOLDER/react-native-github/Libraries/Renderer/ + mv build/facebook-react-native/scheduler/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/scheduler/ + mv build/facebook-react-native/react/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react/ + mv build/facebook-react-native/react-dom/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react-dom/ + mv build/facebook-react-native/react-is/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react-is/ + mv build/facebook-react-native/react-test-renderer/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react-test-renderer/ + + # Delete the OSS renderers, these are sync'd to RN separately. + RENDERER_FOLDER=$BASE_FOLDER/react-native-github/Libraries/Renderer/implementations/ + rm $RENDERER_FOLDER/ReactFabric-{dev,prod,profiling}.js + + # Delete the legacy renderer shim, this is not sync'd and will get deleted in the future. + SHIM_FOLDER=$BASE_FOLDER/react-native-github/Libraries/Renderer/shims/ + rm $SHIM_FOLDER/ReactNative.js + + # Copy eslint-plugin-react-hooks + # NOTE: This is different from www, here we include the full package + # including package.json to include dependencies in fbsource. + mkdir "$BASE_FOLDER/tools" + cp -r build/oss-experimental/eslint-plugin-react-hooks "$BASE_FOLDER/tools" + + # Move React Native version file + mv build/facebook-react-native/VERSION_NATIVE_FB ./compiled-rn/VERSION_NATIVE_FB + + ls -R ./compiled-rn + - name: Add REVISION files + run: | + echo ${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} >> ./compiled/facebook-www/REVISION + cp ./compiled/facebook-www/REVISION ./compiled/facebook-www/REVISION_TRANSFORMS + echo ${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION + - name: "Get current version string" + id: get_current_version + run: | + VERSION_CLASSIC=$(cat ./compiled/facebook-www/VERSION_CLASSIC) + VERSION_MODERN=$(cat ./compiled/facebook-www/VERSION_MODERN) + VERSION_NATIVE_FB=$(cat ./compiled-rn/VERSION_NATIVE_FB) + echo "Current classic version is $VERSION_CLASSIC" + echo "Current modern version is $VERSION_MODERN" + echo "Current rn version is $VERSION_NATIVE_FB" + echo "current_version_classic=$VERSION_CLASSIC" >> "$GITHUB_OUTPUT" + echo "current_version_modern=$VERSION_MODERN" >> "$GITHUB_OUTPUT" + echo "current_version_rn=$VERSION_NATIVE_FB" >> "$GITHUB_OUTPUT" + - uses: actions/upload-artifact@v4 + with: + name: compiled + path: compiled/ + if-no-files-found: error + - uses: actions/upload-artifact@v4 + with: + name: compiled-rn + path: compiled-rn/ + if-no-files-found: error + + commit_www_artifacts: + needs: [download_artifacts, process_artifacts] + if: inputs.force == true || (github.ref == 'refs/heads/main' && needs.process_artifacts.outputs.www_branch_count == '0') + runs-on: ubuntu-latest + permissions: + # Used to push a commit to builds/facebook-www + contents: write + steps: + - uses: actions/checkout@v4 + with: + ref: builds/facebook-www + - name: Ensure clean directory + run: rm -rf compiled + - uses: actions/download-artifact@v4 + with: + name: compiled + path: compiled/ + - name: Revert version changes + if: needs.process_artifacts.outputs.last_version_classic != '' && needs.process_artifacts.outputs.last_version_modern != '' + env: + CURRENT_VERSION_CLASSIC: ${{ needs.process_artifacts.outputs.current_version_classic }} + CURRENT_VERSION_MODERN: ${{ needs.process_artifacts.outputs.current_version_modern }} + LAST_VERSION_CLASSIC: ${{ needs.process_artifacts.outputs.last_version_classic }} + LAST_VERSION_MODERN: ${{ needs.process_artifacts.outputs.last_version_modern }} + run: | + echo "Reverting $CURRENT_VERSION_CLASSIC to $LAST_VERSION_CLASSIC" + grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled || echo "No files found with $CURRENT_VERSION_CLASSIC" + grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled | xargs -r sed -i -e "s/$CURRENT_VERSION_CLASSIC/$LAST_VERSION_CLASSIC/g" + grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled || echo "Classic version reverted" + echo "====================" + echo "Reverting $CURRENT_VERSION_MODERN to $LAST_VERSION_MODERN" + grep -rl "$CURRENT_VERSION_MODERN" ./compiled || echo "No files found with $CURRENT_VERSION_MODERN" + grep -rl "$CURRENT_VERSION_MODERN" ./compiled | xargs -r sed -i -e "s/$CURRENT_VERSION_MODERN/$LAST_VERSION_MODERN/g" + grep -rl "$CURRENT_VERSION_MODERN" ./compiled || echo "Modern version reverted" + - name: Check for changes + if: inputs.force != true + id: check_should_commit + run: | + echo "Full git status" + git add . + git status + echo "====================" + if git status --porcelain | grep -qv '/REVISION'; then + echo "Changes detected" + echo "===== Changes =====" + git --no-pager diff -U0 | grep '^[+-]' | head -n 50 + echo "===================" + echo "should_commit=true" >> "$GITHUB_OUTPUT" + else + echo "No Changes detected" + echo "should_commit=false" >> "$GITHUB_OUTPUT" + fi + - name: Re-apply version changes + if: inputs.force == true || (steps.check_should_commit.outputs.should_commit == 'true' && needs.process_artifacts.outputs.last_version_classic != '' && needs.process_artifacts.outputs.last_version_modern != '') + env: + CURRENT_VERSION_CLASSIC: ${{ needs.process_artifacts.outputs.current_version_classic }} + CURRENT_VERSION_MODERN: ${{ needs.process_artifacts.outputs.current_version_modern }} + LAST_VERSION_CLASSIC: ${{ needs.process_artifacts.outputs.last_version_classic }} + LAST_VERSION_MODERN: ${{ needs.process_artifacts.outputs.last_version_modern }} + run: | + echo "Re-applying $LAST_VERSION_CLASSIC to $CURRENT_VERSION_CLASSIC" + grep -rl "$LAST_VERSION_CLASSIC" ./compiled || echo "No files found with $LAST_VERSION_CLASSIC" + grep -rl "$LAST_VERSION_CLASSIC" ./compiled | xargs -r sed -i -e "s/$LAST_VERSION_CLASSIC/$CURRENT_VERSION_CLASSIC/g" + grep -rl "$LAST_VERSION_CLASSIC" ./compiled || echo "Classic version re-applied" + echo "====================" + echo "Re-applying $LAST_VERSION_MODERN to $CURRENT_VERSION_MODERN" + grep -rl "$LAST_VERSION_MODERN" ./compiled || echo "No files found with $LAST_VERSION_MODERN" + grep -rl "$LAST_VERSION_MODERN" ./compiled | xargs -r sed -i -e "s/$LAST_VERSION_MODERN/$CURRENT_VERSION_MODERN/g" + grep -rl "$LAST_VERSION_MODERN" ./compiled || echo "Classic version re-applied" + - name: Will commit these changes + if: inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true' + run: | + git add . + git status + - name: Check commit message + if: inputs.dry_run + run: | + git fetch origin --quiet + git show ${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} --no-patch --pretty=format:"%B" + - name: Commit changes to branch + if: inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true' + run: | + git config --global user.email "${{ format('{0}@users.noreply.github.com', github.triggering_actor) }}" + git config --global user.name "${{ github.triggering_actor }}" + + git fetch origin --quiet + git commit -m "$(git show ${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} --no-patch --pretty=format:'%B%n%nDiffTrain build for [${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }}](https://github.com/facebook/react/commit/${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha}})')" || echo "No changes to commit" + - name: Push changes to branch + if: inputs.dry_run == false && (inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true') + run: git push + + commit_fbsource_artifacts: + needs: [download_artifacts, process_artifacts] + permissions: + # Used to push a commit to builds/facebook-fbsource + contents: write + if: inputs.force == true || (github.ref == 'refs/heads/main' && needs.process_artifacts.outputs.fbsource_branch_count == '0') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: builds/facebook-fbsource + - name: Ensure clean directory + run: rm -rf compiled-rn + - uses: actions/download-artifact@v4 + with: + name: compiled-rn + path: compiled-rn/ + - name: Revert version changes + if: needs.process_artifacts.outputs.last_version_rn != '' + env: + CURRENT_VERSION: ${{ needs.process_artifacts.outputs.current_version_rn }} + LAST_VERSION: ${{ needs.process_artifacts.outputs.last_version_rn }} + run: | + echo "Reverting $CURRENT_VERSION to $LAST_VERSION" + grep -rl "$CURRENT_VERSION" ./compiled-rn || echo "No files found with $CURRENT_VERSION" + grep -rl "$CURRENT_VERSION" ./compiled-rn | xargs -r sed -i -e "s/$CURRENT_VERSION/$LAST_VERSION/g" + grep -rl "$CURRENT_VERSION" ./compiled-rn || echo "Version reverted" + - name: Check for changes + if: inputs.force != 'true' + id: check_should_commit + run: | + echo "Full git status" + git add . + git --no-pager diff -U0 --cached | grep '^[+-]' | head -n 100 + echo "====================" + # Ignore REVISION or lines removing @generated headers. + if git diff --cached ':(exclude)*REVISION' ':(exclude)*/eslint-plugin-react-hooks/package.json' | grep -vE "^(@@|diff|index|\-\-\-|\+\+\+|\- \* @generated SignedSource)" | grep "^[+-]" > /dev/null; then + echo "Changes detected" + echo "===== Changes =====" + git --no-pager diff --cached ':(exclude)*REVISION' ':(exclude)*/eslint-plugin-react-hooks/package.json' | grep -vE "^(@@|diff|index|\-\-\-|\+\+\+|\- \* @generated SignedSource)" | grep "^[+-]" | head -n 50 + echo "===================" + echo "should_commit=true" >> "$GITHUB_OUTPUT" + else + echo "No Changes detected" + echo "should_commit=false" >> "$GITHUB_OUTPUT" + fi + - name: Re-apply version changes + if: inputs.force == true || (steps.check_should_commit.outputs.should_commit == 'true' && needs.process_artifacts.outputs.last_version_rn != '') + env: + CURRENT_VERSION: ${{ needs.process_artifacts.outputs.current_version_rn }} + LAST_VERSION: ${{ needs.process_artifacts.outputs.last_version_rn }} + run: | + echo "Re-applying $LAST_VERSION to $CURRENT_VERSION" + grep -rl "$LAST_VERSION" ./compiled-rn || echo "No files found with $LAST_VERSION" + grep -rl "$LAST_VERSION" ./compiled-rn | xargs -r sed -i -e "s/$LAST_VERSION/$CURRENT_VERSION/g" + grep -rl "$LAST_VERSION" ./compiled-rn || echo "Version re-applied" + - name: Add files for signing + if: inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true' + run: | + echo ":" + git add . + - name: Signing files + if: inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true' + uses: actions/github-script@v7 + with: + script: | + // TODO: Move this to a script file. + // We currently can't call scripts from the repo because + // at this point in the workflow, we're on the compiled + // artifact branch (so the scripts don't exist). + // We can fix this with a composite action in the main repo. + // This script is duplicated above. + const fs = require('fs'); + const crypto = require('crypto'); + const {execSync} = require('child_process'); + + // TODO: when we move this to a script, we can use this from npm. + // Copy of signedsource since we can't install deps on this branch. + const GENERATED = '@' + 'generated'; + const NEWTOKEN = '<>'; + const PATTERN = new RegExp(`${GENERATED} (?:SignedSource<<([a-f0-9]{32})>>)`); + + const TokenNotFoundError = new Error( + `SignedSource.signFile(...): Cannot sign file without token: ${NEWTOKEN}` + ); + + function hash(data, encoding) { + const md5sum = crypto.createHash('md5'); + md5sum.update(data, encoding); + return md5sum.digest('hex'); + } + + const SignedSource = { + getSigningToken() { + return `${GENERATED} ${NEWTOKEN}`; + }, + isSigned(data) { + return PATTERN.exec(data) != null; + }, + signFile(data) { + if (!data.includes(NEWTOKEN)) { + if (SignedSource.isSigned(data)) { + // Signing a file that was previously signed. + data = data.replace(PATTERN, SignedSource.getSigningToken()); + } else { + throw TokenNotFoundError; + } + } + return data.replace(NEWTOKEN, `SignedSource<<${hash(data, 'utf8')}>>`); + }, + }; + + const directory = './compiled-rn'; + console.log('Signing files in directory:', directory); + try { + const result = execSync(`git status --porcelain ${directory}`, {encoding: 'utf8'}); + console.log(result); + + // Parse the git status output to get file paths! + const files = result.split('\n').filter(file => file.endsWith('.js')); + + if (files.length === 0) { + throw new Error( + 'git status returned no files to sign. this job should not have run.' + ); + } else { + files.forEach(line => { + let file = null; + if (line.startsWith('D ')) { + return; + } else if (line.startsWith('R ')) { + file = line.slice(line.indexOf('->') + 3); + } else { + file = line.slice(3).trim(); + } + if (file) { + console.log(' Signing file:', file); + const originalContents = fs.readFileSync(file, 'utf8'); + const signedContents = SignedSource.signFile( + originalContents + // Need to add the header in, since it's not inserted at build time. + .replace(' */\n', ` * ${SignedSource.getSigningToken()}\n */\n`) + ); + + fs.writeFileSync(file, signedContents, 'utf8'); + } + }); + } + } catch (e) { + process.exitCode = 1; + console.error('Error signing files:', e); + } + - name: Will commit these changes + if: inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true' + run: | + git add . + git status + - name: Check commit message + if: inputs.dry_run + run: | + git fetch origin --quiet + git show ${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} --no-patch --pretty=format:"%B" + - name: Commit changes to branch + if: inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true' + run: | + git config --global user.email "${{ format('{0}@users.noreply.github.com', github.triggering_actor) }}" + git config --global user.name "${{ github.triggering_actor }}" + + git fetch origin --quiet + git commit -m "$(git show ${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }} --no-patch --pretty=format:'%B%n%nDiffTrain build for [${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha }}](https://github.com/facebook/react/commit/${{ inputs.commit_sha || github.event.workflow_run.head_sha || github.sha}})')" || echo "No changes to commit" + - name: Push changes to branch + if: inputs.dry_run == false && (inputs.force == true || steps.check_should_commit.outputs.should_commit == 'true') + run: git push diff --git a/.github/workflows/runtime_discord_notify.yml b/.github/workflows/runtime_discord_notify.yml new file mode 100644 index 00000000000..ae9930adf11 --- /dev/null +++ b/.github/workflows/runtime_discord_notify.yml @@ -0,0 +1,51 @@ +name: (Runtime) Discord Notify + +on: + pull_request_target: + types: [opened, ready_for_review] + paths-ignore: + - packages/react-devtools** + - compiler/** + - .github/workflows/compiler_**.yml + - .github/workflows/devtools**.yml + +permissions: {} + +jobs: + check_access: + if: ${{ github.event.pull_request.draft == false }} + runs-on: ubuntu-latest + outputs: + is_member_or_collaborator: ${{ steps.check_is_member_or_collaborator.outputs.is_member_or_collaborator }} + steps: + - run: echo ${{ github.event.pull_request.author_association }} + - name: Check is member or collaborator + id: check_is_member_or_collaborator + if: ${{ github.event.pull_request.author_association == 'MEMBER' || github.event.pull_request.author_association == 'COLLABORATOR' }} + run: echo "is_member_or_collaborator=true" >> "$GITHUB_OUTPUT" + + check_maintainer: + if: ${{ needs.check_access.outputs.is_member_or_collaborator == 'true' || needs.check_access.outputs.is_member_or_collaborator == true }} + needs: [check_access] + uses: facebook/react/.github/workflows/shared_check_maintainer.yml@main + permissions: + # Used by check_maintainer + contents: read + with: + actor: ${{ github.event.pull_request.user.login }} + + notify: + if: ${{ needs.check_maintainer.outputs.is_core_team == 'true' }} + needs: check_maintainer + runs-on: ubuntu-latest + steps: + - name: Discord Webhook Action + uses: tsickert/discord-webhook@86dc739f3f165f16dadc5666051c367efa1692f4 + with: + webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }} + embed-author-name: ${{ github.event.pull_request.user.login }} + embed-author-url: ${{ github.event.pull_request.user.html_url }} + embed-author-icon-url: ${{ github.event.pull_request.user.avatar_url }} + embed-title: '#${{ github.event.number }} (+${{github.event.pull_request.additions}} -${{github.event.pull_request.deletions}}): ${{ github.event.pull_request.title }}' + embed-description: ${{ github.event.pull_request.body }} + embed-url: ${{ github.event.pull_request.html_url }} diff --git a/.github/workflows/runtime_eslint_plugin_e2e.yml b/.github/workflows/runtime_eslint_plugin_e2e.yml new file mode 100644 index 00000000000..92921646c1b --- /dev/null +++ b/.github/workflows/runtime_eslint_plugin_e2e.yml @@ -0,0 +1,65 @@ +name: (Runtime) ESLint Plugin E2E + +on: + push: + branches: [main] + pull_request: + paths-ignore: + - compiler/** + +permissions: {} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + # ----- TESTS ----- + test: + name: ESLint v${{ matrix.eslint_major }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + eslint_major: + - "6" + - "7" + - "8" + - "9" + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: | + yarn.lock + compiler/yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-and-compiler-eslint_e2e-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'compiler/yarn.lock', 'fixtures/eslint-v*/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd compiler install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Install fixture dependencies + working-directory: ./fixtures/eslint-v${{ matrix.eslint_major }} + run: yarn --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - name: Build plugin + working-directory: fixtures/eslint-v${{ matrix.eslint_major }} + run: node build.mjs + - name: Run lint test + working-directory: ./fixtures/eslint-v${{ matrix.eslint_major }} + run: yarn lint diff --git a/.github/workflows/runtime_fuzz_tests.yml b/.github/workflows/runtime_fuzz_tests.yml new file mode 100644 index 00000000000..a88ce523a62 --- /dev/null +++ b/.github/workflows/runtime_fuzz_tests.yml @@ -0,0 +1,33 @@ +name: (Runtime) Fuzz tests + +on: + schedule: + - cron: 0 * * * * + push: + branches: + - main + workflow_dispatch: + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + test_fuzz: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.0 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + - name: Install dependencies + run: yarn install --frozen-lockfile + env: + ELECTRON_SKIP_BINARY_DOWNLOAD: "1" + shell: bash + - name: Run fuzz tests + run: |- + FUZZ_TEST_SEED=$RANDOM yarn test fuzz --ci + FUZZ_TEST_SEED=$RANDOM yarn test --prod fuzz --ci diff --git a/.github/workflows/runtime_prereleases.yml b/.github/workflows/runtime_prereleases.yml new file mode 100644 index 00000000000..6559b144997 --- /dev/null +++ b/.github/workflows/runtime_prereleases.yml @@ -0,0 +1,110 @@ +name: (Runtime) Publish Prereleases + +on: + workflow_call: + inputs: + commit_sha: + required: true + default: '' + type: string + release_channel: + required: true + type: string + dist_tag: + required: true + type: string + enableFailureNotification: + description: 'Whether to notify the team on Discord when the release fails. Useful if this workflow is called from an automation.' + required: false + type: boolean + only_packages: + description: Packages to publish (space separated) + type: string + skip_packages: + description: Packages to NOT publish (space separated) + type: string + dry: + required: true + description: Dry run instead of publish? + type: boolean + default: true + secrets: + DISCORD_WEBHOOK_URL: + description: 'Discord webhook URL to notify on failure. Only required if enableFailureNotification is true.' + required: false + GH_TOKEN: + required: true + NPM_TOKEN: + required: true + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + +jobs: + publish_prerelease: + name: Publish prelease (${{ inputs.release_channel }}) ${{ inputs.commit_sha }} @${{ inputs.dist_tag }} + runs-on: ubuntu-latest + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-release-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd scripts/release install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: cp ./scripts/release/ci-npmrc ~/.npmrc + - run: | + GH_TOKEN=${{ secrets.GH_TOKEN }} scripts/release/prepare-release-from-ci.js --skipTests -r ${{ inputs.release_channel }} --commit=${{ inputs.commit_sha }} + - name: Check prepared files + run: ls -R build/node_modules + - if: '${{ inputs.only_packages }}' + name: 'Publish ${{ inputs.only_packages }}' + run: | + scripts/release/publish.js \ + --ci \ + --tags=${{ inputs.dist_tag }} \ + --onlyPackages=${{ inputs.only_packages }} ${{ (inputs.dry && '') || '\'}} + ${{ inputs.dry && '--dry' || '' }} + - if: '${{ inputs.skip_packages }}' + name: 'Publish all packages EXCEPT ${{ inputs.skip_packages }}' + run: | + scripts/release/publish.js \ + --ci \ + --tags=${{ inputs.dist_tag }} \ + --skipPackages=${{ inputs.skip_packages }} ${{ (inputs.dry && '') || '\'}} + ${{ inputs.dry && '--dry' || '' }} + - if: '${{ !inputs.skip_packages && !inputs.only_packages }}' + name: 'Publish all packages' + run: | + scripts/release/publish.js \ + --ci \ + --tags=${{ inputs.dist_tag }} ${{ (inputs.dry && '') || '\'}} + ${{ inputs.dry && '--dry' || '' }} + - name: Notify Discord on failure + if: failure() && inputs.enableFailureNotification == true + uses: tsickert/discord-webhook@86dc739f3f165f16dadc5666051c367efa1692f4 + with: + webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }} + embed-author-name: "GitHub Actions" + embed-title: '[Runtime] Publish of ${{ inputs.release_channel }}@${{ inputs.dist_tag}} release failed' + embed-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }} diff --git a/.github/workflows/runtime_prereleases_manual.yml b/.github/workflows/runtime_prereleases_manual.yml new file mode 100644 index 00000000000..407d931e907 --- /dev/null +++ b/.github/workflows/runtime_prereleases_manual.yml @@ -0,0 +1,102 @@ +name: (Runtime) Publish Prereleases Manual + +on: + workflow_dispatch: + inputs: + prerelease_commit_sha: + required: true + only_packages: + description: Packages to publish (space separated) + type: string + skip_packages: + description: Packages to NOT publish (space separated) + type: string + dry: + required: true + description: Dry run instead of publish? + type: boolean + default: true + experimental_only: + type: boolean + description: Only publish to the experimental tag + default: false + force_notify: + description: Force a Discord notification? + type: boolean + default: false + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + notify: + if: ${{ inputs.force_notify || inputs.dry == false || inputs.dry == 'false' }} + runs-on: ubuntu-latest + steps: + - name: Discord Webhook Action + uses: tsickert/discord-webhook@86dc739f3f165f16dadc5666051c367efa1692f4 + with: + webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }} + embed-author-name: ${{ github.event.sender.login }} + embed-author-url: ${{ github.event.sender.html_url }} + embed-author-icon-url: ${{ github.event.sender.avatar_url }} + embed-title: "⚠️ Publishing ${{ inputs.experimental_only && 'EXPERIMENTAL' || 'CANARY & EXPERIMENTAL' }} release ${{ (inputs.dry && ' (dry run)') || '' }}" + embed-description: | + ```json + ${{ toJson(inputs) }} + ``` + embed-url: https://github.com/facebook/react/actions/runs/${{ github.run_id }} + + publish_prerelease_canary: + if: ${{ !inputs.experimental_only }} + name: Publish to Canary channel + uses: facebook/react/.github/workflows/runtime_prereleases.yml@main + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + with: + commit_sha: ${{ inputs.prerelease_commit_sha }} + release_channel: stable + # The tags to use when publishing canaries. The main one we should + # always include is "canary" but we can use multiple (e.g. alpha, + # beta, rc). To declare multiple, use a comma-separated string, like + # this: + # dist_tag: "canary,alpha,beta,rc" + # + # TODO: We currently tag canaries with "next" in addition to "canary" + # because this used to be called the "next" channel and some + # downstream consumers might still expect that tag. We can remove this + # after some time has elapsed and the change has been communicated. + dist_tag: canary,next + only_packages: ${{ inputs.only_packages }} + skip_packages: ${{ inputs.skip_packages }} + dry: ${{ inputs.dry }} + secrets: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish_prerelease_experimental: + name: Publish to Experimental channel + uses: facebook/react/.github/workflows/runtime_prereleases.yml@main + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + # NOTE: Intentionally running these jobs sequentially because npm + # will sometimes fail if you try to concurrently publish two + # different versions of the same package, even if they use different + # dist tags. + needs: publish_prerelease_canary + # Ensures the job runs even if canary is skipped + if: always() + with: + commit_sha: ${{ inputs.prerelease_commit_sha }} + release_channel: experimental + dist_tag: experimental + only_packages: ${{ inputs.only_packages }} + skip_packages: ${{ inputs.skip_packages }} + dry: ${{ inputs.dry }} + secrets: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/runtime_prereleases_nightly.yml b/.github/workflows/runtime_prereleases_nightly.yml new file mode 100644 index 00000000000..f13a92e46f4 --- /dev/null +++ b/.github/workflows/runtime_prereleases_nightly.yml @@ -0,0 +1,51 @@ +name: (Runtime) Publish Prereleases Nightly + +on: + schedule: + # At 10 minutes past 16:00 on Mon, Tue, Wed, Thu, and Fri + - cron: 10 16 * * 1,2,3,4,5 + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + publish_prerelease_canary: + name: Publish to Canary channel + uses: facebook/react/.github/workflows/runtime_prereleases.yml@main + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + with: + commit_sha: ${{ github.sha }} + release_channel: stable + dist_tag: canary,next + enableFailureNotification: true + dry: false + secrets: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish_prerelease_experimental: + name: Publish to Experimental channel + uses: facebook/react/.github/workflows/runtime_prereleases.yml@main + permissions: + # We use github.token to download the build artifact from a previous runtime_build_and_test.yml run + actions: read + # NOTE: Intentionally running these jobs sequentially because npm + # will sometimes fail if you try to concurrently publish two + # different versions of the same package, even if they use different + # dist tags. + needs: publish_prerelease_canary + with: + commit_sha: ${{ github.sha }} + release_channel: experimental + dist_tag: experimental + enableFailureNotification: true + dry: false + secrets: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/runtime_releases_from_npm_manual.yml b/.github/workflows/runtime_releases_from_npm_manual.yml new file mode 100644 index 00000000000..f164e9f0806 --- /dev/null +++ b/.github/workflows/runtime_releases_from_npm_manual.yml @@ -0,0 +1,128 @@ +name: (Runtime) Publish Releases from NPM Manual + +on: + workflow_dispatch: + inputs: + version_to_promote: + required: true + description: Current npm version (non-experimental) to promote + type: string + version_to_publish: + required: true + description: Version to publish for the specified packages + type: string + only_packages: + description: Packages to publish (space separated) + type: string + skip_packages: + description: Packages to NOT publish (space separated) + type: string + tags: + description: NPM tags (space separated) + type: string + default: untagged + dry: + required: true + description: Dry run instead of publish? + type: boolean + default: true + force_notify: + description: Force a Discord notification? + type: boolean + default: false + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + +jobs: + notify: + if: ${{ inputs.force_notify || inputs.dry == false || inputs.dry == 'false' }} + runs-on: ubuntu-latest + steps: + - name: Discord Webhook Action + uses: tsickert/discord-webhook@86dc739f3f165f16dadc5666051c367efa1692f4 + with: + webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }} + embed-author-name: ${{ github.event.sender.login }} + embed-author-url: ${{ github.event.sender.html_url }} + embed-author-icon-url: ${{ github.event.sender.avatar_url }} + embed-title: "⚠️ Publishing release from NPM${{ (inputs.dry && ' (dry run)') || '' }}" + embed-description: | + ```json + ${{ toJson(inputs) }} + ``` + embed-url: https://github.com/facebook/react/actions/runs/${{ github.run_id }} + + publish: + name: Publish releases + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: runtime-release-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn --cwd scripts/release install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: cp ./scripts/release/ci-npmrc ~/.npmrc + - if: '${{ inputs.only_packages }}' + name: 'Prepare ${{ inputs.only_packages }} from NPM' + run: | + scripts/release/prepare-release-from-npm.js \ + --ci \ + --skipTests \ + --version=${{ inputs.version_to_promote }} \ + --publishVersion=${{ inputs.version_to_publish }} \ + --onlyPackages=${{ inputs.only_packages }} + - if: '${{ inputs.skip_packages }}' + name: 'Prepare all packages EXCEPT ${{ inputs.skip_packages }} from NPM' + run: | + scripts/release/prepare-release-from-npm.js \ + --ci \ + --skipTests \ + --version=${{ inputs.version_to_promote }} \ + --publishVersion=${{ inputs.version_to_publish }} \ + --skipPackages=${{ inputs.skip_packages }} + - name: Check prepared files + run: ls -R build/node_modules + - if: '${{ inputs.only_packages }}' + name: 'Publish ${{ inputs.only_packages }}' + run: | + scripts/release/publish.js \ + --ci \ + --tags=${{ inputs.tags }} \ + --publishVersion=${{ inputs.version_to_publish }} \ + --onlyPackages=${{ inputs.only_packages }} ${{ (inputs.dry && '') || '\'}} + ${{ inputs.dry && '--dry' || '' }} + - if: '${{ inputs.skip_packages }}' + name: 'Publish all packages EXCEPT ${{ inputs.skip_packages }}' + run: | + scripts/release/publish.js \ + --ci \ + --tags=${{ inputs.tags }} \ + --publishVersion=${{ inputs.version_to_publish }} \ + --skipPackages=${{ inputs.skip_packages }} ${{ (inputs.dry && '') || '\'}} + ${{ inputs.dry && '--dry' || '' }} + - name: Archive released package for debugging + uses: actions/upload-artifact@v4 + with: + name: build + path: | + ./build/node_modules diff --git a/.github/workflows/shared_check_maintainer.yml b/.github/workflows/shared_check_maintainer.yml new file mode 100644 index 00000000000..f6eb9b9a6d1 --- /dev/null +++ b/.github/workflows/shared_check_maintainer.yml @@ -0,0 +1,58 @@ +name: (Shared) Check maintainer + +on: + workflow_call: + inputs: + actor: + required: true + type: string + outputs: + is_core_team: + value: ${{ jobs.check_maintainer.outputs.is_core_team }} + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + check_maintainer: + runs-on: ubuntu-latest + permissions: + # We fetch the contents of the MAINTAINERS file + contents: read + outputs: + is_core_team: ${{ steps.check_if_actor_is_maintainer.outputs.result }} + steps: + - name: Check if actor is maintainer + id: check_if_actor_is_maintainer + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const actor = '${{ inputs.actor }}'; + const res = await github.rest.repos.getContent({ + owner: 'facebook', + repo: 'react', + path: 'MAINTAINERS', + ref: 'main', + headers: { Accept: 'application/vnd.github+json' } + }); + if (res.status !== 200) { + console.error(res); + throw new Error('Unable to fetch MAINTAINERS file'); + } + content = Buffer.from(res.data.content, 'base64').toString(); + if (content == null || typeof content !== 'string') { + throw new Error('Unable to retrieve MAINTAINERS file'); + } + + const maintainers = new Set(content.split('\n')); + if (maintainers.has(actor)) { + console.log(`🟢 ${actor} is a maintainer`); + return true; + } + console.log(`🔴 ${actor} is NOT a maintainer`); + return null; diff --git a/.github/workflows/shared_cleanup_merged_branch_caches.yml b/.github/workflows/shared_cleanup_merged_branch_caches.yml new file mode 100644 index 00000000000..ed80a505e42 --- /dev/null +++ b/.github/workflows/shared_cleanup_merged_branch_caches.yml @@ -0,0 +1,41 @@ +# https://github.com/actions/cache/blob/main/tips-and-workarounds.md#force-deletion-of-caches-overriding-default-cache-eviction-policy + +name: (Shared) Cleanup Merged Branch Caches +on: + pull_request: + types: + - closed + workflow_dispatch: + inputs: + pr_number: + required: true + type: string + +permissions: {} + +jobs: + cleanup: + runs-on: ubuntu-latest + permissions: + # `actions:write` permission is required to delete caches + # See also: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#delete-a-github-actions-cache-for-a-repository-using-a-cache-id + actions: write + contents: read + steps: + - name: Cleanup + run: | + echo "Fetching list of cache key" + cacheKeysForPR=$(gh cache list --ref $BRANCH --limit 100 --json id --jq '.[].id') + + ## Setting this to not fail the workflow while deleting cache keys. + set +e + for cacheKey in $cacheKeysForPR + do + gh cache delete $cacheKey + echo "Deleting $cacheKey" + done + echo "Done" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + BRANCH: refs/pull/${{ inputs.pr_number || github.event.pull_request.number }}/merge diff --git a/.github/workflows/shared_cleanup_stale_branch_caches.yml b/.github/workflows/shared_cleanup_stale_branch_caches.yml new file mode 100644 index 00000000000..f6c532b485a --- /dev/null +++ b/.github/workflows/shared_cleanup_stale_branch_caches.yml @@ -0,0 +1,36 @@ +# https://github.com/actions/cache/blob/main/tips-and-workarounds.md#force-deletion-of-caches-overriding-default-cache-eviction-policy + +name: (Shared) Cleanup Stale Branch Caches +on: + schedule: + # Every 6 hours + - cron: 0 */6 * * * + workflow_dispatch: + +permissions: {} + +jobs: + cleanup: + runs-on: ubuntu-latest + permissions: + # `actions:write` permission is required to delete caches + # See also: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#delete-a-github-actions-cache-for-a-repository-using-a-cache-id + actions: write + contents: read + steps: + - name: Cleanup + run: | + echo "Fetching list of cache keys" + cacheKeysForPR=$(gh cache list --limit 100 --json id,ref --jq '.[] | select(.ref != "refs/heads/main") | .id') + + ## Setting this to not fail the workflow while deleting cache keys. + set +e + for cacheKey in $cacheKeysForPR + do + gh cache delete $cacheKey + echo "Deleting $cacheKey" + done + echo "Done" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} diff --git a/.github/workflows/shared_close_direct_sync_branch_prs.yml b/.github/workflows/shared_close_direct_sync_branch_prs.yml new file mode 100644 index 00000000000..caa4da880b5 --- /dev/null +++ b/.github/workflows/shared_close_direct_sync_branch_prs.yml @@ -0,0 +1,43 @@ +name: (Shared) Close Direct Sync Branch PRs + +on: + pull_request: + branches: + - 'builds/facebook-**' + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + close_pr: + runs-on: ubuntu-latest + permissions: + # Used to create a review and close PRs + pull-requests: write + contents: write + steps: + - name: Close PR + uses: actions/github-script@v7 + with: + script: | + const owner = context.repo.owner; + const repo = context.repo.repo; + const pullNumber = ${{ github.event.number }}; + + await github.rest.pulls.createReview({ + owner, + repo, + pull_number: pullNumber, + body: 'Do not land changes to `${{ github.event.pull_request.base.ref }}`. Please re-open your PR targeting `main` instead.', + event: 'REQUEST_CHANGES' + }); + await github.rest.pulls.update({ + owner, + repo, + pull_number: pullNumber, + state: 'closed' + }); diff --git a/.github/workflows/shared_label_core_team_prs.yml b/.github/workflows/shared_label_core_team_prs.yml new file mode 100644 index 00000000000..cc10e87dcc2 --- /dev/null +++ b/.github/workflows/shared_label_core_team_prs.yml @@ -0,0 +1,55 @@ +name: (Shared) Label Core Team PRs + +on: + pull_request_target: + types: [opened] + +permissions: {} + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + check_access: + runs-on: ubuntu-latest + outputs: + is_member_or_collaborator: ${{ steps.check_is_member_or_collaborator.outputs.is_member_or_collaborator }} + steps: + - run: echo ${{ github.event.pull_request.author_association }} + - name: Check is member or collaborator + id: check_is_member_or_collaborator + if: ${{ github.event.pull_request.author_association == 'MEMBER' || github.event.pull_request.author_association == 'COLLABORATOR' }} + run: echo "is_member_or_collaborator=true" >> "$GITHUB_OUTPUT" + + check_maintainer: + if: ${{ needs.check_access.outputs.is_member_or_collaborator == 'true' || needs.check_access.outputs.is_member_or_collaborator == true }} + needs: [check_access] + uses: facebook/react/.github/workflows/shared_check_maintainer.yml@main + permissions: + # Used by check_maintainer + contents: read + with: + actor: ${{ github.event.pull_request.user.login }} + + label: + if: ${{ needs.check_maintainer.outputs.is_core_team == 'true' }} + runs-on: ubuntu-latest + needs: check_maintainer + permissions: + # Used to add labels on issues + issues: write + # Used to add labels on PRs + pull-requests: write + steps: + - name: Label PR as React Core Team + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ github.event.number }}, + labels: ['React Core Team'] + }); diff --git a/.github/workflows/shared_lint.yml b/.github/workflows/shared_lint.yml new file mode 100644 index 00000000000..3c359cff228 --- /dev/null +++ b/.github/workflows/shared_lint.yml @@ -0,0 +1,110 @@ +name: (Shared) Lint + +on: + push: + branches: [main] + pull_request: + +permissions: {} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 + +jobs: + prettier: + name: Run prettier + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: shared-lint-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: yarn prettier-check + + eslint: + name: Run eslint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: shared-lint-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: node ./scripts/tasks/eslint + + check_license: + name: Check license + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: shared-lint-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: ./scripts/ci/check_license.sh + + test_print_warnings: + name: Test print warnings + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: | + **/node_modules + key: shared-lint-node_modules-v6-${{ runner.arch }}-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + - name: Ensure clean build directory + run: rm -rf build + - run: yarn install --frozen-lockfile + if: steps.node_modules.outputs.cache-hit != 'true' + - run: ./scripts/ci/test_print_warnings.sh diff --git a/.github/workflows/shared_stale.yml b/.github/workflows/shared_stale.yml new file mode 100644 index 00000000000..c24895edc5d --- /dev/null +++ b/.github/workflows/shared_stale.yml @@ -0,0 +1,55 @@ +# Configuration for stale action workflow - https://github.com/actions/stale +name: (Shared) Manage stale issues and PRs +on: + schedule: + # Run hourly + - cron: '0 * * * *' + workflow_dispatch: + +permissions: + # https://github.com/actions/stale/tree/v9/?tab=readme-ov-file#recommended-permissions + issues: write + pull-requests: write + +env: + TZ: /usr/share/zoneinfo/America/Los_Angeles + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + # --- Issues & PRs --- + # Number of days of inactivity before an issue or PR becomes stale + days-before-stale: 90 + # Number of days of inactivity before a stale issue or PR is closed + days-before-close: 7 + # API calls per run + operations-per-run: 100 + + # --- Issues --- + stale-issue-label: "Resolution: Stale" + # Comment to post when marking an issue as stale + stale-issue-message: > + This issue has been automatically marked as stale. + **If this issue is still affecting you, please leave any comment** (for example, "bump"), and we'll keep it open. + We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment! + # Comment to post when closing a stale issue + close-issue-message: > + Closing this issue after a prolonged period of inactivity. If this issue is still present in the latest release, please create a new issue with up-to-date information. Thank you! + # Issues with these labels will never be considered stale + exempt-issue-labels: "Partner,React Core Team,Resolution: Backlog,Type: Bug,Type: Discussion,Type: Needs Investigation,Type: Regression,Type: Feature Request,Type: Enhancement" + + # --- PRs --- + stale-pr-label: "Resolution: Stale" + # Comment to post when marking a pull request as stale + stale-pr-message: > + This pull request has been automatically marked as stale. + **If this pull request is still relevant, please leave any comment** (for example, "bump"), and we'll keep it open. + We are sorry that we haven't been able to prioritize reviewing it yet. Your contribution is very much appreciated. + # Comment to post when closing a stale pull request + close-pr-message: > + Closing this pull request after a prolonged period of inactivity. If this issue is still present in the latest release, please ask for this pull request to be reopened. Thank you! + # PRs with these labels will never be considered stale + exempt-pr-labels: "Partner,React Core Team,Resolution: Backlog,Type: Bug,Type: Discussion,Type: Needs Investigation,Type: Regression,Type: Feature Request,Type: Enhancement" diff --git a/.gitignore b/.gitignore index 18dfb23662d..d2aefb62026 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,16 @@ .DS_STORE node_modules +scripts/flow/*/.flowconfig +.flowconfig *~ *.pyc -static .grunt _SpecRunner.html __benchmarks__ build/ +remote-repo/ coverage/ .module-cache -*.gem -docs/.bundle -docs/code -docs/_site -docs/.sass-cache -docs/js/* -docs/downloads/*.zip -docs/vendor/bundle -examples/shared/*.js -examples/**/bundle.js fixtures/dom/public/react-dom.js fixtures/dom/public/react.js test/the-files-to-test.generated.js @@ -29,3 +21,21 @@ chrome-user-data .idea *.iml .vscode +*.swp +*.swo +/tmp + +packages/react-devtools-core/dist +packages/react-devtools-extensions/chrome/build +packages/react-devtools-extensions/chrome/*.crx +packages/react-devtools-extensions/chrome/*.pem +packages/react-devtools-extensions/firefox/build +packages/react-devtools-extensions/firefox/*.xpi +packages/react-devtools-extensions/firefox/*.pem +packages/react-devtools-extensions/shared/build +packages/react-devtools-extensions/.tempUserDataDir +packages/react-devtools-fusebox/dist +packages/react-devtools-inline/dist +packages/react-devtools-shell/dist +packages/react-devtools-timeline/dist + diff --git a/.mailmap b/.mailmap index 9cc962d3e82..e661c3707d5 100644 --- a/.mailmap +++ b/.mailmap @@ -11,8 +11,6 @@ Andrew Kulakov Andrew Sokolov Anto Aravinth Baraa Hamodi -Ben Alpert -Ben Alpert Ben Halpern Ben Newman Benjamin Woodruff @@ -90,6 +88,7 @@ Kevin Coughlin Krystian Karczewski Kunal Mehta Laurence Rowe +Lea Rosema Marcin K. Mark Anderson Mark Funk @@ -128,6 +127,8 @@ Rainer Oviir Ray Richard Feldman Richard Livesey +Rick Hanlon +Rick Hanlon Rob Arnold Robert Binna Robin Frischmann @@ -137,11 +138,16 @@ Sebastian Markbåge Sergey Rubanov Shogun Sea Soichiro Kawamura +Sophie Alpert +Sophie Alpert +Sophie Alpert +Sophie Alpert Sota Ohara Steven Luscher Steven Luscher Steven Luscher Steven Luscher +Seth Webster Stoyan Stefanov Tengfei Guo Thomas Aylott diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..5f53e875de6 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.19.0 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..7e09af76a3a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,41 @@ +# react runtime +build + +packages/react-devtools-core/dist +packages/react-devtools-extensions/chrome/build +packages/react-devtools-extensions/firefox/build +packages/react-devtools-extensions/edge/build +packages/react-devtools-extensions/shared/build +packages/react-devtools-extensions/src/ErrorTesterCompiled.js +packages/react-devtools-fusebox/dist +packages/react-devtools-inline/dist +packages/react-devtools-shared/src/hooks/__tests__/__source__/__compiled__/ +packages/react-devtools-shared/src/hooks/__tests__/__source__/__untransformed__/ +packages/react-devtools-shell/dist +packages/react-devtools-timeline/dist +packages/react-devtools-timeline/static + +# react compiler +compiler/**/dist +compiler/**/__tests__/fixtures/**/*.expect.md +compiler/**/.next + +# contains invalid graphql`...` which results in a promise rejection error from `yarn prettier-all`. +compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.todo-kitchensink.js + +compiler/crates +compiler/target +compiler/apps/playground/public + +compiler/**/LICENSE +compiler/*.md* +compiler/*.json +compiler/*.css +compiler/*.webmanifest +compiler/*.map +compiler/*.sh +compiler/*.txt +compiler/*.ico +compiler/*.svg +compiler/*.lock +compiler/*.toml diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000000..aa54cbae1f9 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,34 @@ +'use strict'; + +const {esNextPaths} = require('./scripts/shared/pathsByLanguageVersion'); + +module.exports = { + bracketSpacing: false, + singleQuote: true, + bracketSameLine: true, + trailingComma: 'es5', + printWidth: 80, + parser: 'flow', + arrowParens: 'avoid', + overrides: [ + { + files: ['*.code-workspace'], + options: { + parser: 'json-stringify', + }, + }, + { + files: esNextPaths, + options: { + trailingComma: 'all', + }, + }, + { + files: ['*.ts', '*.tsx'], + options: { + trailingComma: 'all', + parser: 'typescript', + }, + }, + ], +}; diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a1989ffb476..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,134 +0,0 @@ ---- -sudo: required -dist: trusty -language: node_js -node_js: -- 6 -rvm: -- 2.2.3 -cache: - directories: - - docs/vendor/bundle - - node_modules - - $HOME/.yarn-cache -before_install: -- | - echo "machine github.com login reactjs-bot password $GITHUB_TOKEN" >~/.netrc - unset GITHUB_TOKEN - - if [ "$TEST_TYPE" != build_website ] && \ - ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.md$)|(^(docs|examples))/' - then - echo "Only docs were updated, stopping build process." - exit - fi - - sudo apt-key adv --fetch-keys http://dl.yarnpkg.com/debian/pubkey.gpg - echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list - sudo apt-get update -qq - sudo apt-get install -y -qq yarn - yarn --version -install: -- | - yarn install -script: -- | - if [ "$TEST_TYPE" = build_website ]; then - if [ "$TRAVIS_BRANCH" = "$REACT_WEBSITE_BRANCH" ] && [ "$TRAVIS_PULL_REQUEST" = false ]; then - set -e - - GH_PAGES_DIR="$TRAVIS_BUILD_DIR"/../react-gh-pages - git config --global user.name "$GITHUB_USER_NAME" - git config --global user.email "$GITHUB_USER_EMAIL" - - git clone --branch gh-pages --depth=50 \ - https://reactjs-bot@github.com/facebook/react.git \ - $GH_PAGES_DIR - pushd docs - bundle install --jobs=3 --retry=3 --path=vendor/bundle - bundle exec rake release - cd $GH_PAGES_DIR - git status - if test -n "$(git status --porcelain)"; then - git add -A . - git commit -m "Rebuild website" - git push origin gh-pages - fi - popd - fi - elif [ "$TEST_TYPE" = build ]; then - if [ "$SERVER" ]; then - set -e - ./node_modules/.bin/grunt build - curl \ - -F "react=@build/react.js" \ - -F "react.min=@build/react.min.js" \ - -F "react-dom=@build/react-dom.js" \ - -F "react-dom.min=@build/react-dom.min.js" \ - -F "react-dom-server=@build/react-dom-server.js" \ - -F "react-dom-server.min=@build/react-dom-server.min.js" \ - -F "npm-react=@build/packages/react.tgz" \ - -F "npm-react-dom=@build/packages/react-dom.tgz" \ - -F "npm-react-native=@build/packages/react-native-renderer.tgz" \ - -F "commit=$TRAVIS_COMMIT" \ - -F "date=`git log --format='%ct' -1`" \ - -F "pull_request=$TRAVIS_PULL_REQUEST" \ - -F "token=$SECRET_TOKEN" \ - -F "branch=$TRAVIS_BRANCH" \ - $SERVER - fi - elif [ "$TEST_TYPE" = test ]; then - set -e - ./node_modules/.bin/grunt jest:coverage - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls - - echo 'Testing in server-render (HTML generation) mode...' - printf '\nmodule.exports.useCreateElement = false;\n' \ - >> src/renderers/dom/shared/ReactDOMFeatureFlags.js - ./node_modules/.bin/grunt jest:normal - git checkout -- src/renderers/dom/shared/ReactDOMFeatureFlags.js - - echo 'Testing in fiber mode...' - scripts/fiber/record-tests --track-facts - git --no-pager diff scripts/fiber - FIBER_TESTS_STATUS=$(git status --porcelain scripts/fiber) - test -z "$FIBER_TESTS_STATUS" - - ./node_modules/.bin/gulp react:extract-errors - elif [ "$TEST_TYPE" = flow ]; then - set -e - ./node_modules/.bin/grunt flow - - ALL_FILES=`find src -name '*.js' | grep -v umd/ | grep -v __tests__ | grep -v __mocks__` - COUNT_ALL_FILES=`echo "$ALL_FILES" | wc -l` - COUNT_WITH_FLOW=`grep '@flow' $ALL_FILES | perl -pe 's/:.+//' | wc -l` - node scripts/facts-tracker/index.js \ - "flow-files" "$COUNT_WITH_FLOW/$COUNT_ALL_FILES" - - else - ./node_modules/.bin/grunt $TEST_TYPE - fi -env: - matrix: - - TEST_TYPE=build - - TEST_TYPE=test - - TEST_TYPE=lint - - TEST_TYPE=flow - - TEST_TYPE=build_website - global: - # SERVER - - secure: qPvsJ46XzGrdIuPA70b55xQNGF8jcK7N1LN5CCQYYocXLa+fBrl+fTE77QvehOPhqwJXcj6kOxI+sY0KrVwV7gmq2XY2HZGWUSCxTN0SZlNIzqPA80Y7G/yOjA4PUt8LKgP+8tptyhTAY56qf+hgW8BoLiKOdztYF2p+3zXOLuA= - # SECRET_TOKEN - - secure: dkpPW+VnoqC/okhRdV90m36NcyBFhcwEKL3bNFExAwi0dXnFao8RoFlvnwiPlA23h2faROkMIetXlti6Aju08BgUFV+f9aL6vLyU7gUent4Nd3413zf2fwDtXIWIETg6uLnOpSykGKgCAT/hY3Q2oPLqOoY0OxfgnbqwxkxljrE= - # GITHUB_TOKEN - - secure: Sn+HwLSkbgM5MqVszq/CJHcOsZax17zwW0ILpGgAaEKD6MHNmEBdc71skaLr+6R4gHVO5ybV2cgSxHuBLHKzYoidq5ksGKRHNeXfyOv8jeHGTN/FjwMQbM+WkIK3wFroLsuQ1kW2FBfFEXqx4rET6GXwdcqycGl8GSFB1l0VNzE= - # COVERALLS_TOKEN - - secure: h/cUq+TrUMZOQmkFD7CvuwX0uAwmjIfKZ4qSUzY+QzUtDzOzA0L/XF84xTBq1Q5YYsEiaoF6GxxGCdrLQiBA/ZTd+88UHgeZPMRvi0xG9Q+PeePVOsZMTxy4/WWFgOfSQCk49Mj9zizGgO78i6vxq+SDXMtFHnZ+TpPJIEW6/m0= -notifications: - irc: - use_notice: true - skip_join: true - on_success: change - on_failure: change - channels: - - chat.freenode.net#reactjs diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 6974551184d..00000000000 --- a/AUTHORS +++ /dev/null @@ -1,696 +0,0 @@ -839 <8398a7@gmail.com> -Aaron Franks -Aaron Gelter -Adam Bloomston -Adam Krebs -Adam Mark -Adam Solove -Adam Timberlake -Adam Zapletal -Ahmad Wali Sidiqi -Alan Plum -Alan Souza -Alan deLevie -Alastair Hole -Alex -Alex Boatwright -Alex Boyd -Alex Dajani -Alex Lopatin -Alex Mykyta -Alex Pien -Alex Smith -Alex Zelenskiy -Alexander Shtuchkin -Alexander Solovyov -Alexander Tseung -Alexandre Gaudencio -Alexey Raspopov -Alexey Shamrin -Ali Ukani -Andre Z Sanchez -Andreas Savvides -Andreas Svensson -Andres Kalle -Andres Suarez -Andrew Clark -Andrew Cobby -Andrew Davey -Andrew Henderson -Andrew Kulakov -Andrew Rasmussen -Andrew Sokolov -Andrew Zich -Andrey Popp <8mayday@gmail.com> -Anthony van der Hoorn -Anto Aravinth -Antonio Ruberto -Antti Ahti -Anuj Tomar -AoDev -April Arcus -Areeb Malik -Aria Buckles -Aria Stewart -Arian Faurtosh -Artem Nezvigin -Austin Wright -Ayman Osman -Baraa Hamodi -Bartosz Kaszubowski -Basarat Ali Syed -Battaile Fauber -Beau Smith -Ben Alpert -Ben Anderson -Ben Brooks -Ben Foxall -Ben Halpern -Ben Jaffe -Ben Moss -Ben Newman -Ben Ripkens -Benjamin Keen -Benjamin Leiken -Benjamin Woodruff -Benjy Cui -Bill Blanchard -Bill Fisher -Blaine Hatab -Blaine Kasten -Bob Eagan -Bob Ralian -Bob Renwick -Bobby -Bojan Mihelac -Bradley Spaulding -Brandon Bloom -Brandon Tilley -Brenard Cubacub -Brian Cooke -Brian Holt -Brian Hsu -Brian Kim -Brian Kung -Brian Reavis -Brian Rue -Bruno Škvorc -Cam Song -Cam Spiers -Cameron Chamberlain -Cameron Matheson -Carter Chung -Cassus Adam Banko -Cat Chen -Cedric Sohrauer -Cesar William Alvarenga -Changsoon Bok -Charles Marsh -Chase Adams -Cheng Lou -Chitharanjan Das -Chris Bolin -Chris Grovers -Chris Ha -Chris Rebert -Chris Sciolla -Christian Alfoni -Christian Oliff -Christian Roman -Christoffer Sawicki -Christoph Pojer -Christopher Monsanto -Clay Allsopp -Connor McSheffrey -Conor Hastings -Cory House -Cotton Hou -Craig Akimoto -Cristovao Verstraeten -Damien Pellier -Dan Abramov -Dan Fox -Dan Schafer -Daniel Carlsson -Daniel Cousens -Daniel Friesen -Daniel Gasienica -Daniel Hejl -Daniel Hejl -Daniel Lo Nigro -Daniel Mané -Daniel Miladinov -Daniel Rodgers-Pryor -Daniel Schonfeld -Danny Ben-David -Darcy -Daryl Lau -Darío Javier Cravero -Dave Galbraith -David Baker -David Ed Mellum -David Goldberg -David Granado -David Greenspan -David Hellsing -David Hu -David Khourshid -David Mininger -David Neubauer -David Percy -Dean Shi -Denis Sokolov -Deniss Jacenko -Dennis Johnson -Devon Blandin -Devon Harvey -Dmitrii Abramov -Dmitriy Rozhkov -Dmitry Blues -Dmitry Mazuro -Domenico Matteo -Don Abrams -Dongsheng Liu -Dustan Kasten -Dustin Getz -Dylan Harrington -Eduardo Garcia -Edvin Erikson -Elaine Fang -Enguerran -Eric Clemmons -Eric Eastwood -Eric Florenzano -Eric O'Connell -Eric Schoffstall -Erik Harper -Espen Hovlandsdal -Evan Coonrod -Evan Vosberg -Fabio M. Costa -Federico Rampazzo -Felipe Oliveira Carvalho -Felix Gnass -Felix Kling -Fernando Correia -Frankie Bagnardi -François-Xavier Bois -Fred Zhao -Freddy Rangel -Fyodor Ivanishchev -G Scott Olson -G. Kay Lee -Gabe Levi -Gajus Kuizinas -Gareth Nicholson -Garren Smith -Gavin McQuistin -Geert Pasteels -Geert-Jan Brits -George A Sisco III -Georgii Dolzhykov -Gilbert -Glen Mailer -Grant Timmerman -Greg Hurrell -Greg Perkins -Greg Roodt -Gregory -Guangqiang Dong -Guido Bouman -Harry Hull -Harry Marr -Harry Moreno -Harshad Sabne -Hekar Khani -Hendrik Swanepoel -Henrik Nyh -Henry Wong -Henry Zhu -Hideo Matsumoto -Hou Chia -Huang-Wei Chang -Hugo Agbonon -Hugo Jobling -Hyeock Kwon -Héliton Nordt -Ian Obermiller -Ignacio Carbajo -Igor Scekic -Ilia Pavlenkov -Ilya Shuklin -Ilyá Belsky -Ingvar Stepanyan -Irae Carvalho -Isaac Salier-Hellendag -Iurii Kucherov -Ivan Kozik -Ivan Krechetov -Ivan Vergiliev -J. Andrew Brassington -J. Renée Beach -JD Isaacks -JJ Weber -JW -Jack Zhang -Jackie Wung -Jacob Gable -Jacob Greenleaf -Jae Hun Ro -Jaeho Lee -Jaime Mingo -Jake Worth -Jakub Malinowski -James -James Brantly -James Burnett -James Friend -James Ide -James Long -James Pearce -James Seppi -James South -James Wen -Jamie Wong -Jamis Charles -Jamison Dance -Jan Hancic -Jan Kassens -Jan Raasch -Jared Forsyth -Jason -Jason Bonta -Jason Ly -Jason Miller -Jason Quense -Jason Trill -Jason Webster -Jay Jaeho Lee -Jean Lauliac -Jed Watson -Jeff Barczewski -Jeff Carpenter -Jeff Chan -Jeff Hicken -Jeff Kolesky -Jeff Morrison -Jeff Welch -Jeffrey Lin -Jeremy Fairbank -Jesse Skinner -Jignesh Kakadiya -Jim OBrien -Jim Sproch -Jimmy Jea -Jing Chen -Jinwoo Oh -Jinxiu Lee -Jiyeon Seo -Jody McIntyre -Joe Critchley -Joe Stein -Joel Auterson -Johannes Baiter -Johannes Emerich -Johannes Lumpe -John Heroy -John Ryan -John Watson -John-David Dalton -Jon Beebe -Jon Chester -Jon Hester -Jon Madison -Jon Scott Clark -Jon Tewksbury -Jonas Enlund -Jonas Gebhardt -Jonathan Hsu -Jonathan Persson -Jordan Harband -Jordan Walke -Jorrit Schippers -Joseph Nudell -Joseph Savona -Josh Bassett -Josh Duck -Josh Perez -Josh Yudaken -Joshua Evans -Joshua Go -Joshua Goldberg -Joshua Ma -João Valente -Juan Serrano -Julen Ruiz Aizpuru -Julian Viereck -Julien Bordellier -Julio Lopez -Jun Wu -Juraj Dudak -Justas Brazauskas -Justin Jaffray -Justin Robison -Justin Woo -Kale -Kamron Batman -Karl Mikkelsen -Karpich Dmitry -Keito Uchiyama -Ken Powers -Kent C. Dodds -Kevin Cheng <09chengk@gmail.com> -Kevin Coughlin -Kevin Huang -Kevin Lau -Kevin Old -Kevin Robinson -Kewei Jiang -Kier Borromeo -KimCoding -Kirk Steven Hansen -Kit Randel -Kohei TAKATA -Koo Youngmin -Krystian Karczewski -Kunal Mehta -Kurt Ruppel -Kyle Kelley -Kyle Mathews -Laurence Rowe -Laurent Etiemble -Lee Byron -Lee Jaeyoung -Lei -Leland Richardson -Leon Fedotov -Leon Yip -Leonardo YongUk Kim -Levi Buzolic -Levi McCallum -Lily -Logan Allen -Lovisa Svallingson -Ludovico Fischer -Luigy Leon -Luke Horvat -MIKAMI Yoshiyuki -Maher Beg -Manas -Marcin K. -Marcin Kwiatkowski -Marcin Szczepanski -Mariano Desanze -Marjan -Mark Anderson -Mark Funk -Mark Hintz -Mark IJbema -Mark Murphy -Mark Richardson -Mark Rushakoff -Mark Sun -Marlon Landaverde -Marshall Roch -Martin Andert -Martin Hujer -Martin Jul -Martin Konicek -Martin Mihaylov -Masaki KOBAYASHI -Mathieu M-Gosselin -Mathieu Savy -Matias Singers -Matsunoki -Matt Brookes -Matt Dunn-Rankin -Matt Harrison -Matt Huggins -Matt Stow -Matt Zabriskie -Matthew Dapena-Tretter -Matthew Herbst -Matthew Hodgson -Matthew Johnston -Matthew King -Matthew Looi -Matthew Miner -Matthias Le Brun -Matti Nelimarkka -Mattijs Kneppers -Max F. Albrecht <1@178.is> -Max Heiber -Max Stoiber -Maxi Ferreira -Maxim Abramchuk -Merrick Christensen -Mert Kahyaoğlu -Michael Chan -Michael McDermott -Michael Randers-Pehrson -Michael Ridgway -Michael Warner -Michael Wiencek -Michael Ziwisky -Michal Srb -Michelle Todd -Mihai Parparita -Mike D Pilsbury -Mike Groseclose -Mike Nordick -Mikolaj Dadela -Miles Johnson -Minwe LUO -Miorel Palii -Morhaus -Moshe Kolodny -Mouad Debbar -Murad -Murray M. Moss -Nadeesha Cabral -Naman Goel -Nate Hunzaker -Nate Lee -Nathan Smith -Nathan White -Nee <944316342@qq.com> -Neri Marschik -Nguyen Truong Duy -Nicholas Bergson-Shilcock -Nicholas Clawson -Nick Balestra -Nick Fitzgerald -Nick Gavalas -Nick Merwin -Nick Presta -Nick Raienko -Nick Thompson -Nick Williams -Niklas Boström -Ning Xia -Niole Nelson -Oiva Eskola -Oleg -Oleksii Markhovskyi -Oliver Zeigermann -Olivier Tassinari -Owen Coutts -Pablo Lacerda de Miranda -Paolo Moretti -Pascal Hartig -Patrick -Patrick Laughlin -Patrick Stapleton -Paul Benigeri -Paul Harper -Paul O’Shannessy -Paul Seiffert -Paul Shen -Pedro Nauck -Pete Hunt -Peter Blazejewicz -Peter Cottle -Peter Jaros -Peter Newnham -Petri Lehtinen -Petri Lievonen -Pieter Vanderwerff -Pouja Nikray -Prathamesh Sonpatki -Prayag Verma -Preston Parry -Rafael -Rafal Dittwald -Rainer Oviir -Rajat Sehgal -Rajiv Tirumalareddy -Ram Kaniyur -Randall Randall -Ray -Raymond Ha -Reed Loden -Remko Tronçon -Richard D. Worth -Richard Feldman -Richard Kho -Richard Littauer -Richard Livesey -Richard Wood -Rick Beerendonk -Rick Ford -Riley Tomasek -Rob Arnold -Robert Binna -Robert Knight -Robert Sedovsek -Robin Berjon -Robin Frischmann -Roman Pominov -Roman Vanesyan -Russ -Ryan Seddon -Sahat Yalkabov -Saif Hakim -Saiichi Hashimoto -Sam Beveridge -Sam Saccone -Sam Selikoff -Samy Al Zahrani -Sander Spies -Scott Burch -Scott Feeney -Sean Kinsey -Sebastian Markbåge -Sebastian McKenzie -Seoh Char -Sercan Eraslan -Serg -Sergey Generalov -Sergey Rubanov -Seyi Adebajo -Shane O'Sullivan -Shaun Trennery -ShihChi Huang -Shim Won -Shinnosuke Watanabe -Shogun Sea -Shota Kubota -Shripad K -Sibi -Simen Bekkhus -Simon Højberg -Simon Welsh -Simone Vittori -Soichiro Kawamura -Sophia Westwood -Sota Ohara -Spencer Handley -Stefan Dombrowski -Stephen Murphy -Sterling Cobb -Steve Baker <_steve_@outlook.com> -Steven Luscher -Steven Vachon -Stoyan Stefanov -Sundeep Malladi -Sunny Juneja -Sven Helmberger -Sverre Johansen -Sébastien Lorber -Sławomir Laskowski -Taeho Kim -Tay Yang Shun -Ted Kim -Tengfei Guo -Teodor Szente -Thomas Aylott -Thomas Boyt -Thomas Broadley -Thomas Reggi -Thomas Röggla -Thomas Shaddox -Thomas Shafer -ThomasCrvsr -Tienchai Wirojsaksaree -Tim Routowicz -Tim Schaub -Timothy Yung -Timur Carpeev -Tobias Reiss -Tom Duncalf -Tom Haggie -Tom Hauburger -Tom MacWright -Tom Occhino -Tomasz Kołodziejski -Tomoya Suzuki -Tony Spiro -Toru Kobayashi -Trinh Hoang Nhu -Tsung Hung -Tyler Brock -Ustin Zarubin -Vadim Chernysh -Varun Rau -Vasiliy Loginevskiy -Victor Alvarez -Victor Homyakov -Victor Koenders -Ville Immonen -Vincent Riemer -Vincent Siao -Vipul A M -Vitaly Kramskikh -Vitor Balocco -Vjeux -Volkan Unsal -Wander Wang -Wayne Larsen -WickyNilliams -Wincent Colaiuta -Wout Mertens -Xavier Morel -XuefengWu -Yakov Dalinchuk -Yasar icli -YouBao Nong -Yuichi Hagio -Yuriy Dybskiy -Yutaka Nakajima -Yuval Dekel -Zach Bruggeman -Zach Ramaekers -Zacharias -Zeke Sikelianos -Zhangjd -adraeth -arush -brafdlog -chen -clariroid -claudiopro -cutbko -davidxi -dongmeng.ldm -iamchenxin -iamdoron -iawia002 -imagentleman -koh-taka -kohashi85 -laiso -leeyoungalias -li.li -maxprafferty -rgarifullin -songawee -sugarshin -wali-s -yiminghe -youmoo -zhangjg -zwhitchcox -Árni Hermann Reynisson -元彦 -凌恒 -张敏 diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ce56e7e778..5953fafc278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,20 +1,1653 @@ -## 15.4.2 (January 6, 2017) +## 19.2.1 (Dec 3, 2025) + +### React Server Components + +- Bring React Server Component fixes to Server Actions (@sebmarkbage [#35277](https://github.com/facebook/react/pull/35277)) + +## 19.2.0 (October 1st, 2025) + +Below is a list of all new features, APIs, and bug fixes. + +Read the [React 19.2 release post](https://react.dev/blog/2025/10/01/react-19-2) for more information. + +### New React Features + +- [``](https://react.dev/reference/react/Activity): A new API to hide and restore the UI and internal state of its children. +- [`useEffectEvent`](https://react.dev/reference/react/useEffectEvent) is a React Hook that lets you extract non-reactive logic into an [Effect Event](https://react.dev/learn/separating-events-from-effects#declaring-an-effect-event). +- [`cacheSignal`](https://react.dev/reference/react/cacheSignal) (for RSCs) lets your know when the `cache()` lifetime is over. +- [React Performance tracks](https://react.dev/reference/dev-tools/react-performance-tracks) appear on the Performance panel’s timeline in your browser developer tools + +### New React DOM Features + +- Added resume APIs for partial pre-rendering with Web Streams: + - [`resume`](https://react.dev/reference/react-dom/server/resume): to resume a prerender to a stream. + - [`resumeAndPrerender`](https://react.dev/reference/react-dom/static/resumeAndPrerender): to resume a prerender to HTML. +- Added resume APIs for partial pre-rendering with Node Streams: + - [`resumeToPipeableStream`](https://react.dev/reference/react-dom/server/resumeToPipeableStream): to resume a prerender to a stream. + - [`resumeAndPrerenderToNodeStream`](https://react.dev/reference/react-dom/static/resumeAndPrerenderToNodeStream): to resume a prerender to HTML. +- Updated [`prerender`](https://react.dev/reference/react-dom/static/prerender) APIs to return a `postponed` state that can be passed to the `resume` APIs. + +### Notable changes + +- React DOM now batches suspense boundary reveals, matching the behavior of client side rendering. This change is especially noticeable when animating the reveal of Suspense boundaries e.g. with the upcoming `` Component. React will batch as much reveals as possible before the first paint while trying to hit popular first-contentful paint metrics. +- Add Node Web Streams (`prerender`, `renderToReadableStream`) to server-side-rendering APIs for Node.js +- Use underscore instead of `:` IDs generated by useId + +### All Changes + +#### React + +- `` was developed over many years, starting before `ClassComponent.setState` (@acdlite @sebmarkbage and many others) +- Stringify context as "SomeContext" instead of "SomeContext.Provider" (@kassens [#33507](https://github.com/facebook/react/pull/33507)) +- Include stack of cause of React instrumentation errors with `%o` placeholder (@eps1lon [#34198](https://github.com/facebook/react/pull/34198)) +- Fix infinite `useDeferredValue` loop in popstate event (@acdlite [#32821](https://github.com/facebook/react/pull/32821)) +- Fix a bug when an initial value was passed to `useDeferredValue` (@acdlite [#34376](https://github.com/facebook/react/pull/34376)) +- Fix a crash when submitting forms with Client Actions (@sebmarkbage [#33055](https://github.com/facebook/react/pull/33055)) +- Hide/unhide the content of dehydrated suspense boundaries if they resuspend (@sebmarkbage [#32900](https://github.com/facebook/react/pull/32900)) +- Avoid stack overflow on wide trees during Hot Reload (@sophiebits [#34145](https://github.com/facebook/react/pull/34145)) +- Improve Owner and Component stacks in various places (@sebmarkbage, @eps1lon: [#33629](https://github.com/facebook/react/pull/33629), [#33724](https://github.com/facebook/react/pull/33724), [#32735](https://github.com/facebook/react/pull/32735), [#33723](https://github.com/facebook/react/pull/33723)) +- Add `cacheSignal` (@sebmarkbage [#33557](https://github.com/facebook/react/pull/33557)) + +#### React DOM + +- Block on Suspensey Fonts during reveal of server-side-rendered content (@sebmarkbage [#33342](https://github.com/facebook/react/pull/33342)) +- Use underscore instead of `:` for IDs generated by `useId` (@sebmarkbage, @eps1lon: [#32001](https://github.com/facebook/react/pull/32001), [https://github.com/facebook/react/pull/33342](https://github.com/facebook/react/pull/33342)[#33099](https://github.com/facebook/react/pull/33099), [#33422](https://github.com/facebook/react/pull/33422)) +- Stop warning when ARIA 1.3 attributes are used (@Abdul-Omira [#34264](https://github.com/facebook/react/pull/34264)) +- Allow `nonce` to be used on hoistable styles (@Andarist [#32461](https://github.com/facebook/react/pull/32461)) +- Warn for using a React owned node as a Container if it also has text content (@sebmarkbage [#32774](https://github.com/facebook/react/pull/32774)) +- s/HTML/text for for error messages if text hydration mismatches (@rickhanlonii [#32763](https://github.com/facebook/react/pull/32763)) +- Fix a bug with `React.use` inside `React.lazy`\-ed Component (@hi-ogawa [#33941](https://github.com/facebook/react/pull/33941)) +- Enable the `progressiveChunkSize` option for server-side-rendering APIs (@sebmarkbage [#33027](https://github.com/facebook/react/pull/33027)) +- Fix a bug with deeply nested Suspense inside Suspense fallback when server-side-rendering (@gnoff [#33467](https://github.com/facebook/react/pull/33467)) +- Avoid hanging when suspending after aborting while rendering (@gnoff [#34192](https://github.com/facebook/react/pull/34192)) +- Add Node Web Streams to server-side-rendering APIs for Node.js (@sebmarkbage [#33475](https://github.com/facebook/react/pull/33475)) + +#### React Server Components + +- Preload `` and `` using hints before they're rendered (@sebmarkbage [#34604](https://github.com/facebook/react/pull/34604)) +- Log error if production elements are rendered during development (@eps1lon [#34189](https://github.com/facebook/react/pull/34189)) +- Fix a bug when returning a Temporary reference (e.g. a Client Reference) from Server Functions (@sebmarkbage [#34084](https://github.com/facebook/react/pull/34084), @denk0403 [#33761](https://github.com/facebook/react/pull/33761)) +- Pass line/column to `filterStackFrame` (@eps1lon [#33707](https://github.com/facebook/react/pull/33707)) +- Support Async Modules in Turbopack Server References (@lubieowoce [#34531](https://github.com/facebook/react/pull/34531)) +- Add support for .mjs file extension in Webpack (@jennyscript [#33028](https://github.com/facebook/react/pull/33028)) +- Fix a wrong missing key warning (@unstubbable [#34350](https://github.com/facebook/react/pull/34350)) +- Make console log resolve in predictable order (@sebmarkbage [#33665](https://github.com/facebook/react/pull/33665)) + +#### React Reconciler + +- [createContainer](https://github.com/facebook/react/blob/v19.2.0/packages/react-reconciler/src/ReactFiberReconciler.js#L255-L261) and [createHydrationContainer](https://github.com/facebook/react/blob/v19.2.0/packages/react-reconciler/src/ReactFiberReconciler.js#L305-L312) had their parameter order adjusted after `on*` handlers to account for upcoming experimental APIs + +## 19.1.2 (Dec 3, 2025) + +### React Server Components + +- Bring React Server Component fixes to Server Actions (@sebmarkbage [#35277](https://github.com/facebook/react/pull/35277)) + +## 19.1.1 (July 28, 2025) + +### React +* Fixed Owner Stacks to work with ES2015 function.name semantics ([#33680](https://github.com/facebook/react/pull/33680) by @hoxyq) + +## 19.1.0 (March 28, 2025) + +### Owner Stack + +An Owner Stack is a string representing the components that are directly responsible for rendering a particular component. You can log Owner Stacks when debugging or use Owner Stacks to enhance error overlays or other development tools. Owner Stacks are only available in development builds. Component Stacks in production are unchanged. + +* An Owner Stack is a development-only stack trace that helps identify which components are responsible for rendering a particular component. An Owner Stack is distinct from a Component Stacks, which shows the hierarchy of components leading to an error. +* The [captureOwnerStack API](https://react.dev/reference/react/captureOwnerStack) is only available in development mode and returns a Owner Stack, if available. The API can be used to enhance error overlays or log component relationships when debugging. [#29923](https://github.com/facebook/react/pull/29923), [#32353](https://github.com/facebook/react/pull/32353), [#30306](https://github.com/facebook/react/pull/30306), +[#32538](https://github.com/facebook/react/pull/32538), [#32529](https://github.com/facebook/react/pull/32529), [#32538](https://github.com/facebook/react/pull/32538) + +### React +* Enhanced support for Suspense boundaries to be used anywhere, including the client, server, and during hydration. [#32069](https://github.com/facebook/react/pull/32069), [#32163](https://github.com/facebook/react/pull/32163), [#32224](https://github.com/facebook/react/pull/32224), [#32252](https://github.com/facebook/react/pull/32252) +* Reduced unnecessary client rendering through improved hydration scheduling [#31751](https://github.com/facebook/react/pull/31751) +* Increased priority of client rendered Suspense boundaries [#31776](https://github.com/facebook/react/pull/31776) +* Fixed frozen fallback states by rendering unfinished Suspense boundaries on the client. [#31620](https://github.com/facebook/react/pull/31620) +* Reduced garbage collection pressure by improving Suspense boundary retries. [#31667](https://github.com/facebook/react/pull/31667) +* Fixed erroneous “Waiting for Paint” log when the passive effect phase was not delayed [#31526](https://github.com/facebook/react/pull/31526) +* Fixed a regression causing key warnings for flattened positional children in development mode. [#32117](https://github.com/facebook/react/pull/32117) +* Updated `useId` to use valid CSS selectors, changing format from `:r123:` to `«r123»`. [#32001](https://github.com/facebook/react/pull/32001) +* Added a dev-only warning for null/undefined created in useEffect, useInsertionEffect, and useLayoutEffect. [#32355](https://github.com/facebook/react/pull/32355) +* Fixed a bug where dev-only methods were exported in production builds. React.act is no longer available in production builds. [#32200](https://github.com/facebook/react/pull/32200) +* Improved consistency across prod and dev to improve compatibility with Google Closure Compiler and bindings [#31808](https://github.com/facebook/react/pull/31808) +* Improve passive effect scheduling for consistent task yielding. [#31785](https://github.com/facebook/react/pull/31785) +* Fixed asserts in React Native when passChildrenWhenCloningPersistedNodes is enabled for OffscreenComponent rendering. [#32528](https://github.com/facebook/react/pull/32528) +* Fixed component name resolution for Portal [#32640](https://github.com/facebook/react/pull/32640) +* Added support for beforetoggle and toggle events on the dialog element. [#32479](https://github.com/facebook/react/pull/32479) + +### React DOM +* Fixed double warning when the `href` attribute is an empty string [#31783](https://github.com/facebook/react/pull/31783) + * Fixed an edge case where `getHoistableRoot()` didn’t work properly when the container was a Document [#32321](https://github.com/facebook/react/pull/32321) +* Removed support for using HTML comments (e.g. ``) as a DOM container. [#32250](https://github.com/facebook/react/pull/32250) +* Added support for ` + + + + + +
+ + + + +`; + + return html; +} diff --git a/compiler/packages/react-mcp-server/src/types/algolia.ts b/compiler/packages/react-mcp-server/src/types/algolia.ts new file mode 100644 index 00000000000..1921dd3f718 --- /dev/null +++ b/compiler/packages/react-mcp-server/src/types/algolia.ts @@ -0,0 +1,100 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// https://github.com/algolia/docsearch/blob/15ebcba606b281aa0dddc4ccb8feb19d396bf79e/packages/docsearch-react/src/types/DocSearchHit.ts +type ContentType = + | 'content' + | 'lvl0' + | 'lvl1' + | 'lvl2' + | 'lvl3' + | 'lvl4' + | 'lvl5' + | 'lvl6'; + +interface DocSearchHitAttributeHighlightResult { + value: string; + matchLevel: 'full' | 'none' | 'partial'; + matchedWords: string[]; + fullyHighlighted?: boolean; +} + +interface DocSearchHitHighlightResultHierarchy { + lvl0: DocSearchHitAttributeHighlightResult; + lvl1: DocSearchHitAttributeHighlightResult; + lvl2: DocSearchHitAttributeHighlightResult; + lvl3: DocSearchHitAttributeHighlightResult; + lvl4: DocSearchHitAttributeHighlightResult; + lvl5: DocSearchHitAttributeHighlightResult; + lvl6: DocSearchHitAttributeHighlightResult; +} + +interface DocSearchHitHighlightResult { + content: DocSearchHitAttributeHighlightResult; + hierarchy: DocSearchHitHighlightResultHierarchy; + hierarchy_camel: DocSearchHitHighlightResultHierarchy[]; +} + +interface DocSearchHitAttributeSnippetResult { + value: string; + matchLevel: 'full' | 'none' | 'partial'; +} + +interface DocSearchHitSnippetResult { + content: DocSearchHitAttributeSnippetResult; + hierarchy: DocSearchHitHighlightResultHierarchy; + hierarchy_camel: DocSearchHitHighlightResultHierarchy[]; +} + +export declare type DocSearchHit = { + objectID: string; + content: string | null; + url: string; + url_without_anchor: string; + type: ContentType; + anchor: string | null; + hierarchy: { + lvl0: string; + lvl1: string; + lvl2: string | null; + lvl3: string | null; + lvl4: string | null; + lvl5: string | null; + lvl6: string | null; + }; + _highlightResult: DocSearchHitHighlightResult; + _snippetResult: DocSearchHitSnippetResult; + _rankingInfo?: { + promoted: boolean; + nbTypos: number; + firstMatchedWord: number; + proximityDistance?: number; + geoDistance: number; + geoPrecision?: number; + nbExactWords: number; + words: number; + filters: number; + userScore: number; + matchedGeoLocation?: { + lat: number; + lng: number; + distance: number; + }; + }; + _distinctSeqID?: number; + __autocomplete_indexName?: string; + __autocomplete_queryID?: string; + __autocomplete_algoliaCredentials?: { + appId: string; + apiKey: string; + }; + __autocomplete_id?: number; +}; + +export type InternalDocSearchHit = DocSearchHit & { + __docsearch_parent: InternalDocSearchHit | null; +}; diff --git a/compiler/packages/react-mcp-server/src/utils/algolia.ts b/compiler/packages/react-mcp-server/src/utils/algolia.ts new file mode 100644 index 00000000000..cfc08022db9 --- /dev/null +++ b/compiler/packages/react-mcp-server/src/utils/algolia.ts @@ -0,0 +1,119 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import type {DocSearchHit, InternalDocSearchHit} from '../types/algolia'; +import {liteClient, type Hit, type SearchResponse} from 'algoliasearch/lite'; + +// https://github.com/reactjs/react.dev/blob/55986965fbf69c2584040039c9586a01bd54eba7/src/siteConfig.js#L15-L19 +const ALGOLIA_CONFIG = { + appId: '1FCF9AYYAT', + apiKey: '1b7ad4e1c89e645e351e59d40544eda1', + indexName: 'beta-react', +}; + +export const ALGOLIA_CLIENT = liteClient( + ALGOLIA_CONFIG.appId, + ALGOLIA_CONFIG.apiKey, +); + +export function printHierarchy( + hit: DocSearchHit | InternalDocSearchHit, +): string { + let val = `${hit.hierarchy.lvl0} > ${hit.hierarchy.lvl1}`; + if (hit.hierarchy.lvl2 != null) { + val = val.concat(` > ${hit.hierarchy.lvl2}`); + } + if (hit.hierarchy.lvl3 != null) { + val = val.concat(` > ${hit.hierarchy.lvl3}`); + } + if (hit.hierarchy.lvl4 != null) { + val = val.concat(` > ${hit.hierarchy.lvl4}`); + } + if (hit.hierarchy.lvl5 != null) { + val = val.concat(` > ${hit.hierarchy.lvl5}`); + } + if (hit.hierarchy.lvl6 != null) { + val = val.concat(` > ${hit.hierarchy.lvl6}`); + } + return val; +} + +export async function queryAlgolia( + message: string | Array, +): Promise> { + const {results} = await ALGOLIA_CLIENT.search({ + requests: [ + { + query: Array.isArray(message) ? message.join('\n') : message, + indexName: ALGOLIA_CONFIG.indexName, + attributesToRetrieve: [ + 'hierarchy.lvl0', + 'hierarchy.lvl1', + 'hierarchy.lvl2', + 'hierarchy.lvl3', + 'hierarchy.lvl4', + 'hierarchy.lvl5', + 'hierarchy.lvl6', + 'content', + 'url', + ], + attributesToSnippet: [ + `hierarchy.lvl1:10`, + `hierarchy.lvl2:10`, + `hierarchy.lvl3:10`, + `hierarchy.lvl4:10`, + `hierarchy.lvl5:10`, + `hierarchy.lvl6:10`, + `content:10`, + ], + snippetEllipsisText: '…', + hitsPerPage: 30, + attributesToHighlight: [ + 'hierarchy.lvl0', + 'hierarchy.lvl1', + 'hierarchy.lvl2', + 'hierarchy.lvl3', + 'hierarchy.lvl4', + 'hierarchy.lvl5', + 'hierarchy.lvl6', + 'content', + ], + }, + ], + }); + const firstResult = results[0] as SearchResponse; + const {hits} = firstResult; + const deduped = new Map(); + for (const hit of hits) { + // drop hashes to dedupe properly + const u = new URL(hit.url); + if (deduped.has(u.pathname)) { + continue; + } + deduped.set(u.pathname, hit); + } + const pages: Array = await Promise.all( + Array.from(deduped.values()).map(hit => { + return fetch(hit.url, { + headers: { + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36', + }, + }).then(res => { + if (res.ok === true) { + return res.text(); + } else { + console.error( + `Could not fetch docs: ${res.status} ${res.statusText}`, + ); + return null; + } + }); + }), + ); + return pages.filter(page => page !== null); +} diff --git a/compiler/packages/react-mcp-server/src/utils/assertExhaustive.ts b/compiler/packages/react-mcp-server/src/utils/assertExhaustive.ts new file mode 100644 index 00000000000..2adfffa8d7e --- /dev/null +++ b/compiler/packages/react-mcp-server/src/utils/assertExhaustive.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Trigger an exhaustiveness check in TypeScript and throw at runtime. + */ +export default function assertExhaustive(_: never, errorMsg: string): never { + throw new Error(errorMsg); +} diff --git a/compiler/packages/react-mcp-server/todo.md b/compiler/packages/react-mcp-server/todo.md new file mode 100644 index 00000000000..a7f0af9adbe --- /dev/null +++ b/compiler/packages/react-mcp-server/todo.md @@ -0,0 +1,5 @@ +TODO + +- [ ] If code doesnt compile, read diagnostics and try again +- [ ] Provide detailed examples in assistant prompt (use another LLM to generate good prompts, iterate from there) +- [ ] Provide more tools for working with HIR/AST (eg so we can prompt it to try and optimize code via HIR, which it can then translate back into user code changes) diff --git a/compiler/packages/react-mcp-server/tsconfig.json b/compiler/packages/react-mcp-server/tsconfig.json new file mode 100644 index 00000000000..0de3a4a6151 --- /dev/null +++ b/compiler/packages/react-mcp-server/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "@tsconfig/strictest/tsconfig.json", + "compilerOptions": { + "module": "Node16", + "moduleResolution": "Node16", + "rootDir": "../", + "noEmit": true, + "jsx": "react-jsxdev", + "lib": ["ES2022"], + + // weaken strictness from preset + "importsNotUsedAsValues": "remove", + "noUncheckedIndexedAccess": false, + "noUnusedParameters": false, + "useUnknownInCatchVariables": false, + "target": "ES2022", + // ideally turn off only during dev, or on a per-file basis + "noUnusedLocals": false, + }, + "exclude": ["node_modules"], + "include": ["src/**/*.ts"], +} diff --git a/compiler/packages/react-mcp-server/tsup.config.ts b/compiler/packages/react-mcp-server/tsup.config.ts new file mode 100644 index 00000000000..820410e20f6 --- /dev/null +++ b/compiler/packages/react-mcp-server/tsup.config.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {defineConfig} from 'tsup'; + +export default defineConfig({ + entry: ['./src/index.ts'], + outDir: './dist', + external: [], + splitting: false, + sourcemap: false, + dts: false, + bundle: true, + format: 'cjs', + platform: 'node', + target: 'es2022', + banner: { + js: `#!/usr/bin/env node + +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @lightSyntaxTransform + * @noflow + * @nolint + * @preventMunge + * @preserve-invariant-messages + */`, + }, +}); diff --git a/compiler/packages/snap/package.json b/compiler/packages/snap/package.json new file mode 100644 index 00000000000..085422ab830 --- /dev/null +++ b/compiler/packages/snap/package.json @@ -0,0 +1,63 @@ +{ + "name": "snap", + "version": "0.0.1", + "public": false, + "description": "Snapshot testing CLI tool", + "main": "dist/main.js", + "license": "MIT", + "files": [ + "src" + ], + "scripts": { + "postinstall": "./scripts/link-react-compiler-runtime.sh && perl -p -i -e 's/react\\.element/react.transitional.element/' ../../node_modules/fbt/lib/FbtReactUtil.js && perl -p -i -e 's/didWarnAboutUsingAct = false;/didWarnAboutUsingAct = true;/' ../../node_modules/react-dom/cjs/react-dom-test-utils.development.js", + "build": "rimraf dist && concurrently -n snap,runtime \"tsc --build\" \"yarn --silent workspace react-compiler-runtime build\"", + "snap": "node dist/main.js", + "test": "echo 'no tests'", + "prettier": "prettier --write 'src/**/*.ts'" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/facebook/react.git", + "directory": "compiler/packages/snap" + }, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/preset-flow": "^7.7.4", + "@babel/preset-typescript": "^7.26.0", + "@parcel/watcher": "^2.1.0", + "@testing-library/react": "^13.4.0", + "babel-plugin-idx": "^3.0.3", + "babel-plugin-syntax-hermes-parser": "^0.25.1", + "chalk": "4", + "fbt": "^1.0.2", + "glob": "^10.3.10", + "hermes-parser": "^0.25.1", + "jsdom": "^22.1.0", + "react": "0.0.0-experimental-4beb1fd8-20241118", + "react-dom": "0.0.0-experimental-4beb1fd8-20241118", + "readline": "^1.3.0", + "yargs": "^17.7.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "devDependencies": { + "@babel/core": "^7.19.1", + "@babel/parser": "^7.20.15", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@types/babel__code-frame": "^7.0.6", + "@types/fbt": "^1.0.4", + "@types/glob": "^8.1.0", + "@types/node": "^18.7.18", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@typescript-eslint/parser": "^7.4.0", + "object-assign": "^4.1.1" + }, + "resolutions": { + "./**/@babel/parser": "7.7.4", + "./**/@babel/types": "7.7.4", + "@babel/preset-flow": "7.22.5" + } +} diff --git a/compiler/packages/snap/scripts/link-react-compiler-runtime.sh b/compiler/packages/snap/scripts/link-react-compiler-runtime.sh new file mode 100755 index 00000000000..83a30d41d7c --- /dev/null +++ b/compiler/packages/snap/scripts/link-react-compiler-runtime.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +set -eo pipefail + +yarn --silent workspace react-compiler-runtime link +yarn --silent workspace snap link react-compiler-runtime diff --git a/compiler/packages/snap/src/SproutTodoFilter.ts b/compiler/packages/snap/src/SproutTodoFilter.ts new file mode 100644 index 00000000000..531c3cf27f6 --- /dev/null +++ b/compiler/packages/snap/src/SproutTodoFilter.ts @@ -0,0 +1,499 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const skipFilter = new Set([ + /** + * Observable different in logging between Forget and non-Forget + */ + 'early-return-no-declarations-reassignments-dependencies', + + /** + * Category A: + * Tests with 0 parameters and 0 refs to external values + */ + // TODO: fix invalid .set call + 'assignment-variations-complex-lvalue-array', + // TODO: uses jsx (requires React) + 'sketchy-code-rules-of-hooks', + // TODO: fix infinite loop + 'ssa-for-trivial-update', + // TODO: fix infinite loop + 'ssa-while-no-reassign', + + /** + * Category B: + * Tests with at least one param and 0 refs to external values + */ + 'bug.useMemo-deps-array-not-cleared', + 'capture_mutate-across-fns', + 'capture-indirect-mutate-alias', + 'capturing-arrow-function-1', + 'capturing-func-mutate-3', + 'capturing-func-mutate-nested', + 'capturing-function-1', + 'capturing-function-alias-computed-load', + 'capturing-function-decl', + 'capturing-function-skip-computed-path', + 'capturing-function-within-block', + 'capturing-member-expr', + 'capturing-nested-member-call', + 'capturing-nested-member-expr-in-nested-func', + 'capturing-nested-member-expr', + 'capturing-variable-in-nested-block', + 'capturing-variable-in-nested-function', + 'complex-while', + 'component', + 'cond-deps-conditional-member-expr', + 'conditional-break-labeled', + 'propagate-scope-deps-hir-fork/conditional-break-labeled', + 'conditional-set-state-in-render', + 'constant-computed', + 'constant-propagation-phi', + 'debugger-memoized', + 'debugger', + 'declare-reassign-variable-in-closure', + 'delete-computed-property', + 'delete-property', + 'dependencies-outputs', + 'dependencies', + 'destructure-direct-reassignment', + 'destructuring-array-default', + 'destructuring-array-param-default', + 'destructuring-assignment-array-default', + 'destructuring-assignment', + 'destructuring-object-default', + 'destructuring-object-param-default', + 'destructuring', + 'disable-jsx-memoization', + 'do-while-break', + 'do-while-compound-test', + 'dominator', + 'early-return', + 'escape-analysis-destructured-rest-element', + 'escape-analysis-jsx-child', + 'escape-analysis-logical', + 'escape-analysis-non-escaping-interleaved-allocating-dependency', + 'escape-analysis-non-escaping-interleaved-allocating-nested-dependency', + 'escape-analysis-non-escaping-interleaved-primitive-dependency', + 'escape-analysis-not-conditional-test', + 'escape-analysis-not-if-test', + 'escape-analysis-not-switch-case', + 'escape-analysis-not-switch-test', + 'expression-with-assignment-dynamic', + 'extend-scopes-if', + 'fbt/fbt-params', + 'for-empty-update-with-continue', + 'for-empty-update', + 'for-logical', + 'for-return', + 'function-declaration-simple', + 'function-param-assignment-pattern', + 'globals-Boolean', + 'globals-Number', + 'globals-String', + 'holey-array-pattern-dce-2', + 'holey-array-pattern-dce', + 'holey-array', + 'independently-memoize-object-property', + 'inverted-if-else', + 'inverted-if', + 'jsx-empty-expression', + 'jsx-fragment', + 'jsx-namespaced-name', + 'lambda-mutated-non-reactive-to-reactive', + 'lambda-mutated-ref-non-reactive', + 'logical-expression-object', + 'logical-expression', + 'nested-function-shadowed-identifiers', + 'nonoptional-load-from-optional-memberexpr', + 'object-computed-access-assignment', + 'object-expression-string-literal-key', + 'object-literal-spread-element', + 'object-pattern-params', + 'optional-member-expression-chain', + 'overlapping-scopes-interleaved-by-terminal', + 'overlapping-scopes-interleaved', + 'overlapping-scopes-shadowed', + 'overlapping-scopes-shadowing-within-block', + 'overlapping-scopes-while', + 'overlapping-scopes-within-block', + 'prop-capturing-function-1', + 'reactive-scopes-if', + 'reactive-scopes', + 'reactivity-analysis-interleaved-reactivity', + 'reassign-object-in-context', + 'reassignment-separate-scopes', + 'return-conditional', + 'return-undefined', + 'reverse-postorder', + 'same-variable-as-dep-and-redeclare-maybe-frozen', + 'same-variable-as-dep-and-redeclare', + 'simple-scope', + 'ssa-arrayexpression', + 'ssa-for-of', + 'ssa-multiple-phis', + 'ssa-nested-loops-no-reassign', + 'ssa-nested-partial-phi', + 'ssa-nested-partial-reassignment', + 'ssa-non-empty-initializer', + 'ssa-objectexpression', + 'ssa-property-alias-if', + 'ssa-reassign', + 'ssa-renaming-via-destructuring', + 'ssa-renaming', + 'ssa-sibling-phis', + 'switch-with-fallthrough', + 'ternary-assignment-expression', + 'ternary-expression', + 'trivial', + 'type-args-test-binary-operator', + 'type-cast-expression.flow', + 'unary-expr', + 'unconditional-break-label', + 'unused-array-middle-element', + 'unused-array-rest-element', + 'unused-conditional', + 'unused-logical', + 'unused-object-element-with-rest', + 'unused-object-element', + 'useMemo-inlining-block-return', + 'useMemo-inverted-if', + 'useMemo-labeled-statement-unconditional-return', + 'useMemo-logical', + 'useMemo-nested-ifs', + 'useMemo-switch-no-fallthrough', + 'useMemo-switch-return', + 'while-break', + 'while-conditional-continue', + 'while-logical', + 'while-property', + 'validate-no-set-state-in-render-uncalled-function-with-mutable-range-is-valid', + // Category B with multiple entrypoints, + 'conditional-break', + + /** + * Category C: + * Tests with at 0 params and at least one ref to external values + */ + 'alias-capture-in-method-receiver', + 'alias-nested-member-path-mutate', + 'concise-arrow-expr', + 'const-propagation-into-function-expression-global', + 'lambda-mutate-shadowed-object', + 'fbt/lambda-with-fbt', + 'recursive-function-expr', + 'ref-current-aliased-no-added-to-dep', + 'ref-current-field-not-added-to-dep', + 'ref-current-not-added-to-dep', + 'ref-current-optional-field-no-added-to-dep', + 'ref-current-write-not-added-to-dep', + 'rewrite-phis-in-lambda-capture-context', + 'sketchy-code-exhaustive-deps', + 'ssa-property-alias-mutate', + 'ssa-property-mutate-2', + 'ssa-property-mutate-alias', + 'ssa-property-mutate', + 'ssa-reassign-in-rval', + 'store-via-call', + 'store-via-new', + 'tagged-template-literal', + 'transitive-alias-fields', + 'type-binary-operator', + 'type-test-field-load-binary-op', + 'type-test-polymorphic', + 'type-test-return-type-inference', + 'use-callback-simple', + // defines two functions + 'simple-alias', + + /** + * Category D: + * Tests with one or more params, with external references. + */ + 'alias-computed-load', + 'allocating-primitive-as-dep', + 'allow-passing-refs-as-props', + 'array-at-closure', + 'array-at-effect', + 'array-at-mutate-after-capture', + 'array-join', + 'array-push-effect', + 'assignment-in-nested-if', + 'await-side-effecting-promise', + 'await', + 'builtin-jsx-tag-lowered-between-mutations', + 'call-args-assignment', + 'call-args-destructuring-assignment', + 'call-with-independently-memoizable-arg', + 'capture-param-mutate', + 'capturing-function-conditional-capture-mutate', + 'capturing-function-member-expr-arguments', + 'capturing-function-member-expr-call', + 'codegen-emit-imports-same-source', + 'codegen-emit-make-read-only', + 'computed-call-spread', + 'computed-load-primitive-as-dependency', + 'destructuring-mixed-scope-declarations-and-locals', + 'destructuring-property-inference', + 'do-while-conditional-break', + 'do-while-early-unconditional-break', + 'fbt/fbt-params-complex-param-value', + 'function-expression-captures-value-later-frozen-jsx', + 'function-expression-maybe-mutates-hook-return-value', + 'function-expression-with-store-to-parameter', + 'global-jsx-tag-lowered-between-mutations', + 'hook-inside-logical-expression', + 'immutable-hooks', + 'inadvertent-mutability-readonly-class', + 'inadvertent-mutability-readonly-lambda', + 'infer-computed-delete', + 'infer-property-delete', + 'inner-memo-value-not-promoted-to-outer-scope-dynamic', + 'inner-memo-value-not-promoted-to-outer-scope-static', + 'issue852', + 'jsx-member-expression-tag-grouping', + 'jsx-member-expression', + 'jsx-spread', + 'lambda-capture-returned-alias', + 'method-call-computed', + 'method-call-fn-call', + 'nested-optional-member-expr', + 'nested-scopes-hook-call', + 'new-spread', + 'obj-literal-cached-in-if-else', + 'obj-literal-mutated-after-if-else', + 'obj-mutated-after-if-else-with-alias', + 'obj-mutated-after-if-else', + 'obj-mutated-after-nested-if-else-with-alias', + 'object-properties', + 'optional-call-chained', + 'optional-call-logical', + 'optional-call-simple', + 'optional-call-with-independently-memoizable-arg', + 'optional-call-with-optional-property-load', + 'optional-call', + 'optional-computed-load-static', + 'optional-computed-member-expression', + 'optional-member-expression-call-as-property', + 'optional-member-expression-with-optional-member-expr-as-property', + 'optional-member-expression', + 'optional-method-call', + 'optional-receiver-method-call', + 'optional-receiver-optional-method', + 'primitive-alias-mutate', + 'primitive-as-dep', + 'property-assignment', + 'property-call-spread', + 'reactive-dependencies-non-optional-properties-inside-optional-chain', + 'reactivity-analysis-reactive-via-mutation-of-computed-load', + 'reactivity-analysis-reactive-via-mutation-of-property-load', + 'reassigned-phi-in-returned-function-expression', + 'reassignment-conditional', + 'reassignment', + 'ref-current-aliased-not-added-to-dep-2', + 'ref-current-not-added-to-dep-2', + 'ref-in-effect', + 'regexp-literal', + 'remove-memoization-kitchen-sink', + 'repro-reassign-to-variable-without-mutable-range', + 'repro-scope-missing-mutable-range', + 'repro', + 'simple', + 'ssa-property-alias-alias-mutate-if', + 'ssa-property-alias-mutate-if', + 'ssa-property-alias-mutate-inside-if', + 'switch-global-propertyload-case-test', + 'switch-non-final-default', + 'switch', + 'tagged-template-in-hook', + 'temporary-accessed-outside-scope', + 'temporary-at-start-of-value-block', + 'temporary-property-load-accessed-outside-scope', + 'timers', + 'todo-function-expression-captures-value-later-frozen', + 'uninitialized-declaration-in-reactive-scope', + 'unknown-hooks-do-not-assert', + 'unused-logical-assigned-to-variable', + 'unused-optional-method-assigned-to-variable', + 'unused-ternary-assigned-to-variable', + 'useEffect-arg-memoized', + 'useEffect-nested-lambdas', + 'useMemo-if-else-multiple-return', + 'useMemo-independently-memoizeable', + 'useMemo-named-function', + 'useMemo-return-empty', + 'useMemo-simple', + 'use-no-forget-module-level', + 'use-no-memo-module-level', + // defines multiple functions + 'alias-while', + 'babel-existing-react-import', + 'babel-existing-react-kitchensink-import', + 'call', + 'codegen-instrument-forget-test', + 'conditional-on-mutable', + 'constructor', + 'frozen-after-alias', + 'hook-call', + 'hooks-freeze-arguments', + 'hooks-freeze-possibly-mutable-arguments', + 'independent-across-if', + 'independent', + 'interdependent-across-if', + 'interdependent', + 'mutable-liverange-loop', + 'sequence-expression', + 'ssa-call-jsx-2', + 'ssa-call-jsx', + 'ssa-newexpression', + 'ssa-shadowing', + 'template-literal', + + // works, but appears differently when printing + // due to optional function argument + 'nested-function-with-param-as-captured-dep', + 'deeply-nested-function-expressions-with-params', + + // TODO: we should be able to support these + 'readonly-object-method-calls', + 'readonly-object-method-calls-mutable-lambda', + 'preserve-memo-validation/useMemo-with-refs.flow', + + // TODO: we probably want to always skip these + 'rules-of-hooks/rules-of-hooks-0592bd574811', + 'rules-of-hooks/rules-of-hooks-0e2214abc294', + 'rules-of-hooks/rules-of-hooks-1ff6c3fbbc94', + 'rules-of-hooks/rules-of-hooks-23dc7fffde57', + 'rules-of-hooks/rules-of-hooks-2bec02ac982b', + 'rules-of-hooks/rules-of-hooks-2e405c78cb80', + 'rules-of-hooks/rules-of-hooks-33a6e23edac1', + 'rules-of-hooks/rules-of-hooks-347b0dae66f1', + 'rules-of-hooks/rules-of-hooks-485bf041f55f', + 'rules-of-hooks/rules-of-hooks-4f6c78a14bf7', + 'rules-of-hooks/rules-of-hooks-7e52f5eec669', + 'rules-of-hooks/rules-of-hooks-844a496db20b', + 'rules-of-hooks/rules-of-hooks-8f1c2c3f71c9', + 'rules-of-hooks/rules-of-hooks-9a47e97b5d13', + 'rules-of-hooks/rules-of-hooks-9d7879272ff6', + 'rules-of-hooks/rules-of-hooks-c1e8c7f4c191', + 'rules-of-hooks/rules-of-hooks-c5d1f3143c4c', + 'rules-of-hooks/rules-of-hooks-cfdfe5572fc7', + 'rules-of-hooks/rules-of-hooks-df4d750736f3', + 'rules-of-hooks/rules-of-hooks-dfde14171fcd', + 'rules-of-hooks/rules-of-hooks-e5dd6caf4084', + 'rules-of-hooks/rules-of-hooks-e66a744cffbe', + 'rules-of-hooks/rules-of-hooks-eacfcaa6ef89', + 'rules-of-hooks/rules-of-hooks-fe6042f7628b', + 'infer-function-assignment', + 'infer-functions-component-with-jsx', + 'infer-function-forwardRef', + 'infer-function-React-memo', + 'infer-functions-component-with-hook-call', + 'infer-functions-component-with-jsx', + 'infer-functions-hook-with-hook-call', + 'infer-functions-hook-with-jsx', + 'infer-function-expression-component', + 'infer-skip-components-without-hooks-or-jsx', + 'class-component-with-render-helper', + 'fbt/fbtparam-with-jsx-element-content', + 'fbt/fbtparam-text-must-use-expression-container', + 'fbt/fbtparam-with-jsx-fragment-value', + 'todo.useContext-mutate-context-in-callback', + 'loop-unused-let', + 'reanimated-no-memo-arg', + 'reanimated-shared-value-writes', + + 'userspace-use-memo-cache', + 'transitive-freeze-function-expressions', + + // nothing to compile/run + 'gating/repro-no-gating-import-without-compiled-functions', + + // TODOs + 'rules-of-hooks/todo.bail.rules-of-hooks-279ac76f53af', + 'rules-of-hooks/todo.bail.rules-of-hooks-28a78701970c', + 'rules-of-hooks/todo.bail.rules-of-hooks-3d692676194b', + 'rules-of-hooks/todo.bail.rules-of-hooks-6949b255e7eb', + 'rules-of-hooks/todo.bail.rules-of-hooks-8503ca76d6f8', + 'rules-of-hooks/todo.bail.rules-of-hooks-e0a5db3ae21e', + 'rules-of-hooks/todo.bail.rules-of-hooks-e9f9bac89f8f', + 'rules-of-hooks/todo.bail.rules-of-hooks-fadd52c1e460', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-0a1dbff27ba0', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-0de1224ce64b', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-191029ac48c8', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-206e2811c87c', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-28a7111f56a7', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-2c51251df67a', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-449a37146a83', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-5a7ac9a6e8fa', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-76a74b4666e9', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-8303403b8e4c', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-99b5c750d1d1', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-9c79feec4b9b', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-a63fd4f9dcc0', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-acb56658fe7e', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-c59788ef5676', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-d842d36db450', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-d952b82c2597', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-ddeca9708b63', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-e675f0a672d8', + 'rules-of-hooks/todo.invalid.invalid-rules-of-hooks-e69ffce323c3', + 'todo.unnecessary-lambda-memoization', + 'rules-of-hooks/rules-of-hooks-93dc5d5e538a', + 'rules-of-hooks/rules-of-hooks-69521d94fa03', + + // false positives + 'invalid-jsx-lowercase-localvar', + + // bugs + 'inner-function/nullable-objects/bug-invalid-array-map-manual', + 'bug-object-expression-computed-key-modified-during-after-construction-hoisted-sequence-expr', + `bug-capturing-func-maybealias-captured-mutate`, + 'bug-aliased-capture-aliased-mutate', + 'bug-aliased-capture-mutate', + 'bug-functiondecl-hoisting', + 'bug-type-inference-control-flow', + 'fbt/bug-fbt-plural-multiple-function-calls', + 'fbt/bug-fbt-plural-multiple-mixed-call-tag', + 'bug-invalid-phi-as-dependency', + 'bug-ref-prefix-postfix-operator', + + // 'react-compiler-runtime' not yet supported + 'flag-enable-emit-hook-guards', + 'fast-refresh-refresh-on-const-changes-dev', + 'useState-pruned-dependency-change-detect', + 'useState-unpruned-dependency', + 'useState-and-other-hook-unpruned-dependency', + 'change-detect-reassign', + + // Depends on external functions + 'idx-method-no-outlining-wildcard', + 'idx-method-no-outlining', + 'target-flag-meta-internal', + + // needs to be executed as a module + 'meta-property', + + // needs context lowering support in React + 'todo.lower-context-access-property-load', + 'todo.lower-context-access-nested-destructuring', + 'todo.lower-context-access-mixed-array-obj', + 'todo.lower-context-access-destructure-multiple', + 'todo.lower-context-access-array-destructuring', + 'lower-context-selector-simple', + 'lower-context-acess-multiple', + 'bug-separate-memoization-due-to-callback-capturing', + + // SSR optimization rewrites files in a way that causes differences or warnings + 'ssr/optimize-ssr', + 'ssr/ssr-use-reducer', + 'ssr/ssr-use-reducer-initializer', + 'ssr/infer-event-handlers-from-setState', + 'ssr/infer-event-handlers-from-startTransition', +]); + +export default skipFilter; diff --git a/compiler/packages/snap/src/compiler.ts b/compiler/packages/snap/src/compiler.ts new file mode 100644 index 00000000000..cafe8692446 --- /dev/null +++ b/compiler/packages/snap/src/compiler.ts @@ -0,0 +1,369 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import type * as BabelCore from '@babel/core'; +import {transformFromAstSync} from '@babel/core'; + +import * as BabelParser from '@babel/parser'; +import {NodePath} from '@babel/traverse'; +import * as t from '@babel/types'; +import type { + Logger, + LoggerEvent, + PluginOptions, + CompilerReactTarget, + CompilerPipelineValue, +} from 'babel-plugin-react-compiler/src/Entrypoint'; +import type { + Effect, + ValueKind, + ValueReason, +} from 'babel-plugin-react-compiler/src/HIR'; +import type {parseConfigPragmaForTests as ParseConfigPragma} from 'babel-plugin-react-compiler/src/Utils/TestUtils'; +import * as HermesParser from 'hermes-parser'; +import invariant from 'invariant'; +import path from 'path'; +import prettier from 'prettier'; +import SproutTodoFilter from './SproutTodoFilter'; +import {isExpectError} from './fixture-utils'; +import {makeSharedRuntimeTypeProvider} from './sprout/shared-runtime-type-provider'; + +export function parseLanguage(source: string): 'flow' | 'typescript' { + return source.indexOf('@flow') !== -1 ? 'flow' : 'typescript'; +} + +export function parseSourceType(source: string): 'script' | 'module' { + return source.indexOf('@script') !== -1 ? 'script' : 'module'; +} + +/** + * Parse react compiler plugin + environment options from test fixture. Note + * that although this primarily uses `Environment:parseConfigPragma`, it also + * has test fixture specific (i.e. not applicable to playground) parsing logic. + */ +function makePluginOptions( + firstLine: string, + parseConfigPragmaFn: typeof ParseConfigPragma, + debugIRLogger: (value: CompilerPipelineValue) => void, + EffectEnum: typeof Effect, + ValueKindEnum: typeof ValueKind, + ValueReasonEnum: typeof ValueReason, +): [PluginOptions, Array<{filename: string | null; event: LoggerEvent}>] { + // TODO(@mofeiZ) rewrite snap fixtures to @validatePreserveExistingMemo:false + let validatePreserveExistingMemoizationGuarantees = false; + let target: CompilerReactTarget = '19'; + + /** + * Snap currently runs all fixtures without `validatePreserveExistingMemo` as + * most fixtures are interested in compilation output, not whether the + * compiler was able to preserve existing memo. + * + * TODO: flip the default. `useMemo` is rare in test fixtures -- fixtures that + * use useMemo should be explicit about whether this flag is enabled + */ + if (firstLine.includes('@validatePreserveExistingMemoizationGuarantees')) { + validatePreserveExistingMemoizationGuarantees = true; + } + + const logs: Array<{filename: string | null; event: LoggerEvent}> = []; + const logger: Logger = { + logEvent: firstLine.includes('@loggerTestOnly') + ? (filename, event) => { + logs.push({filename, event}); + } + : () => {}, + debugLogIRs: debugIRLogger, + }; + + const config = parseConfigPragmaFn(firstLine, {compilationMode: 'all'}); + const options = { + ...config, + environment: { + ...config.environment, + moduleTypeProvider: makeSharedRuntimeTypeProvider({ + EffectEnum, + ValueKindEnum, + ValueReasonEnum, + }), + assertValidMutableRanges: true, + validatePreserveExistingMemoizationGuarantees, + }, + logger, + enableReanimatedCheck: false, + target, + }; + return [options, logs]; +} + +export function parseInput( + input: string, + filename: string, + language: 'flow' | 'typescript', + sourceType: 'module' | 'script', +): BabelCore.types.File { + // Extract the first line to quickly check for custom test directives + if (language === 'flow') { + return HermesParser.parse(input, { + babel: true, + flow: 'all', + sourceFilename: filename, + sourceType, + enableExperimentalComponentSyntax: true, + }); + } else { + return BabelParser.parse(input, { + sourceFilename: filename, + plugins: ['typescript', 'jsx'], + sourceType, + }); + } +} + +function getEvaluatorPresets( + language: 'typescript' | 'flow', +): Array { + const presets: Array = [ + { + plugins: [ + 'babel-plugin-fbt', + 'babel-plugin-fbt-runtime', + 'babel-plugin-idx', + ], + }, + ]; + presets.push( + language === 'typescript' + ? [ + '@babel/preset-typescript', + { + /** + * onlyRemoveTypeImports needs to be set as fbt imports + * would otherwise be removed by this pass. + * https://github.com/facebook/fbt/issues/49 + * https://github.com/facebook/sfbt/issues/72 + * https://dev.to/retyui/how-to-add-support-typescript-for-fbt-an-internationalization-framework-3lo0 + */ + onlyRemoveTypeImports: true, + }, + ] + : '@babel/preset-flow', + ); + + presets.push({ + plugins: ['@babel/plugin-syntax-jsx'], + }); + presets.push( + ['@babel/preset-react', {throwIfNamespace: false}], + { + plugins: ['@babel/plugin-transform-modules-commonjs'], + }, + { + plugins: [ + function BabelPluginRewriteRequirePath() { + return { + visitor: { + CallExpression(path: NodePath) { + const {callee} = path.node; + if (callee.type === 'Identifier' && callee.name === 'require') { + const arg = path.node.arguments[0]; + if (arg.type === 'StringLiteral') { + // rewrite to use relative import as eval happens in + // sprout/evaluator.ts + if (arg.value === 'shared-runtime') { + arg.value = './shared-runtime'; + } else if (arg.value === 'ReactForgetFeatureFlag') { + arg.value = './ReactForgetFeatureFlag'; + } else if (arg.value === 'useEffectWrapper') { + arg.value = './useEffectWrapper'; + } + } + } + }, + }, + }; + }, + ], + }, + ); + return presets; +} +async function format( + inputCode: string, + language: 'typescript' | 'flow', +): Promise { + return await prettier.format(inputCode, { + semi: true, + parser: language === 'typescript' ? 'babel-ts' : 'flow', + }); +} +const TypescriptEvaluatorPresets = getEvaluatorPresets('typescript'); +const FlowEvaluatorPresets = getEvaluatorPresets('flow'); + +export type TransformResult = { + forgetOutput: string; + logs: string | null; + evaluatorCode: { + original: string; + forget: string; + } | null; +}; + +export async function transformFixtureInput( + input: string, + fixturePath: string, + parseConfigPragmaFn: typeof ParseConfigPragma, + plugin: BabelCore.PluginObj, + includeEvaluator: boolean, + debugIRLogger: (value: CompilerPipelineValue) => void, + EffectEnum: typeof Effect, + ValueKindEnum: typeof ValueKind, + ValueReasonEnum: typeof ValueReason, +): Promise<{kind: 'ok'; value: TransformResult} | {kind: 'err'; msg: string}> { + // Extract the first line to quickly check for custom test directives + const firstLine = input.substring(0, input.indexOf('\n')); + + const language = parseLanguage(firstLine); + const sourceType = parseSourceType(firstLine); + // Preserve file extension as it determines typescript's babel transform + // mode (e.g. stripping types, parsing rules for brackets) + const filename = + path.basename(fixturePath) + (language === 'typescript' ? '.ts' : ''); + const inputAst = parseInput(input, filename, language, sourceType); + // Give babel transforms an absolute path as relative paths get prefixed + // with `cwd`, which is different across machines + const virtualFilepath = '/' + filename; + + const presets = + language === 'typescript' + ? TypescriptEvaluatorPresets + : FlowEvaluatorPresets; + + /** + * Get Forget compiled code + */ + const [options, logs] = makePluginOptions( + firstLine, + parseConfigPragmaFn, + debugIRLogger, + EffectEnum, + ValueKindEnum, + ValueReasonEnum, + ); + const forgetResult = transformFromAstSync(inputAst, input, { + filename: virtualFilepath, + highlightCode: false, + retainLines: true, + compact: true, + plugins: [ + [plugin, options], + 'babel-plugin-fbt', + 'babel-plugin-fbt-runtime', + 'babel-plugin-idx', + ], + sourceType: 'module', + ast: includeEvaluator, + cloneInputAst: includeEvaluator, + configFile: false, + babelrc: false, + }); + invariant( + forgetResult?.code != null, + 'Expected BabelPluginReactForget to codegen successfully.', + ); + const forgetCode = forgetResult.code; + let evaluatorCode = null; + + if ( + includeEvaluator && + !SproutTodoFilter.has(fixturePath) && + !isExpectError(filename) + ) { + let forgetEval: string; + try { + invariant( + forgetResult?.ast != null, + 'Expected BabelPluginReactForget ast.', + ); + const result = transformFromAstSync(forgetResult.ast, forgetCode, { + presets, + filename: virtualFilepath, + configFile: false, + babelrc: false, + }); + if (result?.code == null) { + return { + kind: 'err', + msg: 'Unexpected error in forget transform pipeline - no code emitted', + }; + } else { + forgetEval = result.code; + } + } catch (e) { + return { + kind: 'err', + msg: 'Unexpected error in Forget transform pipeline: ' + e.message, + }; + } + + /** + * Get evaluator code for source (no Forget) + */ + let originalEval: string; + try { + const result = transformFromAstSync(inputAst, input, { + presets, + filename: virtualFilepath, + configFile: false, + babelrc: false, + }); + + if (result?.code == null) { + return { + kind: 'err', + msg: 'Unexpected error in non-forget transform pipeline - no code emitted', + }; + } else { + originalEval = result.code; + } + } catch (e) { + return { + kind: 'err', + msg: 'Unexpected error in non-forget transform pipeline: ' + e.message, + }; + } + evaluatorCode = { + forget: forgetEval, + original: originalEval, + }; + } + const forgetOutput = await format(forgetCode, language); + let formattedLogs = null; + if (logs.length !== 0) { + formattedLogs = logs + .map(({event}) => { + return JSON.stringify(event, (key, value) => { + if ( + key === 'detail' && + value != null && + typeof value.serialize === 'function' + ) { + return value.serialize(); + } + return value; + }); + }) + .join('\n'); + } + return { + kind: 'ok', + value: { + forgetOutput, + logs: formattedLogs, + evaluatorCode, + }, + }; +} diff --git a/compiler/packages/snap/src/constants.ts b/compiler/packages/snap/src/constants.ts new file mode 100644 index 00000000000..d1ede2a2f2a --- /dev/null +++ b/compiler/packages/snap/src/constants.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import path from 'path'; + +// We assume this is run from `babel-plugin-react-compiler` +export const PROJECT_ROOT = path.normalize( + path.join(process.cwd(), '..', 'babel-plugin-react-compiler'), +); + +export const PROJECT_SRC = path.normalize( + path.join(PROJECT_ROOT, 'dist', 'index.js'), +); +export const PRINT_HIR_IMPORT = 'printFunctionWithOutlined'; +export const PRINT_REACTIVE_IR_IMPORT = 'printReactiveFunction'; +export const PARSE_CONFIG_PRAGMA_IMPORT = 'parseConfigPragmaForTests'; +export const FIXTURES_PATH = path.join( + PROJECT_ROOT, + 'src', + '__tests__', + 'fixtures', + 'compiler', +); +export const SNAPSHOT_EXTENSION = '.expect.md'; +export const FILTER_FILENAME = 'testfilter.txt'; +export const FILTER_PATH = path.join(PROJECT_ROOT, FILTER_FILENAME); diff --git a/compiler/packages/snap/src/fixture-utils.ts b/compiler/packages/snap/src/fixture-utils.ts new file mode 100644 index 00000000000..fae6afef151 --- /dev/null +++ b/compiler/packages/snap/src/fixture-utils.ts @@ -0,0 +1,229 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import fs from 'fs/promises'; +import * as glob from 'glob'; +import path from 'path'; +import {FILTER_PATH, FIXTURES_PATH, SNAPSHOT_EXTENSION} from './constants'; + +const INPUT_EXTENSIONS = [ + '.js', + '.cjs', + '.mjs', + '.ts', + '.cts', + '.mts', + '.jsx', + '.tsx', +]; + +export type TestFilter = { + debug: boolean; + paths: Array; +}; + +async function exists(file: string): Promise { + try { + await fs.access(file); + return true; + } catch { + return false; + } +} + +function stripExtension(filename: string, extensions: Array): string { + for (const ext of extensions) { + if (filename.endsWith(ext)) { + return filename.slice(0, -ext.length); + } + } + return filename; +} + +export async function readTestFilter(): Promise { + if (!(await exists(FILTER_PATH))) { + throw new Error(`testfilter file not found at \`${FILTER_PATH}\``); + } + + const input = await fs.readFile(FILTER_PATH, 'utf8'); + const lines = input.trim().split('\n'); + + let debug: boolean = false; + const line0 = lines[0]; + if (line0 != null) { + // Try to parse pragmas + let consumedLine0 = false; + if (line0.indexOf('@only') !== -1) { + consumedLine0 = true; + } + if (line0.indexOf('@debug') !== -1) { + debug = true; + consumedLine0 = true; + } + + if (consumedLine0) { + lines.shift(); + } + } + return { + debug, + paths: lines.filter(line => !line.trimStart().startsWith('//')), + }; +} + +export function getBasename(fixture: TestFixture): string { + return stripExtension(path.basename(fixture.inputPath), INPUT_EXTENSIONS); +} +export function isExpectError(fixture: TestFixture | string): boolean { + const basename = typeof fixture === 'string' ? fixture : getBasename(fixture); + return basename.startsWith('error.') || basename.startsWith('todo.error'); +} + +export type TestFixture = + | { + fixturePath: string; + input: string | null; + inputPath: string; + snapshot: string | null; + snapshotPath: string; + } + | { + fixturePath: string; + input: null; + inputPath: string; + snapshot: string; + snapshotPath: string; + }; + +async function readInputFixtures( + rootDir: string, + filter: TestFilter | null, +): Promise> { + let inputFiles: Array; + if (filter == null) { + inputFiles = glob.sync(`**/*{${INPUT_EXTENSIONS.join(',')}}`, { + cwd: rootDir, + }); + } else { + inputFiles = ( + await Promise.all( + filter.paths.map(pattern => { + // If the pattern already has an extension other than .expect.md, + // search for the pattern directly. Otherwise, search for the + // pattern with the expected input extensions added. + // Eg + // `alias-while` => search for `alias-while{.js,.jsx,.ts,.tsx}` + // `alias-while.js` => search as-is + // `alias-while.expect.md` => search for `alias-while{.js,.jsx,.ts,.tsx}` + const patternWithoutExt = stripExtension(pattern, [ + ...INPUT_EXTENSIONS, + SNAPSHOT_EXTENSION, + ]); + const hasExtension = pattern !== patternWithoutExt; + const globPattern = + hasExtension && !pattern.endsWith(SNAPSHOT_EXTENSION) + ? pattern + : `${patternWithoutExt}{${INPUT_EXTENSIONS.join(',')}}`; + return glob.glob(globPattern, { + cwd: rootDir, + }); + }), + ) + ).flat(); + } + const inputs: Array> = + []; + for (const filePath of inputFiles) { + // Do not include extensions in unique identifier for fixture + const partialPath = stripExtension(filePath, INPUT_EXTENSIONS); + inputs.push( + fs.readFile(path.join(rootDir, filePath), 'utf8').then(input => { + return [ + partialPath, + { + value: input, + filepath: filePath, + }, + ]; + }), + ); + } + return new Map(await Promise.all(inputs)); +} +async function readOutputFixtures( + rootDir: string, + filter: TestFilter | null, +): Promise> { + let outputFiles: Array; + if (filter == null) { + outputFiles = glob.sync(`**/*${SNAPSHOT_EXTENSION}`, { + cwd: rootDir, + }); + } else { + outputFiles = ( + await Promise.all( + filter.paths.map(pattern => { + // Strip all extensions and find matching .expect.md files + const basenameWithoutExt = stripExtension(pattern, [ + ...INPUT_EXTENSIONS, + SNAPSHOT_EXTENSION, + ]); + return glob.glob(`${basenameWithoutExt}${SNAPSHOT_EXTENSION}`, { + cwd: rootDir, + }); + }), + ) + ).flat(); + } + const outputs: Array> = []; + for (const filePath of outputFiles) { + // Do not include extensions in unique identifier for fixture + const partialPath = stripExtension(filePath, [SNAPSHOT_EXTENSION]); + + const outputPath = path.join(rootDir, filePath); + const output: Promise<[string, string]> = fs + .readFile(outputPath, 'utf8') + .then(output => { + return [partialPath, output]; + }); + outputs.push(output); + } + return new Map(await Promise.all(outputs)); +} + +export async function getFixtures( + filter: TestFilter | null, +): Promise> { + const inputs = await readInputFixtures(FIXTURES_PATH, filter); + const outputs = await readOutputFixtures(FIXTURES_PATH, filter); + + const fixtures: Map = new Map(); + for (const [partialPath, {value, filepath}] of inputs) { + const output = outputs.get(partialPath) ?? null; + fixtures.set(partialPath, { + fixturePath: partialPath, + input: value, + inputPath: filepath, + snapshot: output, + snapshotPath: path.join(FIXTURES_PATH, partialPath) + SNAPSHOT_EXTENSION, + }); + } + + for (const [partialPath, output] of outputs) { + if (!fixtures.has(partialPath)) { + fixtures.set(partialPath, { + fixturePath: partialPath, + input: null, + inputPath: 'none', + snapshot: output, + snapshotPath: + path.join(FIXTURES_PATH, partialPath) + SNAPSHOT_EXTENSION, + }); + } + } + return fixtures; +} diff --git a/compiler/packages/snap/src/main.ts b/compiler/packages/snap/src/main.ts new file mode 100644 index 00000000000..9e5ab53e5c6 --- /dev/null +++ b/compiler/packages/snap/src/main.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {fork} from 'child_process'; +import invariant from 'invariant'; +import process from 'process'; +import * as readline from 'readline'; +import {hideBin} from 'yargs/helpers'; + +readline.emitKeypressEvents(process.stdin); + +if (process.stdin.isTTY) { + process.stdin.setRawMode(true); +} + +process.stdin.on('keypress', function (_, key) { + if (key && key.name === 'c' && key.ctrl) { + // handle sigint + if (childProc) { + console.log('Interrupted!!'); + childProc.kill('SIGINT'); + childProc.unref(); + process.exit(-1); + } + } +}); + +const childProc = fork(require.resolve('./runner.js'), hideBin(process.argv), { + // for some reason, keypress events aren't sent to handlers in both processes + // when we `inherit` stdin. + // pipe stdout and stderr so we can silence child process after parent exits + stdio: ['pipe', 'pipe', 'pipe', 'ipc'], + // forward existing env variables, like `NODE_OPTIONS` which VSCode uses to attach + // its debugger + env: {...process.env, FORCE_COLOR: 'true'}, +}); + +invariant( + childProc.stdin && childProc.stdout && childProc.stderr, + 'Expected forked process to have piped stdio', +); +process.stdin.pipe(childProc.stdin); +childProc.stdout.pipe(process.stdout); +childProc.stderr.pipe(process.stderr); + +childProc.on('exit', code => { + process.exit(code ?? -1); +}); diff --git a/compiler/packages/snap/src/reporter.ts b/compiler/packages/snap/src/reporter.ts new file mode 100644 index 00000000000..9f7d1d9a507 --- /dev/null +++ b/compiler/packages/snap/src/reporter.ts @@ -0,0 +1,189 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import chalk from 'chalk'; +import fs from 'fs'; +import invariant from 'invariant'; +import {diff} from 'jest-diff'; +import path from 'path'; + +function wrapWithTripleBackticks(s: string, ext: string | null = null): string { + return `\`\`\`${ext ?? ''} +${s} +\`\`\``; +} +const SPROUT_SEPARATOR = '\n### Eval output\n'; + +export function writeOutputToString( + input: string, + compilerOutput: string | null, + evaluatorOutput: string | null, + logs: string | null, + errorMessage: string | null, +) { + // leading newline intentional + let result = ` +## Input + +${wrapWithTripleBackticks(input, 'javascript')} +`; // trailing newline + space internional + + if (compilerOutput != null) { + result += ` +## Code + +${wrapWithTripleBackticks(compilerOutput, 'javascript')} +`; + } else { + result += '\n'; + } + + if (logs != null) { + result += ` +## Logs + +${wrapWithTripleBackticks(logs, null)} +`; + } + + if (errorMessage != null) { + result += ` +## Error + +${wrapWithTripleBackticks(errorMessage.replace(/^\/.*?:\s/, ''))} + \n`; + } + result += ` `; + if (evaluatorOutput != null) { + result += SPROUT_SEPARATOR + evaluatorOutput; + } + return result; +} + +export type TestResult = { + actual: string | null; // null == input did not exist + expected: string | null; // null == output did not exist + outputPath: string; + unexpectedError: string | null; +}; +export type TestResults = Map; + +/** + * Update the fixtures directory given the compilation results + */ +export async function update(results: TestResults): Promise { + let deleted = 0; + let updated = 0; + let created = 0; + const failed = []; + for (const [basename, result] of results) { + if (result.unexpectedError != null) { + console.log( + chalk.red.inverse.bold(' FAILED ') + ' ' + chalk.dim(basename), + ); + failed.push([basename, result.unexpectedError]); + } else if (result.actual == null) { + // Input was deleted but the expect file still existed, remove it + console.log( + chalk.red.inverse.bold(' REMOVE ') + ' ' + chalk.dim(basename), + ); + try { + fs.unlinkSync(result.outputPath); + console.log(' remove ' + result.outputPath); + deleted++; + } catch (e) { + console.error( + '[Snap tester error]: failed to remove ' + result.outputPath, + ); + failed.push([basename, result.unexpectedError]); + } + } else if (result.actual !== result.expected) { + // Expected output has changed + console.log( + chalk.blue.inverse.bold(' UPDATE ') + ' ' + chalk.dim(basename), + ); + try { + fs.writeFileSync(result.outputPath, result.actual, 'utf8'); + } catch (e) { + if (e?.code === 'ENOENT') { + // May have failed to create nested dir, so make a directory and retry + fs.mkdirSync(path.dirname(result.outputPath), {recursive: true}); + fs.writeFileSync(result.outputPath, result.actual, 'utf8'); + } + } + if (result.expected == null) { + created++; + } else { + updated++; + } + } else { + // Expected output is current + console.log( + chalk.green.inverse.bold(' OKAY ') + ' ' + chalk.dim(basename), + ); + } + } + console.log( + `${deleted} Deleted, ${created} Created, ${updated} Updated, ${failed.length} Failed`, + ); + for (const [basename, errorMsg] of failed) { + console.log(`${chalk.red.bold('Fail:')} ${basename}\n${errorMsg}`); + } +} + +/** + * Report test results to the user + * @returns boolean indicatig whether all tests passed + */ +export function report(results: TestResults): boolean { + const failures: Array<[string, TestResult]> = []; + for (const [basename, result] of results) { + if (result.actual === result.expected && result.unexpectedError == null) { + console.log( + chalk.green.inverse.bold(' PASS ') + ' ' + chalk.dim(basename), + ); + } else { + console.log(chalk.red.inverse.bold(' FAIL ') + ' ' + chalk.dim(basename)); + failures.push([basename, result]); + } + } + + if (failures.length !== 0) { + console.log('\n' + chalk.red.bold('Failures:') + '\n'); + + for (const [basename, result] of failures) { + console.log(chalk.red.bold('FAIL:') + ' ' + basename); + if (result.unexpectedError != null) { + console.log( + ` >> Unexpected error during test: \n${result.unexpectedError}`, + ); + } else { + if (result.expected == null) { + invariant(result.actual != null, '[Tester] Internal failure.'); + console.log( + chalk.red('[ expected fixture output is absent ]') + '\n', + ); + } else if (result.actual == null) { + invariant(result.expected != null, '[Tester] Internal failure.'); + console.log( + chalk.red(`[ fixture input for ${result.outputPath} is absent ]`) + + '\n', + ); + } else { + console.log(diff(result.expected, result.actual) + '\n'); + } + } + } + } + + console.log( + `${results.size} Tests, ${results.size - failures.length} Passed, ${ + failures.length + } Failed`, + ); + return failures.length === 0; +} diff --git a/compiler/packages/snap/src/runner-watch.ts b/compiler/packages/snap/src/runner-watch.ts new file mode 100644 index 00000000000..6073fd30f92 --- /dev/null +++ b/compiler/packages/snap/src/runner-watch.ts @@ -0,0 +1,239 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import watcher from '@parcel/watcher'; +import path from 'path'; +import ts from 'typescript'; +import {FILTER_FILENAME, FIXTURES_PATH, PROJECT_ROOT} from './constants'; +import {TestFilter, readTestFilter} from './fixture-utils'; +import {execSync} from 'child_process'; + +export function watchSrc( + onStart: () => void, + onComplete: (isSuccess: boolean) => void, +): ts.WatchOfConfigFile { + const configPath = ts.findConfigFile( + /*searchPath*/ PROJECT_ROOT, + ts.sys.fileExists, + 'tsconfig.json', + ); + if (!configPath) { + throw new Error("Could not find a valid 'tsconfig.json'."); + } + const createProgram = ts.createSemanticDiagnosticsBuilderProgram; + const host = ts.createWatchCompilerHost( + configPath, + undefined, + ts.sys, + createProgram, + () => {}, // we manually report errors in afterProgramCreate + () => {}, // we manually report watch status + ); + + const origCreateProgram = host.createProgram; + host.createProgram = (rootNames, options, host, oldProgram) => { + onStart(); + return origCreateProgram(rootNames, options, host, oldProgram); + }; + host.afterProgramCreate = program => { + /** + * Avoid calling original postProgramCreate because it always emits tsc + * compilation output + */ + + // syntactic diagnostics refer to javascript syntax + const errors = program + .getSyntacticDiagnostics() + .filter(diag => diag.category === ts.DiagnosticCategory.Error); + // semantic diagnostics refer to typescript semantics + errors.push( + ...program + .getSemanticDiagnostics() + .filter(diag => diag.category === ts.DiagnosticCategory.Error), + ); + + if (errors.length > 0) { + for (const diagnostic of errors) { + let fileLoc: string; + if (diagnostic.file) { + // https://github.com/microsoft/TypeScript/blob/ddd5084659c423f4003d2176e12d879b6a5bcf30/src/compiler/program.ts#L663-L674 + const {line, character} = ts.getLineAndCharacterOfPosition( + diagnostic.file, + diagnostic.start!, + ); + const fileName = path.relative( + ts.sys.getCurrentDirectory(), + diagnostic.file.fileName, + ); + fileLoc = `${fileName}:${line + 1}:${character + 1} - `; + } else { + fileLoc = ''; + } + console.error( + `${fileLoc}error TS${diagnostic.code}:`, + ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'), + ); + } + console.error( + `Compilation failed (${errors.length} ${ + errors.length > 1 ? 'errors' : 'error' + }).\n`, + ); + } + + const isSuccess = errors.length === 0; + onComplete(isSuccess); + }; + + // `createWatchProgram` creates an initial program, watches files, and updates + // the program over time. + return ts.createWatchProgram(host); +} + +/** + * Watch mode helpers + */ +export enum RunnerAction { + Test = 'Test', + Update = 'Update', +} + +type RunnerMode = { + action: RunnerAction; + filter: boolean; +}; + +export type RunnerState = { + // Monotonically increasing integer to describe the 'version' of the compiler. + // This is passed to `compile()` when compiling, so that the worker knows when + // to reset its module cache (compared to using its cached compiler version) + compilerVersion: number; + isCompilerBuildValid: boolean; + // timestamp of the last update + lastUpdate: number; + mode: RunnerMode; + filter: TestFilter | null; +}; + +function subscribeFixtures( + state: RunnerState, + onChange: (state: RunnerState) => void, +) { + // Watch the fixtures directory for changes + watcher.subscribe(FIXTURES_PATH, async (err, _events) => { + if (err) { + console.error(err); + process.exit(1); + } + // Try to ignore changes that occurred as a result of our explicitly updating + // fixtures in update(). + // Currently keeps a timestamp of last known changes, and ignore events that occurred + // around that timestamp. + const isRealUpdate = performance.now() - state.lastUpdate > 5000; + if (isRealUpdate) { + // Fixtures changed, re-run tests + state.mode.action = RunnerAction.Test; + onChange(state); + } + }); +} + +function subscribeFilterFile( + state: RunnerState, + onChange: (state: RunnerState) => void, +) { + watcher.subscribe(PROJECT_ROOT, async (err, events) => { + if (err) { + console.error(err); + process.exit(1); + } else if ( + events.findIndex(event => event.path.includes(FILTER_FILENAME)) !== -1 + ) { + if (state.mode.filter) { + state.filter = await readTestFilter(); + state.mode.action = RunnerAction.Test; + onChange(state); + } + } + }); +} + +function subscribeTsc( + state: RunnerState, + onChange: (state: RunnerState) => void, +) { + // Run TS in incremental watch mode + watchSrc( + function onStart() { + // Notify the user when compilation starts but don't clear the screen yet + console.log('\nCompiling...'); + }, + isTypecheckSuccess => { + let isCompilerBuildValid = false; + if (isTypecheckSuccess) { + try { + execSync('yarn build', {cwd: PROJECT_ROOT}); + console.log('Built compiler successfully with tsup'); + isCompilerBuildValid = true; + } catch (e) { + console.warn('Failed to build compiler with tsup:', e); + } + } + // Bump the compiler version after a build finishes + // and re-run tests + if (isCompilerBuildValid) { + state.compilerVersion++; + } + state.isCompilerBuildValid = isCompilerBuildValid; + state.mode.action = RunnerAction.Test; + onChange(state); + }, + ); +} + +function subscribeKeyEvents( + state: RunnerState, + onChange: (state: RunnerState) => void, +) { + process.stdin.on('keypress', async (str, key) => { + if (key.name === 'u') { + // u => update fixtures + state.mode.action = RunnerAction.Update; + } else if (key.name === 'q') { + process.exit(0); + } else if (key.name === 'f') { + state.mode.filter = !state.mode.filter; + state.filter = state.mode.filter ? await readTestFilter() : null; + state.mode.action = RunnerAction.Test; + } else { + // any other key re-runs tests + state.mode.action = RunnerAction.Test; + } + onChange(state); + }); +} + +export async function makeWatchRunner( + onChange: (state: RunnerState) => void, + filterMode: boolean, +): Promise { + const state = { + compilerVersion: 0, + isCompilerBuildValid: false, + lastUpdate: -1, + mode: { + action: RunnerAction.Test, + filter: filterMode, + }, + filter: filterMode ? await readTestFilter() : null, + }; + + subscribeTsc(state, onChange); + subscribeFixtures(state, onChange); + subscribeKeyEvents(state, onChange); + subscribeFilterFile(state, onChange); +} diff --git a/compiler/packages/snap/src/runner-worker.ts b/compiler/packages/snap/src/runner-worker.ts new file mode 100644 index 00000000000..554348534e3 --- /dev/null +++ b/compiler/packages/snap/src/runner-worker.ts @@ -0,0 +1,238 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {codeFrameColumns} from '@babel/code-frame'; +import type {PluginObj} from '@babel/core'; +import type {parseConfigPragmaForTests as ParseConfigPragma} from 'babel-plugin-react-compiler/src/Utils/TestUtils'; +import type {printFunctionWithOutlined as PrintFunctionWithOutlined} from 'babel-plugin-react-compiler/src/HIR/PrintHIR'; +import type {printReactiveFunctionWithOutlined as PrintReactiveFunctionWithOutlined} from 'babel-plugin-react-compiler/src/ReactiveScopes/PrintReactiveFunction'; +import {TransformResult, transformFixtureInput} from './compiler'; +import { + PARSE_CONFIG_PRAGMA_IMPORT, + PRINT_HIR_IMPORT, + PRINT_REACTIVE_IR_IMPORT, + PROJECT_SRC, +} from './constants'; +import {TestFixture, getBasename, isExpectError} from './fixture-utils'; +import {TestResult, writeOutputToString} from './reporter'; +import {runSprout} from './sprout'; +import type { + CompilerPipelineValue, + Effect, + ValueKind, + ValueReason, +} from 'babel-plugin-react-compiler/src'; +import chalk from 'chalk'; + +const originalConsoleError = console.error; + +// Try to avoid clearing the entire require cache, which (as of this PR) +// contains ~1250 files. This assumes that no dependencies have global caches +// that may need to be invalidated across Forget reloads. +const invalidationSubpath = 'packages/babel-plugin-react-compiler/dist'; +let version: number | null = null; +export function clearRequireCache() { + Object.keys(require.cache).forEach(function (path) { + if (path.includes(invalidationSubpath)) { + delete require.cache[path]; + } + }); +} + +async function compile( + input: string, + fixturePath: string, + compilerVersion: number, + shouldLog: boolean, + includeEvaluator: boolean, +): Promise<{ + error: string | null; + compileResult: TransformResult | null; +}> { + const seenConsoleErrors: Array = []; + console.error = (...messages: Array) => { + seenConsoleErrors.push(...messages); + }; + if (version !== null && compilerVersion !== version) { + clearRequireCache(); + } + version = compilerVersion; + + let compileResult: TransformResult | null = null; + let error: string | null = null; + try { + const importedCompilerPlugin = require(PROJECT_SRC) as Record< + string, + unknown + >; + + // NOTE: we intentionally require lazily here so that we can clear the require cache + // and load fresh versions of the compiler when `compilerVersion` changes. + const BabelPluginReactCompiler = importedCompilerPlugin[ + 'default' + ] as PluginObj; + const EffectEnum = importedCompilerPlugin['Effect'] as typeof Effect; + const ValueKindEnum = importedCompilerPlugin[ + 'ValueKind' + ] as typeof ValueKind; + const ValueReasonEnum = importedCompilerPlugin[ + 'ValueReason' + ] as typeof ValueReason; + const printFunctionWithOutlined = importedCompilerPlugin[ + PRINT_HIR_IMPORT + ] as typeof PrintFunctionWithOutlined; + const printReactiveFunctionWithOutlined = importedCompilerPlugin[ + PRINT_REACTIVE_IR_IMPORT + ] as typeof PrintReactiveFunctionWithOutlined; + const parseConfigPragmaForTests = importedCompilerPlugin[ + PARSE_CONFIG_PRAGMA_IMPORT + ] as typeof ParseConfigPragma; + + let lastLogged: string | null = null; + const debugIRLogger = shouldLog + ? (value: CompilerPipelineValue) => { + let printed: string; + switch (value.kind) { + case 'hir': + printed = printFunctionWithOutlined(value.value); + break; + case 'reactive': + printed = printReactiveFunctionWithOutlined(value.value); + break; + case 'debug': + printed = value.value; + break; + case 'ast': + // skip printing ast as we already write fixture output JS + printed = '(ast)'; + break; + } + + if (printed !== lastLogged) { + lastLogged = printed; + console.log(`${chalk.green(value.name)}:\n ${printed}\n`); + } else { + console.log(`${chalk.blue(value.name)}: (no change)\n`); + } + } + : () => {}; + + // only try logging if we filtered out all but one fixture, + // since console log order is non-deterministic + const result = await transformFixtureInput( + input, + fixturePath, + parseConfigPragmaForTests, + BabelPluginReactCompiler, + includeEvaluator, + debugIRLogger, + EffectEnum, + ValueKindEnum, + ValueReasonEnum, + ); + + if (result.kind === 'err') { + error = result.msg; + } else { + compileResult = result.value; + } + } catch (e) { + if (shouldLog) { + console.error(e.stack); + } + error = e.message.replace(/\u001b[^m]*m/g, ''); + } + + // Promote console errors so they can be recorded in fixture output + for (const consoleError of seenConsoleErrors) { + if (error != null) { + error = `${error}\n\n${consoleError}`; + } else { + error = `ConsoleError: ${consoleError}`; + } + } + console.error = originalConsoleError; + + return { + error, + compileResult, + }; +} + +export async function transformFixture( + fixture: TestFixture, + compilerVersion: number, + shouldLog: boolean, + includeEvaluator: boolean, +): Promise { + const {input, snapshot: expected, snapshotPath: outputPath} = fixture; + const basename = getBasename(fixture); + const expectError = isExpectError(fixture); + + // Input will be null if the input file did not exist, in which case the output file + // is stale + if (input === null) { + return { + outputPath, + actual: null, + expected, + unexpectedError: null, + }; + } + const {compileResult, error} = await compile( + input, + fixture.fixturePath, + compilerVersion, + shouldLog, + includeEvaluator, + ); + + let unexpectedError: string | null = null; + if (expectError) { + if (error === null) { + unexpectedError = `Expected an error to be thrown for fixture: \`${basename}\`, remove the 'error.' prefix if an error is not expected.`; + } + } else { + if (error !== null) { + unexpectedError = `Expected fixture \`${basename}\` to succeed but it failed with error:\n\n${error}`; + } else if (compileResult == null) { + unexpectedError = `Expected output for fixture \`${basename}\`.`; + } + } + + const snapOutput: string | null = compileResult?.forgetOutput ?? null; + let sproutOutput: string | null = null; + if (compileResult?.evaluatorCode != null) { + const sproutResult = runSprout( + compileResult.evaluatorCode.original, + compileResult.evaluatorCode.forget, + ); + if (sproutResult.kind === 'invalid') { + unexpectedError ??= ''; + unexpectedError += `\n\n${sproutResult.value}`; + } else { + sproutOutput = sproutResult.value; + } + } else if (!includeEvaluator && expected != null) { + sproutOutput = expected.split('\n### Eval output\n')[1]; + } + + const actualOutput = writeOutputToString( + input, + snapOutput, + sproutOutput, + compileResult?.logs ?? null, + error, + ); + + return { + outputPath, + actual: actualOutput, + expected, + unexpectedError, + }; +} diff --git a/compiler/packages/snap/src/runner.ts b/compiler/packages/snap/src/runner.ts new file mode 100644 index 00000000000..478a32d426c --- /dev/null +++ b/compiler/packages/snap/src/runner.ts @@ -0,0 +1,265 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {Worker} from 'jest-worker'; +import {cpus} from 'os'; +import process from 'process'; +import * as readline from 'readline'; +import ts from 'typescript'; +import yargs from 'yargs'; +import {hideBin} from 'yargs/helpers'; +import {FILTER_PATH, PROJECT_ROOT} from './constants'; +import {TestFilter, getFixtures, readTestFilter} from './fixture-utils'; +import {TestResult, TestResults, report, update} from './reporter'; +import { + RunnerAction, + RunnerState, + makeWatchRunner, + watchSrc, +} from './runner-watch'; +import * as runnerWorker from './runner-worker'; +import {execSync} from 'child_process'; + +const WORKER_PATH = require.resolve('./runner-worker.js'); +const NUM_WORKERS = cpus().length - 1; + +readline.emitKeypressEvents(process.stdin); + +type RunnerOptions = { + sync: boolean; + workerThreads: boolean; + watch: boolean; + filter: boolean; + update: boolean; + pattern?: string; +}; + +const opts: RunnerOptions = yargs + .boolean('sync') + .describe( + 'sync', + 'Run compiler in main thread (instead of using worker threads or subprocesses). Defaults to false.', + ) + .default('sync', false) + .boolean('worker-threads') + .describe( + 'worker-threads', + 'Run compiler in worker threads (instead of subprocesses). Defaults to true.', + ) + .default('worker-threads', true) + .boolean('watch') + .describe('watch', 'Run compiler in watch mode, re-running after changes') + .alias('w', 'watch') + .default('watch', false) + .boolean('update') + .alias('u', 'update') + .describe('update', 'Update fixtures') + .default('update', false) + .boolean('filter') + .describe( + 'filter', + 'Only run fixtures which match the contents of testfilter.txt', + ) + .default('filter', false) + .string('pattern') + .alias('p', 'pattern') + .describe( + 'pattern', + 'Optional glob pattern to filter fixtures (e.g., "error.*", "use-memo")', + ) + .help('help') + .strict() + .parseSync(hideBin(process.argv)) as RunnerOptions; + +/** + * Do a test run and return the test results + */ +async function runFixtures( + worker: Worker & typeof runnerWorker, + filter: TestFilter | null, + compilerVersion: number, +): Promise { + // We could in theory be fancy about tracking the contents of the fixtures + // directory via our file subscription, but it's simpler to just re-read + // the directory each time. + const fixtures = await getFixtures(filter); + const isOnlyFixture = filter !== null && fixtures.size === 1; + + let entries: Array<[string, TestResult]>; + if (!opts.sync) { + // Note: promise.all to ensure parallelism when enabled + const work: Array> = []; + for (const [fixtureName, fixture] of fixtures) { + work.push( + worker + .transformFixture( + fixture, + compilerVersion, + (filter?.debug ?? false) && isOnlyFixture, + true, + ) + .then(result => [fixtureName, result]), + ); + } + + entries = await Promise.all(work); + } else { + entries = []; + for (const [fixtureName, fixture] of fixtures) { + let output = await runnerWorker.transformFixture( + fixture, + compilerVersion, + (filter?.debug ?? false) && isOnlyFixture, + true, + ); + entries.push([fixtureName, output]); + } + } + + return new Map(entries); +} + +// Callback to re-run tests after some change +async function onChange( + worker: Worker & typeof runnerWorker, + state: RunnerState, +) { + const {compilerVersion, isCompilerBuildValid, mode, filter} = state; + if (isCompilerBuildValid) { + const start = performance.now(); + + // console.clear() only works when stdout is connected to a TTY device. + // we're currently piping stdout (see main.ts), so let's do a 'hack' + console.log('\u001Bc'); + + // we don't clear console after this point, since + // it may contain debug console logging + const results = await runFixtures( + worker, + mode.filter ? filter : null, + compilerVersion, + ); + const end = performance.now(); + if (mode.action === RunnerAction.Update) { + update(results); + state.lastUpdate = end; + } else { + report(results); + } + console.log(`Completed in ${Math.floor(end - start)} ms`); + } else { + console.error( + `${mode}: Found errors in Forget source code, skipping test fixtures.`, + ); + } + console.log( + '\n' + + (mode.filter + ? `Current mode = FILTER, filter test fixtures by "${FILTER_PATH}".` + : 'Current mode = NORMAL, run all test fixtures.') + + '\nWaiting for input or file changes...\n' + + 'u - update all fixtures\n' + + `f - toggle (turn ${mode.filter ? 'off' : 'on'}) filter mode\n` + + 'q - quit\n' + + '[any] - rerun tests\n', + ); +} + +/** + * Runs the compiler in watch or single-execution mode + */ +export async function main(opts: RunnerOptions): Promise { + const worker: Worker & typeof runnerWorker = new Worker(WORKER_PATH, { + enableWorkerThreads: opts.workerThreads, + numWorkers: NUM_WORKERS, + }) as any; + worker.getStderr().pipe(process.stderr); + worker.getStdout().pipe(process.stdout); + + // If pattern is provided, force watch mode off and use pattern filter + const shouldWatch = opts.watch && opts.pattern == null; + if (opts.watch && opts.pattern != null) { + console.warn('NOTE: --watch is ignored when a --pattern is supplied'); + } + + if (shouldWatch) { + makeWatchRunner(state => onChange(worker, state), opts.filter); + if (opts.filter) { + /** + * Warm up wormers when in watch mode. Loading the Forget babel plugin + * and all of its transitive dependencies takes 1-3s (per worker) on a M1. + * As jest-worker dispatches tasks using a round-robin strategy, we can + * avoid an additional 1-3s wait on the first num_workers runs by warming + * up workers eagerly. + */ + for (let i = 0; i < NUM_WORKERS - 1; i++) { + worker.transformFixture( + { + fixturePath: 'tmp', + snapshotPath: './tmp.expect.md', + inputPath: './tmp.js', + input: ` + function Foo(props) { + return identity(props); + } + `, + snapshot: null, + }, + 0, + false, + false, + ); + } + } + } else { + // Non-watch mode. For simplicity we re-use the same watchSrc() function. + // After the first build completes run tests and exit + const tsWatch: ts.WatchOfConfigFile = + watchSrc( + () => {}, + async (isTypecheckSuccess: boolean) => { + let isSuccess = false; + if (!isTypecheckSuccess) { + console.error( + 'Found typescript errors in Forget source code, skipping test fixtures.', + ); + } else { + try { + execSync('yarn build', {cwd: PROJECT_ROOT}); + console.log('Built compiler successfully with tsup'); + + // Determine which filter to use + let testFilter: TestFilter | null = null; + if (opts.pattern) { + testFilter = { + debug: true, + paths: [opts.pattern], + }; + } else if (opts.filter) { + testFilter = await readTestFilter(); + } + + const results = await runFixtures(worker, testFilter, 0); + if (opts.update) { + update(results); + isSuccess = true; + } else { + isSuccess = report(results); + } + } catch (e) { + console.warn('Failed to build compiler with tsup:', e); + } + } + tsWatch?.close(); + await worker.end(); + process.exit(isSuccess ? 0 : 1); + }, + ); + } +} + +main(opts).catch(error => console.error(error)); diff --git a/compiler/packages/snap/src/sprout/README.md b/compiler/packages/snap/src/sprout/README.md new file mode 100644 index 00000000000..1499c2f71f6 --- /dev/null +++ b/compiler/packages/snap/src/sprout/README.md @@ -0,0 +1,80 @@ +## Sprout 🌱 +React Forget test framework that executes compiler fixtures. + +Currently, Sprout runs each fixture with a known set of inputs and annotations. Sprout compares execution outputs (i.e. return values and console logs) of original source code and the corresponding Forget-transformed version. +We hope to add fuzzing capabilities to Sprout, synthesizing sets of program inputs based on type and/or effect annotations. + +Sprout is now enabled for all fixtures! If Sprout cannot execute your fixture due to some technical limitations, add your fixture to [`SproutTodoFilter.ts`](./src/SproutTodoFilter.ts) with a comment explaining why. + +### Sprout CLI +Sprout is now run as a part of snap, except when in filter mode. + +### Adding fixtures to Sprout + +#### 1. Annotate fixtures. +Each fixture test executed by Sprout needs to export const `FIXTURE_ENTRYPOINT` object with the following type signature. + +```js +type FixtureEntrypoint = { + // function to be invoked + fn: ((...params: Array) => any), + // params to pass to fn + // (if `fn` is a react component, this should be an array + // with exactly one element -- props) + params: Array, +} +``` + +Example: +```js +// test.js +function MyComponent(props) { + return
{props.a + props.b}
; +} +export const FIXTURE_ENTRYPOINT = { + fn: MyComponent, + params: [{a: "hello ", b: "world"}], +}; +``` + +#### 2. Import / define helper functions. + +- Prefer importing helper functions for readability and simplicity. +- Fixtures that require helper functions with specific types or mutability can define their own within the same fixture file. + +```js +// test.js +import { addOne } from 'shared-runtime'; + +function customHelper(val1, val2) { + // This directive is important, as helper functions don't + // always follow the rules of React. + "use no forget"; + // ... +} + +// ... +``` + +#### Notes +- If your fixture needs to import from an external module, we currently only support importing from `react` (see Milestones todo list). + +- Any fixture can use React hooks, but they need to be first imported. We may later enforce that only `isComponent: true` fixtures can use React hooks. + ```ts + import {useState} from 'react'; + ``` + +- If your fixture wants to export multiple functions to Sprout to run, please split up the fixture into multiple files (e.g. `test-case-1`, `test-case-2`, etc). + +- Sprout currently runs each fixture in an iife to prevent variable collisions, but it does not run fixtures in isolation. Please do not mutate any external state in fixtures. + +- Sprout does not run fixtures listed in [`SproutTodoFilter.ts`](./src/SproutTodoFilter.ts), even in filter mode. + +### Milestones: +- [✅] Render fixtures with React runtime / `testing-library/react`. +- [✅] Make Sprout CLI -runnable and report results in process exit code. +- [✅] Enable Sprout by default and run it in the Github Actions pipeline. +- [🚧] Make all existing test fixtures Sprout compatible (see `SproutTodoFilter.ts`). This involves each fixture being annotated with `FIXTURE_ENTRYPOINT` and using shared functions and/or defining its own helpers. + - 77 done, ~410 to go +- [✅] *(optional)* Store Sprout output as snapshot files. i.e. each fixture could have a `fixture.js`, `fixture.snap.md`, and `fixture.sprout.md`. +- [✅] Add support for `fbt`. diff --git a/compiler/packages/snap/src/sprout/ReactForgetFeatureFlag.ts b/compiler/packages/snap/src/sprout/ReactForgetFeatureFlag.ts new file mode 100644 index 00000000000..48b0abd1803 --- /dev/null +++ b/compiler/packages/snap/src/sprout/ReactForgetFeatureFlag.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +export function isForgetEnabled_Fixtures(): boolean { + return true; +} diff --git a/compiler/packages/snap/src/sprout/evaluator.ts b/compiler/packages/snap/src/sprout/evaluator.ts new file mode 100644 index 00000000000..ba44f01b0aa --- /dev/null +++ b/compiler/packages/snap/src/sprout/evaluator.ts @@ -0,0 +1,310 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {render} from '@testing-library/react'; +import {JSDOM} from 'jsdom'; +import React, {MutableRefObject} from 'react'; +import util from 'util'; +import {z} from 'zod/v4'; +import {fromZodError} from 'zod-validation-error/v4'; +import {initFbt, toJSON} from './shared-runtime'; + +/** + * Set up the global environment for JSDOM tests. + * This is a hack to let us share code and setup between the test + * and runner environments. As an alternative, we could evaluate all setup + * in the jsdom test environment (which provides more isolation), but that + * may be slower. + */ +const {window: testWindow} = new JSDOM(undefined); +(globalThis as any).document = testWindow.document; +(globalThis as any).window = testWindow.window; +(globalThis as any).React = React; +(globalThis as any).render = render; +initFbt(); + +(globalThis as any).placeholderFn = function (..._args: Array) { + throw new Error('Fixture not implemented!'); +}; +export type EvaluatorResult = { + kind: 'ok' | 'exception' | 'UnexpectedError'; + value: string; + logs: Array; +}; + +/** + * Define types and schemas for fixture entrypoint + */ +const EntrypointSchema = z.strictObject({ + fn: z.union([z.function(), z.object({})]), + params: z.array(z.any()), + + // DEPRECATED, unused + isComponent: z.optional(z.boolean()), + + // if enabled, the `fn` is assumed to be a component and this is assumed + // to be an array of props. the component is mounted once and rendered + // once per set of props in this array. + sequentialRenders: z.optional(z.nullable(z.array(z.any()))).default(null), +}); +const ExportSchema = z.object({ + FIXTURE_ENTRYPOINT: EntrypointSchema, +}); + +const NO_ERROR_SENTINEL = Symbol(); +/** + * Wraps WrapperTestComponent in an error boundary to simplify re-rendering + * when an exception is thrown. + * A simpler alternative may be to re-mount test components manually. + */ +class WrapperTestComponentWithErrorBoundary extends React.Component< + {fn: any; params: Array}, + {errorFromLastRender: any} +> { + /** + * Limit retries of the child component by caching seen errors. + */ + propsErrorMap: Map; + lastProps: any | null; + // lastProps: object | null; + constructor(props: any) { + super(props); + this.lastProps = null; + this.propsErrorMap = new Map(); + this.state = { + errorFromLastRender: NO_ERROR_SENTINEL, + }; + } + static getDerivedStateFromError(error: any) { + // Reschedule a second render that immediately returns the cached error + return {errorFromLastRender: error}; + } + override componentDidUpdate() { + if (this.state.errorFromLastRender !== NO_ERROR_SENTINEL) { + // Reschedule a third render that immediately returns the cached error + this.setState({errorFromLastRender: NO_ERROR_SENTINEL}); + } + } + override render() { + if ( + this.state.errorFromLastRender !== NO_ERROR_SENTINEL && + this.props === this.lastProps + ) { + /** + * The last render errored, cache the error message to avoid running the + * test fixture more than once + */ + const errorMsg = `[[ (exception in render) ${this.state.errorFromLastRender?.toString()} ]]`; + this.propsErrorMap.set(this.lastProps, errorMsg); + return errorMsg; + } + this.lastProps = this.props; + const cachedError = this.propsErrorMap.get(this.props); + if (cachedError != null) { + return cachedError; + } + return React.createElement(WrapperTestComponent, this.props); + } +} + +function WrapperTestComponent(props: {fn: any; params: Array}) { + const result = props.fn(...props.params); + // Hacky solution to determine whether the fixture returned jsx (which + // needs to passed through to React's runtime as-is) or a non-jsx value + // (which should be converted to a string). + if (typeof result === 'object' && result != null && '$$typeof' in result) { + return result; + } else { + return toJSON(result); + } +} + +function renderComponentSequentiallyForEachProps( + fn: any, + sequentialRenders: Array, +): string { + if (sequentialRenders.length === 0) { + throw new Error( + 'Expected at least one set of props when using `sequentialRenders`', + ); + } + const initialProps = sequentialRenders[0]!; + const results = []; + const {rerender, container} = render( + React.createElement(WrapperTestComponentWithErrorBoundary, { + fn, + params: [initialProps], + }), + ); + results.push(container.innerHTML); + + for (let i = 1; i < sequentialRenders.length; i++) { + rerender( + React.createElement(WrapperTestComponentWithErrorBoundary, { + fn, + params: [sequentialRenders[i]], + }), + ); + results.push(container.innerHTML); + } + return results.join('\n'); +} + +type FixtureEvaluatorResult = Omit; +(globalThis as any).evaluateFixtureExport = function ( + exports: unknown, +): FixtureEvaluatorResult { + const parsedExportResult = ExportSchema.safeParse(exports); + if (!parsedExportResult.success) { + const exportDetail = + typeof exports === 'object' && exports != null + ? `object ${util.inspect(exports)}` + : `${exports}`; + return { + kind: 'UnexpectedError', + value: `${fromZodError(parsedExportResult.error)}\nFound ` + exportDetail, + }; + } + const entrypoint = parsedExportResult.data.FIXTURE_ENTRYPOINT; + if (entrypoint.sequentialRenders !== null) { + const result = renderComponentSequentiallyForEachProps( + entrypoint.fn, + entrypoint.sequentialRenders, + ); + + return { + kind: 'ok', + value: result ?? 'null', + }; + } else if (typeof entrypoint.fn === 'object') { + // Try to run fixture as a react component. This is necessary because not + // all components are functions (some are ForwardRef or Memo objects). + const result = render( + React.createElement(entrypoint.fn as any, entrypoint.params[0]), + ).container.innerHTML; + + return { + kind: 'ok', + value: result ?? 'null', + }; + } else { + const result = render(React.createElement(WrapperTestComponent, entrypoint)) + .container.innerHTML; + + return { + kind: 'ok', + value: result ?? 'null', + }; + } +}; + +export function doEval(source: string): EvaluatorResult { + 'use strict'; + + const originalConsole = globalThis.console; + const logs: Array = []; + const mockedLog = (...args: Array) => { + logs.push( + `${args.map(arg => { + if (arg instanceof Error) { + return arg.toString(); + } else { + return util.inspect(arg); + } + })}`, + ); + }; + + (globalThis.console as any) = { + info: mockedLog, + log: mockedLog, + warn: mockedLog, + error: (...args: Array) => { + if ( + typeof args[0] === 'string' && + args[0].includes('ReactDOMTestUtils.act` is deprecated') + ) { + // remove this once @testing-library/react is upgraded to React 19. + return; + } + + const stack = new Error().stack?.split('\n', 5) ?? []; + for (const stackFrame of stack) { + // React warns on exceptions thrown during render, we avoid printing + // here to reduce noise in test fixture outputs. + if ( + (stackFrame.includes('at logCaughtError') && + stackFrame.includes('react-dom-client.development.js')) || + (stackFrame.includes('at defaultOnRecoverableError') && + stackFrame.includes('react-dom-client.development.js')) + ) { + return; + } + } + mockedLog(...args); + }, + table: mockedLog, + trace: () => {}, + }; + try { + // source needs to be evaluated in the same scope as invoke + const evalResult: any = eval(` + (() => { + // Exports should be overwritten by source + let exports = { + FIXTURE_ENTRYPOINT: { + fn: globalThis.placeholderFn, + params: [], + }, + }; + let reachedInvoke = false; + try { + // run in an iife to avoid naming collisions + (() => {${source}})(); + reachedInvoke = true; + if (exports.FIXTURE_ENTRYPOINT?.fn === globalThis.placeholderFn) { + return { + kind: "exception", + value: "Fixture not implemented", + }; + } + return evaluateFixtureExport(exports); + } catch (e) { + if (!reachedInvoke) { + return { + kind: "UnexpectedError", + value: e.message, + }; + } else { + return { + kind: "exception", + value: e.message, + }; + } + } + })()`); + + const result = { + ...evalResult, + logs, + }; + return result; + } catch (e) { + // syntax errors will cause the eval to throw and bubble up here + return { + kind: 'UnexpectedError', + value: + 'Unexpected error during eval, possible syntax error?\n' + + e.message + + '\n\nsource:\n' + + source, + logs, + }; + } finally { + globalThis.console = originalConsole; + } +} diff --git a/compiler/packages/snap/src/sprout/index.ts b/compiler/packages/snap/src/sprout/index.ts new file mode 100644 index 00000000000..04748bed28f --- /dev/null +++ b/compiler/packages/snap/src/sprout/index.ts @@ -0,0 +1,74 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {EvaluatorResult, doEval} from './evaluator'; + +export type SproutResult = + | {kind: 'success'; value: string} + | {kind: 'invalid'; value: string}; + +function stringify(result: EvaluatorResult): string { + return `(kind: ${result.kind}) ${result.value}${ + result.logs.length > 0 ? `\nlogs: [${result.logs.toString()}]` : '' + }`; +} +function makeError(description: string, value: string): SproutResult { + return { + kind: 'invalid', + value: description + '\n' + value, + }; +} +function logsEqual(a: Array, b: Array) { + if (a.length !== b.length) { + return false; + } + return a.every((val, idx) => val === b[idx]); +} +export function runSprout( + originalCode: string, + forgetCode: string, +): SproutResult { + let forgetResult; + try { + (globalThis as any).__SNAP_EVALUATOR_MODE = 'forget'; + forgetResult = doEval(forgetCode); + } catch (e) { + throw e; + } finally { + (globalThis as any).__SNAP_EVALUATOR_MODE = undefined; + } + if (forgetResult.kind === 'UnexpectedError') { + return makeError('Unexpected error in Forget runner', forgetResult.value); + } + if (originalCode.indexOf('@disableNonForgetInSprout') === -1) { + const nonForgetResult = doEval(originalCode); + + if (nonForgetResult.kind === 'UnexpectedError') { + return makeError( + 'Unexpected error in non-forget runner', + nonForgetResult.value, + ); + } else if ( + forgetResult.kind !== nonForgetResult.kind || + forgetResult.value !== nonForgetResult.value || + !logsEqual(forgetResult.logs, nonForgetResult.logs) + ) { + return makeError( + 'Found differences in evaluator results', + `Non-forget (expected): +${stringify(nonForgetResult)} +Forget: +${stringify(forgetResult)} +`, + ); + } + } + return { + kind: 'success', + value: stringify(forgetResult), + }; +} diff --git a/compiler/packages/snap/src/sprout/shared-runtime-type-provider.ts b/compiler/packages/snap/src/sprout/shared-runtime-type-provider.ts new file mode 100644 index 00000000000..b01a204e78b --- /dev/null +++ b/compiler/packages/snap/src/sprout/shared-runtime-type-provider.ts @@ -0,0 +1,281 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import type { + Effect, + ValueKind, + ValueReason, +} from 'babel-plugin-react-compiler/src'; +import type {TypeConfig} from 'babel-plugin-react-compiler/src/HIR/TypeSchema'; + +export function makeSharedRuntimeTypeProvider({ + EffectEnum, + ValueKindEnum, + ValueReasonEnum, +}: { + EffectEnum: typeof Effect; + ValueKindEnum: typeof ValueKind; + ValueReasonEnum: typeof ValueReason; +}) { + return function sharedRuntimeTypeProvider( + moduleName: string, + ): TypeConfig | null { + if (moduleName === 'shared-runtime') { + return { + kind: 'object', + properties: { + default: { + kind: 'function', + calleeEffect: EffectEnum.Read, + positionalParams: [], + restParam: EffectEnum.Read, + returnType: {kind: 'type', name: 'Primitive'}, + returnValueKind: ValueKindEnum.Primitive, + }, + graphql: { + kind: 'function', + calleeEffect: EffectEnum.Read, + positionalParams: [], + restParam: EffectEnum.Read, + returnType: {kind: 'type', name: 'Primitive'}, + returnValueKind: ValueKindEnum.Primitive, + }, + typedArrayPush: { + kind: 'function', + calleeEffect: EffectEnum.Read, + positionalParams: [EffectEnum.Store, EffectEnum.Capture], + restParam: EffectEnum.Capture, + returnType: {kind: 'type', name: 'Primitive'}, + returnValueKind: ValueKindEnum.Primitive, + }, + typedLog: { + kind: 'function', + calleeEffect: EffectEnum.Read, + positionalParams: [], + restParam: EffectEnum.Read, + returnType: {kind: 'type', name: 'Primitive'}, + returnValueKind: ValueKindEnum.Primitive, + }, + useFreeze: { + kind: 'hook', + returnType: {kind: 'type', name: 'Any'}, + }, + useFragment: { + kind: 'hook', + returnType: {kind: 'type', name: 'MixedReadonly'}, + noAlias: true, + }, + useNoAlias: { + kind: 'hook', + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + noAlias: true, + }, + typedIdentity: { + kind: 'function', + positionalParams: [EffectEnum.Read], + restParam: null, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@value'], + rest: null, + returns: '@return', + temporaries: [], + effects: [{kind: 'Assign', from: '@value', into: '@return'}], + }, + }, + typedAssign: { + kind: 'function', + positionalParams: [EffectEnum.Read], + restParam: null, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@value'], + rest: null, + returns: '@return', + temporaries: [], + effects: [{kind: 'Assign', from: '@value', into: '@return'}], + }, + }, + typedAlias: { + kind: 'function', + positionalParams: [EffectEnum.Read], + restParam: null, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@value'], + rest: null, + returns: '@return', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@return', + value: ValueKindEnum.Mutable, + reason: ValueReasonEnum.KnownReturnSignature, + }, + {kind: 'Alias', from: '@value', into: '@return'}, + ], + }, + }, + typedCapture: { + kind: 'function', + positionalParams: [EffectEnum.Read], + restParam: null, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Array'}, + returnValueKind: ValueKindEnum.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@value'], + rest: null, + returns: '@return', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@return', + value: ValueKindEnum.Mutable, + reason: ValueReasonEnum.KnownReturnSignature, + }, + {kind: 'Capture', from: '@value', into: '@return'}, + ], + }, + }, + typedCreateFrom: { + kind: 'function', + positionalParams: [EffectEnum.Read], + restParam: null, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + aliasing: { + receiver: '@receiver', + params: ['@value'], + rest: null, + returns: '@return', + temporaries: [], + effects: [{kind: 'CreateFrom', from: '@value', into: '@return'}], + }, + }, + typedMutate: { + kind: 'function', + positionalParams: [EffectEnum.Read, EffectEnum.Capture], + restParam: null, + calleeEffect: EffectEnum.Store, + returnType: {kind: 'type', name: 'Primitive'}, + returnValueKind: ValueKindEnum.Primitive, + aliasing: { + receiver: '@receiver', + params: ['@object', '@value'], + rest: null, + returns: '@return', + temporaries: [], + effects: [ + { + kind: 'Create', + into: '@return', + value: ValueKindEnum.Primitive, + reason: ValueReasonEnum.KnownReturnSignature, + }, + {kind: 'Mutate', value: '@object'}, + {kind: 'Capture', from: '@value', into: '@object'}, + ], + }, + }, + }, + }; + } else if (moduleName === 'ReactCompilerKnownIncompatibleTest') { + /** + * Fake module used for testing validation of known incompatible + * API validation + */ + return { + kind: 'object', + properties: { + useKnownIncompatible: { + kind: 'hook', + positionalParams: [], + restParam: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + knownIncompatible: `useKnownIncompatible is known to be incompatible`, + }, + useKnownIncompatibleIndirect: { + kind: 'hook', + positionalParams: [], + restParam: EffectEnum.Read, + returnType: { + kind: 'object', + properties: { + incompatible: { + kind: 'function', + positionalParams: [], + restParam: EffectEnum.Read, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + knownIncompatible: `useKnownIncompatibleIndirect returns an incompatible() function that is known incompatible`, + }, + }, + }, + }, + knownIncompatible: { + kind: 'function', + positionalParams: [], + restParam: EffectEnum.Read, + calleeEffect: EffectEnum.Read, + returnType: {kind: 'type', name: 'Any'}, + returnValueKind: ValueKindEnum.Mutable, + knownIncompatible: `useKnownIncompatible is known to be incompatible`, + }, + }, + }; + } else if (moduleName === 'ReactCompilerTest') { + /** + * Fake module used for testing validation that type providers return hook + * types for hook names and non-hook types for non-hook names + */ + return { + kind: 'object', + properties: { + useHookNotTypedAsHook: { + kind: 'type', + name: 'Any', + }, + notAhookTypedAsHook: { + kind: 'hook', + returnType: {kind: 'type', name: 'Any'}, + }, + }, + }; + } else if (moduleName === 'useDefaultExportNotTypedAsHook') { + /** + * Fake module used for testing validation that type providers return hook + * types for hook names and non-hook types for non-hook names + */ + return { + kind: 'object', + properties: { + default: { + kind: 'type', + name: 'Any', + }, + }, + }; + } + return null; + }; +} diff --git a/compiler/packages/snap/src/sprout/shared-runtime.ts b/compiler/packages/snap/src/sprout/shared-runtime.ts new file mode 100644 index 00000000000..f37ca827090 --- /dev/null +++ b/compiler/packages/snap/src/sprout/shared-runtime.ts @@ -0,0 +1,424 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {IntlVariations, IntlViewerContext, init} from 'fbt'; +import React, {FunctionComponent} from 'react'; + +/** + * This file is meant for use by `runner-evaluator` and fixture tests. + * + * Any fixture test can import constants or functions exported here. + * However, the import path must be the relative path from `runner-evaluator` + * (which calls `eval` on each fixture) to this file. + * + * ```js + * // test.js + * import {CONST_STRING0} from './shared-runtime'; + * + * // ... + * ``` + */ + +export type StringKeyedObject = {[key: string]: unknown}; + +export const CONST_STRING0 = 'global string 0'; +export const CONST_STRING1 = 'global string 1'; +export const CONST_STRING2 = 'global string 2'; + +export const CONST_NUMBER0 = 0; +export const CONST_NUMBER1 = 1; +export const CONST_NUMBER2 = 2; + +export const CONST_TRUE = true; +export const CONST_FALSE = false; + +export function initFbt(): void { + const viewerContext: IntlViewerContext = { + GENDER: IntlVariations.GENDER_UNKNOWN, + locale: 'en_US', + }; + + init({ + translations: {}, + hooks: { + getViewerContext: () => viewerContext, + }, + }); +} + +export function mutate(arg: any): void { + // don't mutate primitive + if (arg == null || typeof arg !== 'object') { + return; + } else if (Array.isArray(arg)) { + arg.push('joe'); + } + + let count: number = 0; + let key; + while (true) { + key = 'wat' + count; + if (!Object.hasOwn(arg, key)) { + arg[key] = 'joe'; + return; + } + count++; + } +} + +export function mutateAndReturn(arg: T): T { + mutate(arg); + return arg; +} + +export function mutateAndReturnNewValue(arg: T): string { + mutate(arg); + return 'hello!'; +} + +export function setProperty(arg: any, property: any): void { + // don't mutate primitive + if (arg == null || typeof arg !== 'object') { + return arg; + } + + let count: number = 0; + let key; + while (true) { + key = 'wat' + count; + if (!Object.hasOwn(arg, key)) { + arg[key] = property; + return arg; + } + count++; + } +} + +export function setPropertyByKey< + T, + TKey extends keyof T, + TProperty extends T[TKey], +>(arg: T, key: TKey, property: TProperty): T { + arg[key] = property; + return arg; +} + +export function arrayPush(arr: Array, ...values: Array): Array { + arr.push(...values); + return arr; +} + +export function graphql(value: string): string { + return value; +} + +export function identity(x: T): T { + return x; +} + +export function getNumber(): number { + return 4; +} + +export function getNull(): null { + return null; +} + +export function getTrue(): true { + return true; +} + +export function getFalse(): false { + return false; +} + +export function calculateExpensiveNumber(x: number): number { + return x; +} + +/** + * Functions that do not mutate their parameters + */ +export function shallowCopy(obj: T): T { + return Object.assign({}, obj); +} + +export function makeObject_Primitives(): StringKeyedObject { + return {a: 0, b: 'value1', c: true}; +} + +export function makeArray(...values: Array): Array { + return [...values]; +} + +export function addOne(value: number): number { + return value + 1; +} + +/* + * Alias console.log, as it is defined as a global and may have + * different compiler handling than unknown functions + */ +export function print(...args: Array): void { + console.log(...args); +} + +export function sum(...args: Array): number { + return args.reduce((result, arg) => result + arg, 0); +} + +export function throwErrorWithMessage(message: string): never { + throw new Error(message); +} + +export function throwInput(x: object): never { + throw x; +} + +export function throwErrorWithMessageIf(cond: boolean, message: string): void { + if (cond) { + throw new Error(message); + } +} + +export function logValue(value: T): void { + console.log(value); +} + +export function useHook(): object { + return makeObject_Primitives(); +} + +const noAliasObject = Object.freeze({}); +export function useNoAlias(..._args: Array): object { + return noAliasObject; +} + +export function useIdentity(arg: T): T { + return arg; +} + +export function invoke, ReturnType>( + fn: (...input: T) => ReturnType, + ...params: T +): ReturnType { + return fn(...params); +} + +export function conditionalInvoke, ReturnType>( + shouldInvoke: boolean, + fn: (...input: T) => ReturnType, + ...params: T +): ReturnType | null { + if (shouldInvoke) { + return fn(...params); + } else { + return null; + } +} + +/** + * React Components + */ +export function Text(props: { + value: string; + children?: Array; +}): React.ReactElement { + return React.createElement('div', null, props.value, props.children); +} + +export function StaticText1(props: { + children?: Array; +}): React.ReactElement { + return React.createElement('div', null, 'StaticText1', props.children); +} + +export function StaticText2(props: { + children?: Array; +}): React.ReactElement { + return React.createElement('div', null, 'StaticText2', props.children); +} + +export function RenderPropAsChild(props: { + items: Array<() => React.ReactNode>; +}): React.ReactElement { + return React.createElement( + 'div', + null, + 'HigherOrderComponent', + props.items.map(item => item()), + ); +} + +export function Stringify(props: any): React.ReactElement { + return React.createElement( + 'div', + null, + toJSON(props, props?.shouldInvokeFns), + ); +} +export function Throw() { + throw new Error(); +} + +export function ValidateMemoization({ + inputs, + output: rawOutput, + onlyCheckCompiled = false, +}: { + inputs: Array; + output: any; + onlyCheckCompiled?: boolean; +}): React.ReactElement { + 'use no forget'; + // Wrap rawOutput as it might be a function, which useState would invoke. + const output = {value: rawOutput}; + const [previousInputs, setPreviousInputs] = React.useState(inputs); + const [previousOutput, setPreviousOutput] = React.useState(output); + if ( + !onlyCheckCompiled || + (onlyCheckCompiled && + (globalThis as any).__SNAP_EVALUATOR_MODE === 'forget') + ) { + if ( + inputs.length !== previousInputs.length || + inputs.some((item, i) => item !== previousInputs[i]) + ) { + // Some input changed, we expect the output to change + setPreviousInputs(inputs); + setPreviousOutput(output); + } else if (output.value !== previousOutput.value) { + // Else output should be stable + throw new Error('Output identity changed but inputs did not'); + } + } + return React.createElement(Stringify, {inputs, output: rawOutput}); +} + +export function createHookWrapper( + useMaybeHook: (props: TProps) => TRet, +): FunctionComponent { + return function Component(props: TProps): React.ReactElement { + const result = useMaybeHook(props); + return Stringify({ + result: result, + shouldInvokeFns: true, + }); + }; +} + +// helper functions +export function toJSON(value: any, invokeFns: boolean = false): string { + const seen = new Map(); + + return JSON.stringify(value, (_key: string, val: any) => { + if (typeof val === 'function') { + if (val.length === 0 && invokeFns) { + return { + kind: 'Function', + result: val(), + }; + } else { + return `[[ function params=${val.length} ]]`; + } + } else if (typeof val === 'object') { + let id = seen.get(val); + if (id != null) { + return `[[ cyclic ref *${id} ]]`; + } else if (val instanceof Map) { + return { + kind: 'Map', + value: Array.from(val.entries()), + }; + } else if (val instanceof Set) { + return { + kind: 'Set', + value: Array.from(val.values()), + }; + } + seen.set(val, seen.size); + } + return val; + }); +} +export class Builder { + vals: Array = []; + static makeBuilder(isNull: boolean, ...args: Array): Builder | null { + if (isNull) { + return null; + } else { + const builder = new Builder(); + builder.push(...args); + return builder; + } + } + push(...args: Array): Builder { + this.vals.push(...args); + return this; + } +} + +export const ObjectWithHooks = { + useFoo(): number { + return 0; + }, + useMakeArray(): Array { + return [1, 2, 3]; + }, + useIdentity(arg: T): T { + return arg; + }, +}; + +export function useFragment(..._args: Array): object { + return { + a: [1, 2, 3], + b: {c: {d: 4}}, + }; +} + +export function useSpecialEffect( + fn: () => any, + _secondArg: any, + deps: Array, +) { + React.useEffect(fn, deps); +} + +export function typedArrayPush(array: Array, item: T): void { + array.push(item); +} + +export function typedLog(...values: Array): void { + console.log(...values); +} + +export function typedIdentity(value: T): T { + return value; +} + +export function typedAssign(x: T): T { + return x; +} + +export function typedAlias(x: T): T { + return x; +} + +export function typedCapture(x: T): Array { + return [x]; +} + +export function typedCreateFrom(array: Array): T { + return array[0]; +} + +export function typedMutate(x: any, v: any = null): void { + x.property = v; +} + +export default typedLog; diff --git a/compiler/packages/snap/src/sprout/useEffectWrapper.ts b/compiler/packages/snap/src/sprout/useEffectWrapper.ts new file mode 100644 index 00000000000..b1589dac407 --- /dev/null +++ b/compiler/packages/snap/src/sprout/useEffectWrapper.ts @@ -0,0 +1,18 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/* This file is used to test the effect auto-deps configuration, which + * allows you to specify functions that should have dependencies added to + * callsites. + */ +import {useEffect} from 'react'; + +export default function useEffectWrapper(f: () => void | (() => void)): void { + useEffect(() => { + f(); + }, [f]); +} diff --git a/compiler/packages/snap/src/types.d.ts b/compiler/packages/snap/src/types.d.ts new file mode 100644 index 00000000000..b624caf19c5 --- /dev/null +++ b/compiler/packages/snap/src/types.d.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// v0.17.1 +declare module 'hermes-parser' { + type HermesParserOptions = { + allowReturnOutsideFunction?: boolean; + babel?: boolean; + flow?: 'all' | 'detect'; + enableExperimentalComponentSyntax?: boolean; + sourceFilename?: string; + sourceType?: 'module' | 'script' | 'unambiguous'; + tokens?: boolean; + }; + export function parse(code: string, options: Partial); +} diff --git a/compiler/packages/snap/tsconfig.json b/compiler/packages/snap/tsconfig.json new file mode 100644 index 00000000000..668e8145646 --- /dev/null +++ b/compiler/packages/snap/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "@tsconfig/strictest/tsconfig.json", + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "NodeNext", + "declaration": true, + "outDir": "dist", + "jsx": "react-jsxdev", + "lib": ["ES2022"], + + // weaken strictness from preset + "importsNotUsedAsValues": "remove", + "noUncheckedIndexedAccess": false, + "noUnusedParameters": false, + "useUnknownInCatchVariables": false, + "target": "ES2015", + // ideally turn off only during dev, or on a per-file basis + "noUnusedLocals": false, + "sourceMap": true + }, + "exclude": ["node_modules"], + "include": ["src/**/*.ts"], +} diff --git a/compiler/scripts/anonymize.js b/compiler/scripts/anonymize.js new file mode 100644 index 00000000000..278e582c101 --- /dev/null +++ b/compiler/scripts/anonymize.js @@ -0,0 +1,250 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +const fs = require('fs'); +const HermesParser = require('hermes-parser'); +const BabelParser = require('@babel/parser'); +const BabelCore = require('@babel/core'); +const invariant = require('invariant'); +const {argv, stdin} = require('process'); +const prettier = require('prettier'); +const {JSXText} = require('hermes-parser/dist/generated/ESTreeVisitorKeys'); + +function runPlugin(text, file, language) { + let ast; + if (language === 'flow') { + ast = HermesParser.parse(text, { + babel: true, + flow: 'all', + sourceFilename: file, + sourceType: 'module', + enableExperimentalComponentSyntax: true, + }); + } else { + ast = BabelParser.parse(text, { + sourceFilename: file, + plugins: ['typescript', 'jsx'], + sourceType: 'module', + }); + } + const result = BabelCore.transformFromAstSync(ast, text, { + ast: false, + filename: file, + highlightCode: false, + retainLines: true, + plugins: [[AnonymizePlugin]], + sourceType: 'module', + configFile: false, + babelrc: false, + }); + invariant( + result?.code != null, + `Expected BabelPluginReactForget to codegen successfully, got: ${result}` + ); + return result.code; +} + +async function format(code, language) { + return await prettier.format(code, { + semi: true, + parser: language === 'typescript' ? 'babel-ts' : 'flow', + }); +} + +const TAG_NAMES = new Set([ + 'a', + 'body', + 'button', + 'div', + 'form', + 'head', + 'html', + 'input', + 'label', + 'select', + 'span', + 'textarea', + + // property/attribute names + 'value', + 'checked', + 'onClick', + 'onSubmit', + 'name', +]); + +const BUILTIN_HOOKS = new Set([ + 'useContext', + 'useEffect', + 'useInsertionEffect', + 'useLayoutEffect', + 'useReducer', + 'useState', +]); + +const GLOBALS = new Set([ + 'String', + 'Object', + 'Function', + 'Number', + 'RegExp', + 'Date', + 'Error', + 'Function', + 'TypeError', + 'RangeError', + 'ReferenceError', + 'SyntaxError', + 'URIError', + 'EvalError', + 'Boolean', + 'DataView', + 'Float32Array', + 'Float64Array', + 'Int8Array', + 'Int16Array', + 'Int32Array', + 'Map', + 'Set', + 'WeakMap', + 'Uint8Array', + 'Uint8ClampedArray', + 'Uint16Array', + 'Uint32Array', + 'ArrayBuffer', + 'JSON', + 'parseFloat', + 'parseInt', + 'console', + 'isNaN', + 'eval', + 'isFinite', + 'encodeURI', + 'decodeURI', + 'encodeURIComponent', + 'decodeURIComponent', + + // common method/property names of globals + 'map', + 'push', + 'at', + 'filter', + 'slice', + 'splice', + 'add', + 'get', + 'set', + 'has', + 'size', + 'length', + 'toString', +]); + +function AnonymizePlugin(_babel) { + let index = 0; + const identifiers = new Map(); + const literals = new Map(); + return { + name: 'anonymize', + visitor: { + JSXNamespacedName(path) { + throw error('TODO: handle JSXNamedspacedName'); + }, + JSXIdentifier(path) { + const name = path.node.name; + if (TAG_NAMES.has(name)) { + return; + } + let nextName = identifiers.get(name); + if (nextName == null) { + const isCapitalized = + name.slice(0, 1).toUpperCase() === name.slice(0, 1); + nextName = isCapitalized + ? `Component${(index++).toString(16).toUpperCase()}` + : `c${(index++).toString(16)}`; + identifiers.set(name, nextName); + } + path.node.name = nextName; + }, + Identifier(path) { + const name = path.node.name; + if (BUILTIN_HOOKS.has(name) || GLOBALS.has(name)) { + return; + } + let nextName = identifiers.get(name); + if (nextName == null) { + const isCapitalized = + name.slice(0, 1).toUpperCase() === name.slice(0, 1); + const prefix = isCapitalized ? 'V' : 'v'; + nextName = `${prefix}${(index++).toString(16)}`; + if (name.startsWith('use')) { + nextName = + 'use' + nextName.slice(0, 1).toUpperCase() + nextName.slice(1); + } + identifiers.set(name, nextName); + } + path.node.name = nextName; + }, + JSXText(path) { + const value = path.node.value; + let nextValue = literals.get(value); + if (nextValue == null) { + let string = ''; + while (string.length < value.length) { + string += String.fromCharCode(Math.round(Math.random() * 25) + 97); + } + nextValue = string; + literals.set(value, nextValue); + } + path.node.value = nextValue; + }, + StringLiteral(path) { + const value = path.node.value; + let nextValue = literals.get(value); + if (nextValue == null) { + let string = ''; + while (string.length < value.length) { + string += String.fromCharCode(Math.round(Math.random() * 58) + 65); + } + nextValue = string; + literals.set(value, nextValue); + } + path.node.value = nextValue; + }, + NumericLiteral(path) { + const value = path.node.value; + let nextValue = literals.get(value); + if (nextValue == null) { + nextValue = Number.isInteger(value) + ? Math.round(Math.random() * Number.MAX_SAFE_INTEGER) + : Math.random() * Number.MAX_VALUE; + literals.set(value, nextValue); + } + path.node.value = nextValue; + }, + }, + }; +} + +let file; +let text; +if (argv.length >= 3) { + file = argv[2]; + text = fs.readFileSync(file, 'utf8'); +} else { + // read from stdin + file = 'stdin.js'; + text = fs.readFileSync(stdin.fd, 'utf8'); +} +const language = + file.endsWith('.ts') || file.endsWith('.tsx') ? 'typescript' : 'flow'; +const result = runPlugin(text, file, language); +format(result, language).then(formatted => { + console.log(formatted); +}); diff --git a/compiler/scripts/build-eslint-docs.js b/compiler/scripts/build-eslint-docs.js new file mode 100644 index 00000000000..f4e411590e8 --- /dev/null +++ b/compiler/scripts/build-eslint-docs.js @@ -0,0 +1,34 @@ +const ReactCompiler = require('../packages/babel-plugin-react-compiler/dist'); + +const combinedRules = [ + { + name: 'rules-of-hooks', + recommended: true, + description: + 'Validates that components and hooks follow the [Rules of Hooks](https://react.dev/reference/rules/rules-of-hooks)', + }, + { + name: 'exhaustive-deps', + recommended: true, + description: + 'Validates that hooks which accept dependency arrays (`useMemo()`, `useCallback()`, `useEffect()`, etc) ' + + 'list all referenced variables in their dependency array. Referencing a value without including it in the ' + + 'dependency array can lead to stale UI or callbacks.', + }, + ...ReactCompiler.LintRules, +]; + +const printed = combinedRules + .filter( + ruleConfig => ruleConfig.rule.recommended && ruleConfig.severity !== 'Off' + ) + .map(ruleConfig => { + return ` +## \`react-hooks/${ruleConfig.rule.name}\` + +${ruleConfig.rule.description} + `.trim(); + }) + .join('\n\n'); + +console.log(printed); diff --git a/compiler/scripts/copyright.js b/compiler/scripts/copyright.js new file mode 100644 index 00000000000..0a5ef2e29ae --- /dev/null +++ b/compiler/scripts/copyright.js @@ -0,0 +1,68 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +const fs = require('fs'); +const glob = require('glob'); + +const META_COPYRIGHT_COMMENT_BLOCK = + `/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */`.trim() + '\n\n'; + +const files = glob.sync('**/*.{js,ts,tsx,jsx,rs}', { + ignore: [ + '**/dist/**', + '**/node_modules/**', + '**/tests/fixtures/**', + '**/__tests__/fixtures/**', + ], +}); + +const updatedFiles = new Map(); +let hasErrors = false; +files.forEach(file => { + try { + const result = processFile(file); + if (result != null) { + updatedFiles.set(file, result); + } + } catch (e) { + console.error(e); + hasErrors = true; + } +}); +if (hasErrors) { + console.error('Update failed'); + process.exit(1); +} else { + for (const [file, source] of updatedFiles) { + fs.writeFileSync(file, source, 'utf8'); + } + console.log('Update complete'); +} + +function processFile(file) { + if (fs.lstatSync(file).isDirectory()) { + return; + } + let source = fs.readFileSync(file, 'utf8'); + + if (source.indexOf(META_COPYRIGHT_COMMENT_BLOCK) === 0) { + return null; + } + if (/^\/\*\*/.test(source)) { + source = source.replace(/\/\*\*[^\/]+\/\s+/, META_COPYRIGHT_COMMENT_BLOCK); + } else { + source = `${META_COPYRIGHT_COMMENT_BLOCK}${source}`; + } + return source; +} diff --git a/compiler/scripts/enable-feature-flag.js b/compiler/scripts/enable-feature-flag.js new file mode 100755 index 00000000000..f51c5b48417 --- /dev/null +++ b/compiler/scripts/enable-feature-flag.js @@ -0,0 +1,347 @@ +#!/usr/bin/env node +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const {execSync} = require('child_process'); +const yargs = require('yargs/yargs'); +const {hideBin} = require('yargs/helpers'); + +// Constants +const COMPILER_ROOT = path.resolve(__dirname, '..'); +const ENVIRONMENT_TS_PATH = path.join( + COMPILER_ROOT, + 'packages/babel-plugin-react-compiler/src/HIR/Environment.ts' +); +const FIXTURES_PATH = path.join( + COMPILER_ROOT, + 'packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler' +); +const FIXTURE_EXTENSIONS = ['.js', '.jsx', '.ts', '.tsx']; + +/** + * Parse command line arguments + */ +function parseArgs() { + const argv = yargs(hideBin(process.argv)) + .usage('Usage: $0 ') + .command('$0 ', 'Enable a feature flag by default', yargs => { + yargs.positional('flag-name', { + describe: 'Name of the feature flag to enable', + type: 'string', + }); + }) + .example( + '$0 validateExhaustiveMemoizationDependencies', + 'Enable the validateExhaustiveMemoizationDependencies flag' + ) + .help('h') + .alias('h', 'help') + .strict() + .parseSync(); + + return argv['flag-name']; +} + +/** + * Enable a feature flag in Environment.ts by changing default(false) to default(true) + */ +function enableFlagInEnvironment(flagName) { + console.log(`\nEnabling flag "${flagName}" in Environment.ts...`); + + const content = fs.readFileSync(ENVIRONMENT_TS_PATH, 'utf8'); + + // Check if the flag exists with default(false) + const flagPatternFalse = new RegExp( + `(${escapeRegex(flagName)}:\\s*z\\.boolean\\(\\)\\.default\\()false(\\))`, + 'g' + ); + + if (!flagPatternFalse.test(content)) { + // Check if flag exists at all + const flagExistsPattern = new RegExp( + `${escapeRegex(flagName)}:\\s*z\\.boolean\\(\\)`, + 'g' + ); + if (flagExistsPattern.test(content)) { + // Check if it's already true + const flagPatternTrue = new RegExp( + `${escapeRegex(flagName)}:\\s*z\\.boolean\\(\\)\\.default\\(true\\)`, + 'g' + ); + if (flagPatternTrue.test(content)) { + console.error(`Error: Flag "${flagName}" already has default(true)`); + process.exit(1); + } + console.error( + `Error: Flag "${flagName}" exists but doesn't have default(false)` + ); + process.exit(1); + } + console.error(`Error: Flag "${flagName}" not found in Environment.ts`); + process.exit(1); + } + + // Perform the replacement + const newContent = content.replace(flagPatternFalse, '$1true$2'); + + // Verify the replacement worked + if (content === newContent) { + console.error(`Error: Failed to replace flag "${flagName}"`); + process.exit(1); + } + + fs.writeFileSync(ENVIRONMENT_TS_PATH, newContent, 'utf8'); + console.log(`Successfully enabled "${flagName}" in Environment.ts`); +} + +/** + * Helper to escape regex special characters + */ +function escapeRegex(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** + * Run yarn snap and capture output + */ +function runTests() { + console.log('\nRunning test suite (yarn snap)...'); + + try { + const output = execSync('yarn snap', { + cwd: COMPILER_ROOT, + encoding: 'utf8', + stdio: 'pipe', + maxBuffer: 10 * 1024 * 1024, // 10MB buffer + }); + return {success: true, output}; + } catch (error) { + // yarn snap exits with code 1 when tests fail, which throws an error + return {success: false, output: error.stdout || error.message}; + } +} + +/** + * Parse failing test names from test output + */ +function parseFailingTests(output) { + const failingTests = []; + + // Look for lines that contain "FAIL:" followed by the test name + // Format: "FAIL: test-name" or with ANSI codes + const lines = output.split('\n'); + for (const line of lines) { + // Remove ANSI codes for easier parsing + const cleanLine = line.replace(/\x1b\[[0-9;]*m/g, ''); + + // Match "FAIL: test-name" + const match = cleanLine.match(/^FAIL:\s*(.+)$/); + if (match) { + failingTests.push(match[1].trim()); + } + } + + return failingTests; +} + +/** + * Find the fixture file for a given test name + */ +function findFixtureFile(testName) { + const basePath = path.join(FIXTURES_PATH, testName); + + for (const ext of FIXTURE_EXTENSIONS) { + const filePath = basePath + ext; + if (fs.existsSync(filePath)) { + return filePath; + } + } + + return null; +} + +/** + * Add pragma to disable the feature flag in a fixture file + */ +function addPragmaToFixture(filePath, flagName) { + const content = fs.readFileSync(filePath, 'utf8'); + const lines = content.split('\n'); + + if (lines.length === 0) { + console.warn(`Warning: Empty file ${filePath}`); + return false; + } + + const firstLine = lines[0]; + const pragma = `@${flagName}:false`; + + // Check if pragma already exists + if (firstLine.includes(pragma)) { + return false; // Already has the pragma + } + + // Check if first line is a single-line comment + if (firstLine.trim().startsWith('//')) { + // Append pragma to existing comment + lines[0] = firstLine + ' ' + pragma; + } else if (firstLine.trim().startsWith('/*')) { + // Multi-line comment - insert new line before it + lines.unshift('// ' + pragma); + } else { + // No comment - insert new comment as first line + lines.unshift('// ' + pragma); + } + + fs.writeFileSync(filePath, lines.join('\n'), 'utf8'); + return true; +} + +/** + * Update snapshot files + */ +function updateSnapshots() { + console.log('\nUpdating snapshots (yarn snap -u)...'); + + try { + execSync('yarn snap -u', { + cwd: COMPILER_ROOT, + encoding: 'utf8', + stdio: 'pipe', + maxBuffer: 10 * 1024 * 1024, + }); + console.log('Snapshots updated successfully'); + return true; + } catch (error) { + console.error('Error updating snapshots:', error.message); + return false; + } +} + +/** + * Verify all tests pass + */ +function verifyAllTestsPass() { + console.log('\nRunning final verification (yarn snap)...'); + + const {success, output} = runTests(); + + // Parse summary line: "N Tests, N Passed, N Failed" + const summaryMatch = output.match( + /(\d+)\s+Tests,\s+(\d+)\s+Passed,\s+(\d+)\s+Failed/ + ); + + if (summaryMatch) { + const [, total, passed, failed] = summaryMatch; + console.log( + `\nTest Results: ${total} Tests, ${passed} Passed, ${failed} Failed` + ); + + if (failed === '0') { + console.log('All tests passed!'); + return true; + } else { + console.error(`${failed} tests still failing`); + const failingTests = parseFailingTests(output); + if (failingTests.length > 0) { + console.error('\nFailing tests:'); + failingTests.forEach(test => console.error(` - ${test}`)); + } + return false; + } + } + + return success; +} + +/** + * Main function + */ +async function main() { + const flagName = parseArgs(); + + console.log(`\nEnabling flag: '${flagName}'`); + + try { + // Step 1: Enable flag in Environment.ts + enableFlagInEnvironment(flagName); + + // Step 2: Run tests to find failures + const {output} = runTests(); + const failingTests = parseFailingTests(output); + + console.log(`\nFound ${failingTests.length} failing tests`); + + if (failingTests.length === 0) { + console.log('No failing tests! Feature flag enabled successfully.'); + process.exit(0); + } + + // Step 3: Add pragma to each failing fixture + console.log(`\nAdding '@${flagName}:false' pragma to failing fixtures...`); + + const notFound = []; + let notFoundCount = 0; + + for (const testName of failingTests) { + const fixturePath = findFixtureFile(testName); + + if (!fixturePath) { + console.warn(`Could not find fixture file for: ${testName}`); + notFound.push(fixturePath); + continue; + } + + const updated = addPragmaToFixture(fixturePath, flagName); + if (updated) { + updatedCount++; + console.log(` Updated: ${testName}`); + } + } + + console.log( + `\nSummary: Updated ${updatedCount} fixtures, ${notFoundCount} not found` + ); + + if (notFoundCount.length !== 0) { + console.error( + '\nFailed to update snapshots, could not find:\n' + notFound.join('\n') + ); + process.exit(1); + } + + // Step 4: Update snapshots + if (!updateSnapshots()) { + console.error('\nFailed to update snapshots'); + process.exit(1); + } + + // Step 5: Verify all tests pass + if (!verifyAllTestsPass()) { + console.error('\nVerification failed: Some tests are still failing'); + process.exit(1); + } + + console.log('\nSuccess! Feature flag enabled and all tests passing.'); + console.log(`\nSummary:`); + console.log(` - Enabled "${flagName}" in Environment.ts`); + console.log(` - Updated ${updatedCount} fixture files with pragma`); + console.log(` - All tests passing`); + + process.exit(0); + } catch (error) { + console.error('\nFatal error:', error.message); + console.error(error.stack); + process.exit(1); + } +} + +// Run the script +main(); diff --git a/compiler/scripts/hash.sh b/compiler/scripts/hash.sh new file mode 100755 index 00000000000..2d454af67db --- /dev/null +++ b/compiler/scripts/hash.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +set -eo pipefail + +# Hashes JS files in the provided directory to create a cache-breaker + +find $1 -name '*.js' | sort | xargs shasum | shasum | awk '{ print $1 }' diff --git a/compiler/scripts/release/ci-npmrc b/compiler/scripts/release/ci-npmrc new file mode 100644 index 00000000000..ae643592e76 --- /dev/null +++ b/compiler/scripts/release/ci-npmrc @@ -0,0 +1 @@ +//registry.npmjs.org/:_authToken=${NPM_TOKEN} diff --git a/compiler/scripts/release/prompt-for-otp.js b/compiler/scripts/release/prompt-for-otp.js new file mode 100644 index 00000000000..3cb1e419c78 --- /dev/null +++ b/compiler/scripts/release/prompt-for-otp.js @@ -0,0 +1,24 @@ +#!/usr/bin/env node +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const prompt = require('prompt-promise'); + +const run = async () => { + while (true) { + const otp = await prompt('NPM 2-factor auth code: '); + prompt.done(); + if (otp) { + return otp; + } else { + console.error('\nTwo-factor auth is required to publish.'); + // (Ask again.) + } + } +}; + +module.exports = run; diff --git a/compiler/scripts/release/publish.js b/compiler/scripts/release/publish.js new file mode 100755 index 00000000000..4ff332d300a --- /dev/null +++ b/compiler/scripts/release/publish.js @@ -0,0 +1,237 @@ +#!/usr/bin/env node +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +const ora = require('ora'); +const path = require('path'); +const yargs = require('yargs'); +const {hashElement} = require('folder-hash'); +const promptForOTP = require('./prompt-for-otp'); +const {PUBLISHABLE_PACKAGES} = require('./shared/packages'); +const { + execHelper, + getDateStringForCommit, + spawnHelper, +} = require('./shared/utils'); +const {buildPackages} = require('./shared/build-packages'); +const {readJson, writeJson} = require('fs-extra'); + +/** + * Script for publishing PUBLISHABLE_PACKAGES to npm. By default, this runs in tarball mode, meaning + * the script will only print out what the contents of the files included in the npm tarball would + * be. + * + * Please run this first (ie `yarn npm:publish`) and double check the contents of the files that + * will be pushed to npm. + * + * If it looks good, you can run `yarn npm:publish --for-real` to really publish to npm. You must + * have 2FA enabled first and the script will prompt you to enter a 2FA code before proceeding. + * There's a small annoying delay before the packages are actually pushed to give you time to panic + * cancel. In this mode, we will bump the version field of each package's package.json, and git + * commit it. Then, the packages will be published to npm. + * + * Optionally, you can add the `--debug` flag to `yarn npm:publish --debug --for-real` to run all + * steps, but the final npm publish step will have the `--dry-run` flag added to it. This will make + * the command only report what it would have done, instead of actually publishing to npm. + */ +async function main() { + const argv = yargs(process.argv.slice(2)) + .option('packages', { + description: 'which packages to publish, defaults to all', + choices: PUBLISHABLE_PACKAGES, + default: PUBLISHABLE_PACKAGES, + }) + .option('for-real', { + alias: 'frfr', + description: + 'whether to publish to npm (npm publish) or dryrun (npm publish --dry-run)', + type: 'boolean', + default: false, + }) + .option('debug', { + description: + 'If enabled, will always run npm commands in dry run mode irregardless of the for-real flag', + type: 'boolean', + default: false, + }) + .option('ci', { + description: 'Publish packages via CI', + type: 'boolean', + default: false, + }) + .option('tag', { + description: 'Tag to publish to npm', + type: 'choices', + choices: ['experimental', 'beta', 'rc', 'latest'], + default: 'experimental', + }) + .option('tag-version', { + description: + 'Optional tag version to append to tag name, eg `1` becomes 0.0.0-rc.1', + type: 'number', + default: null, + }) + .option('version-name', { + description: 'Version name', + type: 'string', + default: '0.0.0', + }) + .help('help') + .strict() + .parseSync(); + + if (argv.debug === false) { + const currBranchName = await execHelper('git rev-parse --abbrev-ref HEAD'); + const isPristine = (await execHelper('git status --porcelain')) === ''; + if (currBranchName !== 'main' || isPristine === false) { + throw new Error( + 'This script must be run from the `main` branch with no uncommitted changes' + ); + } + } + + let pkgNames = argv.packages; + if (Array.isArray(argv.packages) === false) { + pkgNames = [argv.packages]; + } + const spinner = ora( + `Preparing to publish ${argv.versionName}@${argv.tag} ${ + argv.forReal === true ? '(for real)' : '(dry run)' + } [debug=${argv.debug}]` + ).info(); + + await buildPackages(pkgNames); + + if (argv.forReal === false) { + spinner.info('Dry run: Report tarball contents'); + for (const pkgName of pkgNames) { + console.log(`\n========== ${pkgName} ==========\n`); + spinner.start(`Running npm pack --dry-run\n`); + try { + await spawnHelper('npm', ['pack', '--dry-run'], { + cwd: path.resolve(__dirname, `../../packages/${pkgName}`), + stdio: 'inherit', + }); + } catch (e) { + spinner.fail(e.toString()); + throw e; + } + spinner.stop(`Successfully packed ${pkgName} (dry run)`); + } + spinner.succeed( + 'Please confirm contents of packages before publishing. You can run this command again with --for-real to publish to npm' + ); + } + + if (argv.forReal === true) { + const commit = await execHelper( + 'git show -s --no-show-signature --format=%h', + { + cwd: path.resolve(__dirname, '..'), + } + ); + const dateString = await getDateStringForCommit(commit); + const otp = + argv.ci === false && argv.debug === false ? await promptForOTP() : null; + const {hash} = await hashElement(path.resolve(__dirname, '../..'), { + encoding: 'hex', + folders: {exclude: ['node_modules']}, + files: {exclude: ['.DS_Store']}, + }); + const truncatedHash = hash.slice(0, 7); + let newVersion; + if (argv.tag === 'latest') { + newVersion = argv.versionName; + } else { + newVersion = + argv.tagVersion == null || argv.tagVersion === '' + ? `${argv.versionName}-${argv.tag}` + : `${argv.versionName}-${argv.tag}.${argv.tagVersion}`; + } + if (argv.tag === 'experimental' || argv.tag === 'beta') { + newVersion = `${newVersion}-${truncatedHash}-${dateString}`; + } + + for (const pkgName of pkgNames) { + const pkgDir = path.resolve(__dirname, `../../packages/${pkgName}`); + const pkgJsonPath = path.resolve( + __dirname, + `../../packages/${pkgName}/package.json` + ); + + spinner.start(`Writing package.json for ${pkgName}@${newVersion}`); + await writeJson( + pkgJsonPath, + { + ...(await readJson(pkgJsonPath)), + version: newVersion, + }, + {spaces: 2} + ); + spinner.succeed(`Wrote package.json for ${pkgName}@${newVersion}`); + + console.log(`\n========== ${pkgName} ==========\n`); + spinner.start(`Publishing ${pkgName}@${newVersion} to npm\n`); + + let opts = []; + if (argv.debug === true) { + opts.push('--dry-run'); + } + if (otp != null) { + opts.push(`--otp=${otp}`); + } + + opts.push(`--tag=${argv.tag}`); + + try { + await spawnHelper( + 'npm', + ['publish', ...opts, '--registry=https://registry.npmjs.org'], + { + cwd: pkgDir, + stdio: 'inherit', + } + ); + console.log('\n'); + } catch (e) { + spinner.fail(e.toString()); + throw e; + } + spinner.succeed(`Successfully published ${pkgName} to npm`); + + spinner.start('Pushing tags to npm'); + if (typeof argv.tag === 'string') { + try { + let opts = ['dist-tag', 'add', `${pkgName}@${newVersion}`, argv.tag]; + if (otp != null) { + opts.push(`--otp=${otp}`); + } + if (argv.debug === true) { + spinner.info(`dry-run: npm ${opts.join(' ')}`); + } else { + await spawnHelper('npm', opts, { + cwd: pkgDir, + stdio: 'inherit', + }); + } + } catch (e) { + spinner.fail(e.toString()); + throw e; + } + spinner.succeed( + `Successfully pushed dist-tag ${argv.tag} for ${pkgName} to npm` + ); + } + } + + console.log('\n\n✅ All done'); + } +} + +main(); diff --git a/compiler/scripts/release/shared/build-packages.js b/compiler/scripts/release/shared/build-packages.js new file mode 100644 index 00000000000..0a5ac1f5c2b --- /dev/null +++ b/compiler/scripts/release/shared/build-packages.js @@ -0,0 +1,29 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const ora = require('ora'); +const {execHelper} = require('./utils'); + +async function buildPackages(pkgNames) { + const spinner = ora(`Building packages`).info(); + for (const pkgName of pkgNames) { + const command = `NODE_ENV=production yarn workspace ${pkgName} run build --dts`; + spinner.start(`Running: ${command}\n`); + try { + await execHelper(command); + } catch (e) { + spinner.fail(e.toString()); + throw e; + } + spinner.succeed(`Successfully built ${pkgName}`); + } + spinner.stop(); +} + +module.exports = { + buildPackages, +}; diff --git a/compiler/scripts/release/shared/packages.js b/compiler/scripts/release/shared/packages.js new file mode 100644 index 00000000000..235ba0f1ddb --- /dev/null +++ b/compiler/scripts/release/shared/packages.js @@ -0,0 +1,16 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const PUBLISHABLE_PACKAGES = [ + 'babel-plugin-react-compiler', + 'react-compiler-healthcheck', + 'react-compiler-runtime', +]; + +module.exports = { + PUBLISHABLE_PACKAGES, +}; diff --git a/compiler/scripts/release/shared/utils.js b/compiler/scripts/release/shared/utils.js new file mode 100644 index 00000000000..bda2d28c032 --- /dev/null +++ b/compiler/scripts/release/shared/utils.js @@ -0,0 +1,48 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const cp = require('child_process'); +const util = require('util'); + +function execHelper(command, options, streamStdout = false) { + return new Promise((resolve, reject) => { + const proc = cp.exec(command, options, (error, stdout) => + error ? reject(error) : resolve(stdout.trim()) + ); + if (streamStdout) { + proc.stdout.pipe(process.stdout); + } + }); +} + +function _spawn(command, args, options, cb) { + const child = cp.spawn(command, args, options); + child.on('close', exitCode => { + cb(null, exitCode); + }); + return child; +} +const spawnHelper = util.promisify(_spawn); + +async function getDateStringForCommit(commit) { + let dateString = await execHelper( + `git show -s --no-show-signature --format=%cd --date=format:%Y%m%d ${commit}` + ); + + // On CI environment, this string is wrapped with quotes '...'s + if (dateString.startsWith("'")) { + dateString = dateString.slice(1, 9); + } + + return dateString; +} + +module.exports = { + execHelper, + spawnHelper, + getDateStringForCommit, +}; diff --git a/compiler/scripts/update-commit-message.js b/compiler/scripts/update-commit-message.js new file mode 100644 index 00000000000..7cda9547ecc --- /dev/null +++ b/compiler/scripts/update-commit-message.js @@ -0,0 +1,147 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * INSTALLATION: + * - `$ npm install octokit + * - Get a token from https://github.com/settings/tokens for use in the command below, + * set the token value as the GITHUB_AUTH_TOKEN environment variable + * + * USAGE: + * - $ GITHUB_AUTH_TOKEN="..." git filter-branch -f --msg-filter "node update-commit-message.js" 2364096862b72cf4d801ef2008c54252335a2df9..HEAD + */ + +const {Octokit, App} = require('octokit'); +const fs = require('fs'); + +const OWNER = 'facebook'; +const REPO = 'react-forget'; +const octokit = new Octokit({auth: process.env.GITHUB_AUTH_TOKEN}); + +const fetchPullRequest = async pullNumber => { + const response = await octokit.request( + 'GET /repos/{owner}/{repo}/pulls/{pull_number}', + { + owner: OWNER, + repo: REPO, + pull_number: pullNumber, + headers: { + 'X-GitHub-Api-Version': '2022-11-28', + }, + } + ); + return {body: response.data.body, title: response.data.title}; +}; + +function formatCommitMessage(str) { + let formattedStr = ''; + let line = ''; + + const trim = str.replace(/(\r\n|\n|\r)/gm, ' ').trim(); + if (!trim) { + return ''; + } + + // Split the string into words + const words = trim.split(' '); + // Iterate over each word + for (let i = 0; i < words.length; i++) { + // If adding the next word doesn't exceed the line length limit, add it to the line + if ((line + words[i]).length <= 80) { + line += words[i] + ' '; + } else { + // Otherwise, add the line to the formatted string and start a new line + formattedStr += line + '\n'; + line = words[i] + ' '; + } + } + // Add the last line to the formatted string + formattedStr += line; + return formattedStr; +} + +function filterMsg(response) { + const {body, title} = response; + + const msgs = body.split('\n\n').flatMap(x => x.split('\r\n')); + + const newMessage = []; + + // Add title + msgs.unshift(title); + + for (const msg of msgs) { + // remove "Stack from [ghstack] blurb" + if (msg.startsWith('Stack from ')) { + continue; + } + + // remove "* #1234" + if (msg.startsWith('* #')) { + continue; + } + + // remove "* __->__ #1234" + if (msg.startsWith('* __')) { + continue; + } + + const formattedStr = formatCommitMessage(msg); + if (!formattedStr) { + continue; + } + newMessage.push(formattedStr); + } + + const updatedMsg = newMessage.join('\n\n'); + return updatedMsg; +} + +function parsePullRequestNumber(text) { + if (!text) { + return null; + } + const ghstackUrlRegex = + /https:\/\/github\.com\/[\w.-]+\/[\w.-]+\/pull\/(\d+)/; + const ghstackMatch = text.match(ghstackUrlRegex); + if (ghstackMatch) { + return ghstackMatch[1]; + } + const firstLine = text.split('\n').filter(text => text.trim().length > 0)[0]; + if (firstLine == null) { + return null; + } + const prNumberRegex = /\(#(\d{3,})\)\s*$/; + const prNumberMatch = firstLine.match(prNumberRegex); + if (prNumberMatch) { + return prNumberMatch[1]; + } + return null; +} + +async function main() { + const data = fs.readFileSync(0, 'utf-8'); + const pr = parsePullRequestNumber(data); + + if (pr) { + try { + const response = await fetchPullRequest(pr); + if (!response.body) { + console.log(data); + return; + } + const newMessage = filterMsg(response); + console.log(newMessage); + return; + } catch (e) { + console.log(data); + return; + } + } + + console.log(data); +} + +main(); diff --git a/compiler/yarn.lock b/compiler/yarn.lock new file mode 100644 index 00000000000..764200c2ce9 --- /dev/null +++ b/compiler/yarn.lock @@ -0,0 +1,11521 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@algolia/client-abtesting@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.23.4.tgz" + integrity sha512-WIMT2Kxy+FFWXWQxIU8QgbTioL+SGE24zhpj0kipG4uQbzXwONaWt7ffaYLjfge3gcGSgJVv+1VlahVckafluQ== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/client-analytics@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.23.4.tgz" + integrity sha512-4B9gChENsQA9kFmFlb+x3YhBz2Gx3vSsm81FHI1yJ3fn2zlxREHmfrjyqYoMunsU7BybT/o5Nb7ccCbm/vfseA== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/client-common@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.23.4.tgz" + integrity sha512-bsj0lwU2ytiWLtl7sPunr+oLe+0YJql9FozJln5BnIiqfKOaseSDdV42060vUy+D4373f2XBI009K/rm2IXYMA== + +"@algolia/client-insights@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.23.4.tgz" + integrity sha512-XSCtAYvJ/hnfDHfRVMbBH0dayR+2ofVZy3jf5qyifjguC6rwxDsSdQvXpT0QFVyG+h8UPGtDhMPoUIng4wIcZA== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/client-personalization@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.23.4.tgz" + integrity sha512-l/0QvqgRFFOf7BnKSJ3myd1WbDr86ftVaa3PQwlsNh7IpIHmvVcT83Bi5zlORozVGMwaKfyPZo6O48PZELsOeA== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/client-query-suggestions@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.23.4.tgz" + integrity sha512-TB0htrDgVacVGtPDyENoM6VIeYqR+pMsDovW94dfi2JoaRxfqu/tYmLpvgWcOknP6wLbr8bA+G7t/NiGksNAwQ== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/client-search@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.23.4.tgz" + integrity sha512-uBGo6KwUP6z+u6HZWRui8UJClS7fgUIAiYd1prUqCbkzDiCngTOzxaJbEvrdkK0hGCQtnPDiuNhC5MhtVNN4Eg== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/ingestion@1.23.4": + version "1.23.4" + resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.23.4.tgz" + integrity sha512-Si6rFuGnSeEUPU9QchYvbknvEIyCRK7nkeaPVQdZpABU7m4V/tsiWdHmjVodtx3h20VZivJdHeQO9XbHxBOcCw== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/monitoring@1.23.4": + version "1.23.4" + resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.23.4.tgz" + integrity sha512-EXGoVVTshraqPJgr5cMd1fq7Jm71Ew6MpGCEaxI5PErBpJAmKdtjRIzs6JOGKHRaWLi+jdbJPYc2y8RN4qcx5Q== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/recommend@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.23.4.tgz" + integrity sha512-1t6glwKVCkjvBNlng2itTf8fwaLSqkL4JaMENgR3WTGR8mmW2akocUy/ZYSQcG4TcR7qu4zW2UMGAwLoWoflgQ== + dependencies: + "@algolia/client-common" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +"@algolia/requester-browser-xhr@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.23.4.tgz" + integrity sha512-UUuizcgc5+VSY8hqzDFVdJ3Wcto03lpbFRGPgW12pHTlUQHUTADtIpIhkLLOZRCjXmCVhtr97Z+eR6LcRYXa3Q== + dependencies: + "@algolia/client-common" "5.23.4" + +"@algolia/requester-fetch@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.23.4.tgz" + integrity sha512-UhDg6elsek6NnV5z4VG1qMwR6vbp+rTMBEnl/v4hUyXQazU+CNdYkl++cpdmLwGI/7nXc28xtZiL90Es3I7viQ== + dependencies: + "@algolia/client-common" "5.23.4" + +"@algolia/requester-node-http@5.23.4": + version "5.23.4" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.23.4.tgz" + integrity sha512-jXGzGBRUS0oywQwnaCA6mMDJO7LoC3dYSLsyNfIqxDR4SNGLhtg3je0Y31lc24OA4nYyKAYgVLtjfrpcpsWShg== + dependencies: + "@algolia/client-common" "5.23.4" + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/code-frame@^7.5.5": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== + +"@babel/compat-data@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.1.tgz#db7cf122745e0a332c44e847ddc4f5e5221a43f6" + integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== + +"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.19.1", "@babel/core@^7.24.4": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.2.0.tgz" + integrity sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.0" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.0" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.2.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.23.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helpers" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.26.0": + version "7.26.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz" + integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.10" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.10" + "@babel/parser" "^7.26.10" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.10" + "@babel/types" "^7.26.10" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@7.2.0", "@babel/generator@^7.0.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz" + integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg== + dependencies: + "@babel/types" "^7.2.0" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.2.0", "@babel/generator@^7.26.0", "@babel/generator@^7.26.10", "@babel/generator@^7.26.3", "@babel/generator@^7.27.0", "@babel/generator@^7.7.2", "@babel/generator@^7.7.4": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz" + integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== + dependencies: + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== + dependencies: + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-annotate-as-pure@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz#4345d81a9a46a6486e24d069469f13e60445c05d" + integrity sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz" + integrity sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-compilation-targets@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz#eac1096c7374f161e4f33fc8ae38f4ddf122087a" + integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g== + dependencies: + "@babel/compat-data" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.25.9", "@babel/helper-create-class-features-plugin@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz" + integrity sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.27.0" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281" + integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.27.1" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz" + integrity sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.4": + version "0.6.4" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz" + integrity sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.7.4": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-member-expression-to-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" + integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-module-transforms@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-plugin-utils@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz" + integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.26.5" + +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.7.4": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.2.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz" + integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/helpers@^7.26.10": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz" + integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== + dependencies: + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" + +"@babel/helpers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.2.0", "@babel/parser@^7.20.15", "@babel/parser@^7.26", "@babel/parser@^7.26.0", "@babel/parser@^7.26.10", "@babel/parser@^7.26.3", "@babel/parser@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz" + integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== + dependencies: + "@babel/types" "^7.27.0" + +"@babel/parser@^7.20.7": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@babel/parser@^7.23.9", "@babel/parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/parser@^7.24.4": + version "7.24.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== + +"@babel/parser@^7.7.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-flow@^7.18.6", "@babel/plugin-syntax-flow@^7.7.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz" + integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.2.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.18.6", "@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.26.8" + +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz" + integrity sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" + +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-exponentiation-operator@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-flow-strip-types@^7.2.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" + +"@babel/plugin-transform-for-of@^7.26.9": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz" + integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-commonjs@^7.18.6", "@babel/plugin-transform-modules-commonjs@^7.25.9", "@babel/plugin-transform-modules-commonjs@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== + dependencies: + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-commonjs@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" + integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-commonjs@^7.8.3": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== + dependencies: + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.25.9" + +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz" + integrity sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz" + integrity sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-typescript@^7.25.9", "@babel/plugin-transform-typescript@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz" + integrity sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.27.0" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" + +"@babel/plugin-transform-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz#d3bb65598bece03f773111e88cc4e8e5070f1140" + integrity sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/preset-env@^7.22.4", "@babel/preset-env@^7.26.9": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz" + integrity sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.26.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + +"@babel/preset-flow@^7.7.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz" + integrity sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-flow-strip-types" "^7.22.5" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz" + integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" + +"@babel/preset-typescript@^7.18.6": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz" + integrity sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-typescript" "^7.27.0" + +"@babel/preset-typescript@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" + +"@babel/preset-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz#190742a6428d282306648a55b0529b561484f912" + integrity sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.27.1" + +"@babel/register@^7.0.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz" + integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.21.0": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.1.2", "@babel/template@^7.18.10", "@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.27.0", "@babel/template@^7.3.3": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz" + integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" + +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/template@^7.24.7", "@babel/template@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2" + integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.1.6", "@babel/traverse@^7.19.1", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz" + integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.27.0" + "@babel/parser" "^7.27.0" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/traverse@^7.19.0", "@babel/traverse@^7.21.2": + version "7.26.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/traverse@^7.2.0", "@babel/traverse@^7.7.2": + version "7.7.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@7.26.3", "@babel/types@^7.0.0", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.2", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.10", "@babel/types@^7.26.3", "@babel/types@^7.27.0", "@babel/types@^7.27.1", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.4": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@esbuild/aix-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz#499600c5e1757a524990d5d92601f0ac3ce87f64" + integrity sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ== + +"@esbuild/android-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz#b9b8231561a1dfb94eb31f4ee056b92a985c324f" + integrity sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g== + +"@esbuild/android-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz#ca6e7888942505f13e88ac9f5f7d2a72f9facd2b" + integrity sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g== + +"@esbuild/android-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz#e765ea753bac442dfc9cb53652ce8bd39d33e163" + integrity sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg== + +"@esbuild/darwin-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz" + integrity sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw== + +"@esbuild/darwin-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz#91979d98d30ba6e7d69b22c617cc82bdad60e47a" + integrity sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg== + +"@esbuild/freebsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz#b97e97073310736b430a07b099d837084b85e9ce" + integrity sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w== + +"@esbuild/freebsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz#f3b694d0da61d9910ec7deff794d444cfbf3b6e7" + integrity sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A== + +"@esbuild/linux-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz#f921f699f162f332036d5657cad9036f7a993f73" + integrity sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg== + +"@esbuild/linux-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz#cc49305b3c6da317c900688995a4050e6cc91ca3" + integrity sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg== + +"@esbuild/linux-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz#3e0736fcfab16cff042dec806247e2c76e109e19" + integrity sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg== + +"@esbuild/linux-loong64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz#ea2bf730883cddb9dfb85124232b5a875b8020c7" + integrity sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw== + +"@esbuild/linux-mips64el@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz#4cababb14eede09248980a2d2d8b966464294ff1" + integrity sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ== + +"@esbuild/linux-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz#8860a4609914c065373a77242e985179658e1951" + integrity sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw== + +"@esbuild/linux-riscv64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz#baf26e20bb2d38cfb86ee282dff840c04f4ed987" + integrity sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA== + +"@esbuild/linux-s390x@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz#8323afc0d6cb1b6dc6e9fd21efd9e1542c3640a4" + integrity sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA== + +"@esbuild/linux-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz#08fcf60cb400ed2382e9f8e0f5590bac8810469a" + integrity sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw== + +"@esbuild/netbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz#935c6c74e20f7224918fbe2e6c6fe865b6c6ea5b" + integrity sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw== + +"@esbuild/netbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz#414677cef66d16c5a4d210751eb2881bb9c1b62b" + integrity sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA== + +"@esbuild/openbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz#8fd55a4d08d25cdc572844f13c88d678c84d13f7" + integrity sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw== + +"@esbuild/openbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz#0c48ddb1494bbc2d6bcbaa1429a7f465fa1dedde" + integrity sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg== + +"@esbuild/sunos-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz#86ff9075d77962b60dd26203d7352f92684c8c92" + integrity sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg== + +"@esbuild/win32-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz#849c62327c3229467f5b5cd681bf50588442e96c" + integrity sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw== + +"@esbuild/win32-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz#f62eb480cd7cca088cb65bb46a6db25b725dc079" + integrity sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA== + +"@esbuild/win32-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz#c8e119a30a7c8d60b9d2e22d2073722dde3b710b" + integrity sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0": + version "4.11.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== + dependencies: + "@eslint/object-schema" "^2.1.5" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.9.0": + version "0.9.1" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz" + integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@eslint/js@9.17.0", "@eslint/js@^9.13.0": + version "9.17.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz" + integrity sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w== + +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== + +"@eslint/plugin-kit@^0.2.3": + version "0.2.4" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz" + integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== + dependencies: + levn "^0.4.1" + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz" + integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/console@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.0.3.tgz" + integrity sha512-cGg0r+klVHSYnfE977S9wmpuQ9L+iYuYgL+5bPXiUlUynLLYunRxswEmhBzvrSKGof5AKiHuTTmUKAqRcDY9dg== + dependencies: + "@jest/types" "^29.0.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.0.3" + jest-util "^29.0.3" + slash "^3.0.0" + +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.0.3.tgz" + integrity sha512-1d0hLbOrM1qQE3eP3DtakeMbKTcXiXP3afWxqz103xPyddS2NhnNghS7MaXx1dcDt4/6p4nlhmeILo2ofgi8cQ== + dependencies: + "@jest/console" "^29.0.3" + "@jest/reporters" "^29.0.3" + "@jest/test-result" "^29.0.3" + "@jest/transform" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.0.0" + jest-config "^29.0.3" + jest-haste-map "^29.0.3" + jest-message-util "^29.0.3" + jest-regex-util "^29.0.0" + jest-resolve "^29.0.3" + jest-resolve-dependencies "^29.0.3" + jest-runner "^29.0.3" + jest-runtime "^29.0.3" + jest-snapshot "^29.0.3" + jest-util "^29.0.3" + jest-validate "^29.0.3" + jest-watcher "^29.0.3" + micromatch "^4.0.4" + pretty-format "^29.0.3" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/diff-sequences@30.0.1": + version "30.0.1" + resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be" + integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== + +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + dependencies: + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + +"@jest/environment@^29.0.3", "@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/expect-utils@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.0.5.tgz#9d42e4b8bc80367db30abc6c42b2cb14073f66fc" + integrity sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew== + dependencies: + "@jest/get-type" "30.0.1" + +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect-utils@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.0.3.tgz" + integrity sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q== + dependencies: + jest-get-type "^29.0.0" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/expect@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.0.3.tgz" + integrity sha512-6W7K+fsI23FQ01H/BWccPyDZFrnU9QlzDcKOjrNVU5L8yUORFAJJIpmyxWPW70+X624KUNqzZwPThPMX28aXEQ== + dependencies: + expect "^29.0.3" + jest-snapshot "^29.0.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +"@jest/fake-timers@^29.0.3", "@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/get-type@30.0.1": + version "30.0.1" + resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.0.1.tgz#0d32f1bbfba511948ad247ab01b9007724fc9f52" + integrity sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw== + +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" + +"@jest/globals@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.0.3.tgz" + integrity sha512-YqGHT65rFY2siPIHHFjuCGUsbzRjdqkwbat+Of6DmYRg5shIXXrLdZoVE/+TJ9O1dsKsFmYhU58JvIbZRU1Z9w== + dependencies: + "@jest/environment" "^29.0.3" + "@jest/expect" "^29.0.3" + "@jest/types" "^29.0.3" + jest-mock "^29.0.3" + +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/pattern@30.0.1": + version "30.0.1" + resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz#d5304147f49a052900b4b853dedb111d080e199f" + integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== + dependencies: + "@types/node" "*" + jest-regex-util "30.0.1" + +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/reporters@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.0.3.tgz" + integrity sha512-3+QU3d4aiyOWfmk1obDerie4XNCaD5Xo1IlKNde2yGEi02WQD+ZQD0i5Hgqm1e73sMV7kw6pMlCnprtEwEVwxw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.0.3" + "@jest/test-result" "^29.0.3" + "@jest/transform" "^29.0.3" + "@jest/types" "^29.0.3" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.0.3" + jest-util "^29.0.3" + jest-worker "^29.0.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473" + integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== + dependencies: + "@sinclair/typebox" "^0.34.0" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + dependencies: + "@jridgewell/trace-mapping" "^0.3.13" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/source-map@^29.0.0": + version "29.0.0" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.0.0.tgz" + integrity sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.0.3.tgz" + integrity sha512-vViVnQjCgTmbhDKEonKJPtcFe9G/CJO4/Np4XwYJah+lF2oI7KKeRp8t1dFvv44wN2NdbDb/qC6pi++Vpp0Dlg== + dependencies: + "@jest/console" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + +"@jest/test-sequencer@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.0.3.tgz" + integrity sha512-Hf4+xYSWZdxTNnhDykr8JBs0yBN/nxOXyUQWfotBUqqy0LF9vzcFB0jm/EDNZCx587znLWTIgxcokW7WeZMobQ== + dependencies: + "@jest/test-result" "^29.0.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.0.3" + slash "^3.0.0" + +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/transform@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.0.3.tgz" + integrity sha512-C5ihFTRYaGDbi/xbRQRdbo5ddGtI4VSpmL6AIcZxdhwLbXMa7PcXxxqyI91vGOFHnn5aVM3WYnYKCHEqmLVGzg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.0.3" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.0.3" + jest-regex-util "^29.0.0" + jest-util "^29.0.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.0.5.tgz#29a33a4c036e3904f1cfd94f6fe77f89d2e1cc05" + integrity sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ== + dependencies: + "@jest/pattern" "30.0.1" + "@jest/schemas" "30.0.5" + "@types/istanbul-lib-coverage" "^2.0.6" + "@types/istanbul-reports" "^3.0.4" + "@types/node" "*" + "@types/yargs" "^17.0.33" + chalk "^4.1.2" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.0.3", "@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.13": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@modelcontextprotocol/sdk@^1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.9.0.tgz" + integrity sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA== + dependencies: + content-type "^1.0.5" + cors "^2.8.5" + cross-spawn "^7.0.3" + eventsource "^3.0.2" + express "^5.0.1" + express-rate-limit "^7.5.0" + pkce-challenge "^5.0.0" + raw-body "^3.0.0" + zod "^3.23.8" + zod-to-json-schema "^3.24.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@parcel/watcher@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.1.0.tgz" + integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@puppeteer/browsers@2.10.2": + version "2.10.2" + resolved "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz" + integrity sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ== + dependencies: + debug "^4.4.0" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.5.0" + semver "^7.7.1" + tar-fs "^3.0.8" + yargs "^17.7.2" + +"@rollup/rollup-android-arm-eabi@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz#661a45a4709c70e59e596ec78daa9cb8b8d27604" + integrity sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA== + +"@rollup/rollup-android-arm64@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz#128fe8dd510d880cf98b4cb6c7add326815a0c4b" + integrity sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg== + +"@rollup/rollup-darwin-arm64@4.34.9": + version "4.34.9" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz" + integrity sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ== + +"@rollup/rollup-darwin-x64@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz#c2fe3d85fffe47f0ed0f076b3563ada22c8af19c" + integrity sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q== + +"@rollup/rollup-freebsd-arm64@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz#d95bd8f6eaaf829781144fc8bd2d5d71d9f6a9f5" + integrity sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw== + +"@rollup/rollup-freebsd-x64@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz#c3576c6011656e4966ded29f051edec636b44564" + integrity sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g== + +"@rollup/rollup-linux-arm-gnueabihf@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz#48c87d0dee4f8dc9591a416717f91b4a89d77e3d" + integrity sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg== + +"@rollup/rollup-linux-arm-musleabihf@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz#f4c4e7c03a7767f2e5aa9d0c5cfbf5c0f59f2d41" + integrity sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA== + +"@rollup/rollup-linux-arm64-gnu@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz#1015c9d07a99005025d13b8622b7600029d0b52f" + integrity sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw== + +"@rollup/rollup-linux-arm64-musl@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz#8f895eb5577748fc75af21beae32439626e0a14c" + integrity sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A== + +"@rollup/rollup-linux-loongarch64-gnu@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz#c9cd5dbbdc6b3ca4dbeeb0337498cf31949004a0" + integrity sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg== + +"@rollup/rollup-linux-powerpc64le-gnu@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz#7ebb5b4441faa17843a210f7d0583a20c93b40e4" + integrity sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA== + +"@rollup/rollup-linux-riscv64-gnu@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz#10f5d7349fbd2fe78f9e36ecc90aab3154435c8d" + integrity sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg== + +"@rollup/rollup-linux-s390x-gnu@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz#196347d2fa20593ab09d0b7e2589fb69bdf742c6" + integrity sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ== + +"@rollup/rollup-linux-x64-gnu@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz#7193cbd8d128212b8acda37e01b39d9e96259ef8" + integrity sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A== + +"@rollup/rollup-linux-x64-musl@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz#29a6867278ca0420b891574cfab98ecad70c59d1" + integrity sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA== + +"@rollup/rollup-win32-arm64-msvc@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz#89427dcac0c8e3a6d32b13a03a296a275d0de9a9" + integrity sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q== + +"@rollup/rollup-win32-ia32-msvc@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz#ecb9711ba2b6d2bf6ee51265abe057ab90913deb" + integrity sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w== + +"@rollup/rollup-win32-x64-msvc@4.34.9": + version "4.34.9" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz#1973871850856ae72bc678aeb066ab952330e923" + integrity sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw== + +"@selderee/plugin-htmlparser2@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz" + integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== + dependencies: + domhandler "^5.0.3" + selderee "^0.11.0" + +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.24.1": + version "0.24.42" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.42.tgz" + integrity sha512-d+2AtrHGyWek2u2ITF0lHRIv6Tt7X0dEHW+0rP+5aDCEjC3fiN2RBjrLD0yU0at52BcZbRGxLbAtXiR0hFCjYw== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinclair/typebox@^0.34.0": + version "0.34.38" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.38.tgz#2365df7c23406a4d79413a766567bfbca708b49d" + integrity sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.2.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz" + integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@testing-library/dom@^8.5.0": + version "8.18.1" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.18.1.tgz" + integrity sha512-oEvsm2B/WtcHKE+IcEeeCqNU/ltFGaVyGbpcm4g/2ytuT49jrlH9x5qRKL/H3A6yfM4YAbSbC0ceT5+9CEXnLg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/react@^13.4.0": + version "13.4.0" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@tsconfig/node18-strictest@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@tsconfig/node18-strictest/-/node18-strictest-1.0.0.tgz" + integrity sha512-bOuNKwO4Fzbt+Su5wqI9zNHwx5C25gLnutwVQA1sBZk0cW8UjVPVcwzIUhJIIJDUx7zDEbAwdCD2HfvIsV8dYg== + +"@tsconfig/strictest@^2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.5.tgz" + integrity sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg== + +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== + +"@types/babel__code-frame@^7.0.6": + version "7.0.6" + resolved "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.6.tgz" + integrity sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA== + +"@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz" + integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + dependencies: + "@babel/types" "^7.3.0" + +"@types/eslint@^8.56.12": + version "8.56.12" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz" + integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.5" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/estree@1.0.6", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/fbt@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@types/fbt/-/fbt-1.0.4.tgz" + integrity sha512-KBaaLu4hEIBaCyQ3L2KP6JujD+tmMuPZ10YpgmGgqMaM8TESYR2TOJNvG+GYiWUhGkp38Y+62VZ1wJ97MPvt+A== + dependencies: + "@types/react" "*" + +"@types/glob@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/html-to-text@^9.0.4": + version "9.0.4" + resolved "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz" + integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== + +"@types/invariant@^2.2.35": + version "2.2.35" + resolved "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz" + integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-coverage@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/istanbul-reports@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^28.1.6": + version "28.1.8" + resolved "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz" + integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== + dependencies: + expect "^28.0.0" + pretty-format "^28.0.0" + +"@types/jest@^29.0.3": + version "29.0.3" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.0.3.tgz" + integrity sha512-F6ukyCTwbfsEX5F2YmVYmM5TcTHy1q9P5rWlRbrk56KyMh3v9xRGUO3aa8+SkvMi0SHXtASJv1283enXimC0Og== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jest@^29.5.14": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jest@^30.0.0": + version "30.0.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-30.0.0.tgz#5e85ae568006712e4ad66f25433e9bdac8801f1d" + integrity sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA== + dependencies: + expect "^30.0.0" + pretty-format "^30.0.0" + +"@types/jsdom@^20.0.0": + version "20.0.0" + resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.0.tgz" + integrity sha512-YfAchFs0yM1QPDrLm2VHe+WHGtqms3NXnXAMolrgrVP6fgBHHXy1ozAbo/dFtPNtZC/m66bPiCTWYmqp1F14gA== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/minimatch@^5.1.2": + version "5.1.2" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/mocha@^10.0.10", "@types/mocha@^10.0.2": + version "10.0.10" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*", "@types/node@^18.7.18": + version "18.7.19" + resolved "https://registry.npmjs.org/@types/node/-/node-18.7.19.tgz" + integrity sha512-Sq1itGUKUX1ap7GgZlrzdBydjbsJL/NSQt/4wkAxUJ7/OS5c2WkoN6WSpWc2Yc5wtKMZOUA0VCs/j2XJadN3HA== + +"@types/node@^20": + version "20.17.10" + resolved "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz" + integrity sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA== + dependencies: + undici-types "~6.19.2" + +"@types/node@^20.2.5": + version "20.2.5" + resolved "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + +"@types/prettier@^2.1.5": + version "2.7.0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" + integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@^18.0.0": + version "18.0.6" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.0.21" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz" + integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/stack-utils@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/vscode@^1.96.0": + version "1.96.0" + resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.96.0.tgz" + integrity sha512-qvZbSZo+K4ZYmmDuaodMbAa67Pl6VDQzLKFka6rq+3WUTY4Kro7Bwoi0CuZLO/wema0ygcmpwow7zZfPJTs5jg== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.33": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.13" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz" + integrity sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/type-utils" "8.18.1" + "@typescript-eslint/utils" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/eslint-plugin@^7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz" + integrity sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/type-utils" "7.4.0" + "@typescript-eslint/utils" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/eslint-plugin@^8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz" + integrity sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/type-utils" "8.7.0" + "@typescript-eslint/utils" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz" + integrity sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA== + dependencies: + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" + debug "^4.3.4" + +"@typescript-eslint/parser@^7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz" + integrity sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ== + dependencies: + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz" + integrity sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ== + dependencies: + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/typescript-estree" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz" + integrity sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw== + dependencies: + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + +"@typescript-eslint/scope-manager@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz" + integrity sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ== + dependencies: + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" + +"@typescript-eslint/scope-manager@8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz" + integrity sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg== + dependencies: + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + +"@typescript-eslint/type-utils@7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz" + integrity sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw== + dependencies: + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/utils" "7.4.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/type-utils@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz" + integrity sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ== + dependencies: + "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/utils" "8.18.1" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/type-utils@8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz" + integrity sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ== + dependencies: + "@typescript-eslint/typescript-estree" "8.7.0" + "@typescript-eslint/utils" "8.7.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz" + integrity sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw== + +"@typescript-eslint/types@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz" + integrity sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw== + +"@typescript-eslint/types@8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz" + integrity sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w== + +"@typescript-eslint/typescript-estree@7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz" + integrity sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg== + dependencies: + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/typescript-estree@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz" + integrity sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg== + dependencies: + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/typescript-estree@8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz" + integrity sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg== + dependencies: + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz" + integrity sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + semver "^7.5.4" + +"@typescript-eslint/utils@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz" + integrity sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/typescript-estree" "8.18.1" + +"@typescript-eslint/utils@8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz" + integrity sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/typescript-estree" "8.7.0" + +"@typescript-eslint/visitor-keys@7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz" + integrity sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA== + dependencies: + "@typescript-eslint/types" "7.4.0" + eslint-visitor-keys "^3.4.1" + +"@typescript-eslint/visitor-keys@8.18.1": + version "8.18.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz" + integrity sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ== + dependencies: + "@typescript-eslint/types" "8.18.1" + eslint-visitor-keys "^4.2.0" + +"@typescript-eslint/visitor-keys@8.7.0": + version "8.7.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz" + integrity sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ== + dependencies: + "@typescript-eslint/types" "8.7.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vscode/test-cli@^0.0.10": + version "0.0.10" + resolved "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.10.tgz" + integrity sha512-B0mMH4ia+MOOtwNiLi79XhA+MLmUItIC8FckEuKrVAVriIuSWjt7vv4+bF8qVFiNFe4QRfzPaIZk39FZGWEwHA== + dependencies: + "@types/mocha" "^10.0.2" + c8 "^9.1.0" + chokidar "^3.5.3" + enhanced-resolve "^5.15.0" + glob "^10.3.10" + minimatch "^9.0.3" + mocha "^10.2.0" + supports-color "^9.4.0" + yargs "^17.7.2" + +"@vscode/test-electron@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz" + integrity sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ== + dependencies: + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.5" + jszip "^3.10.1" + ora "^7.0.1" + semver "^7.6.2" + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +acorn@^8.4.1, acorn@^8.7.1: + version "8.8.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +algoliasearch@^5.23.3: + version "5.23.4" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.23.4.tgz" + integrity sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg== + dependencies: + "@algolia/client-abtesting" "5.23.4" + "@algolia/client-analytics" "5.23.4" + "@algolia/client-common" "5.23.4" + "@algolia/client-insights" "5.23.4" + "@algolia/client-personalization" "5.23.4" + "@algolia/client-query-suggestions" "5.23.4" + "@algolia/client-search" "5.23.4" + "@algolia/ingestion" "1.23.4" + "@algolia/monitoring" "1.23.4" + "@algolia/recommend" "5.23.4" + "@algolia/requester-browser-xhr" "5.23.4" + "@algolia/requester-fetch" "5.23.4" + "@algolia/requester-node-http" "5.23.4" + +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0, ansi-styles@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +args@5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/args/-/args-5.0.3.tgz" + integrity sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA== + dependencies: + camelcase "5.0.0" + chalk "2.4.2" + leven "2.1.0" + mri "1.1.4" + +aria-query@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz" + integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@^1.6.1: + version "1.7.4" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz" + integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.6.4: + version "1.6.7" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + dependencies: + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-jest@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.0.3.tgz" + integrity sha512-ApPyHSOhS/sVzwUOQIWJmdvDhBsMG01HX9z7ogtkp1TToHGGUWFlnXJUIzCgKPSfiYLn3ibipCYzsKSURHEwLg== + dependencies: + "@jest/transform" "^29.0.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.0.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-fbt-runtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/babel-plugin-fbt-runtime/-/babel-plugin-fbt-runtime-1.0.0.tgz" + integrity sha512-gML1rXqIfc+sDf1DWxu1WJjmotBYr6f9vjKwOoetuOukM1o3mTKNAeBFGEYu7iBACkuaXpIi++qW8/URgHnduQ== + dependencies: + "@babel/core" "^7.0.0" + invariant "^2.2.4" + +babel-plugin-fbt@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/babel-plugin-fbt/-/babel-plugin-fbt-1.0.0.tgz" + integrity sha512-Tjpkrt4JJLgtS+x6HzkWdOguH+Pb+pzJmSkBmHIWrjf3x9Pf+xFcQUdAbpDKOtRPgu6QyI9DtDulw0sbgdfYdg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-transform-flow-strip-types" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.8.3" + "@babel/register" "^7.0.0" + "@babel/types" "^7.2.2" + fb-babel-plugin-utils "^0.13.0" + flow-enums-runtime "^0.0.4" + glob "^7.1.6" + invariant "^2.2.4" + jest-docblock "^26.0.0" + nullthrows "^1.1.1" + yargs "^15.3.1" + +babel-plugin-idx@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/babel-plugin-idx/-/babel-plugin-idx-3.0.3.tgz" + integrity sha512-05baCoIGsvZJKemq6KQ4KVFlweEpY4aSY56wk3W781JxCNW3u0KfBElBt26/cPZbHkjF1mnwGIOlFY+9I/VOZA== + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.13" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz" + integrity sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.4" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz" + integrity sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.4" + +babel-plugin-syntax-hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz" + integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ== + dependencies: + hermes-parser "0.25.1" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== + dependencies: + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^29.0.2, babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bare-events@^2.2.0, bare-events@^2.5.4: + version "2.5.4" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +bare-fs@^4.0.1: + version "4.1.3" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz" + integrity sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + +bare-os@^3.0.1: + version "3.6.1" + resolved "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz" + integrity sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.6.5" + resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz" + integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== + dependencies: + bytes "^3.1.2" + content-type "^1.0.5" + debug "^4.4.0" + http-errors "^2.0.0" + iconv-lite "^0.6.3" + on-finished "^2.4.1" + qs "^6.14.0" + raw-body "^3.0.0" + type-is "^2.0.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.24.0, browserslist@^4.24.4: + version "4.24.4" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +bs-logger@0.x, bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bundle-require@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz" + integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== + dependencies: + load-tsconfig "^0.2.3" + +bytes@3.1.2, bytes@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +c8@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz" + integrity sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.3" + find-up "^5.0.0" + foreground-child "^3.1.1" + istanbul-lib-coverage "^3.2.0" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.1.6" + test-exclude "^6.0.0" + v8-to-istanbul "^9.0.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001688: + version "1.0.30001715" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz" + integrity sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@4, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.0, chalk@^5.3.0: + version "5.4.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz" + integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.1.0" + encoding-sniffer "^0.2.0" + htmlparser2 "^9.1.0" + parse5 "^7.1.2" + parse5-htmlparser2-tree-adapter "^7.0.0" + parse5-parser-stream "^7.1.2" + undici "^6.19.5" + whatwg-mimetype "^4.0.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +chromium-bidi@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz" + integrity sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg== + dependencies: + mitt "^3.0.1" + zod "^3.24.1" + +ci-info@^3.2.0: + version "3.4.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz" + integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== + +ci-info@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7" + integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cli-color@~0.1.6: + version "0.1.7" + resolved "https://registry.npmjs.org/cli-color/-/cli-color-0.1.7.tgz" + integrity sha512-xNaQxWYgI6DD4xIJLn8GY2zDZVbrN0vsU1fEbDNAHZRyceWhpj7A08mYcG1AY92q1Aw0geYkVfiAcEYIZtuTSg== + dependencies: + es5-ext "0.8.x" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.5.0, cli-spinners@^2.9.0: + version "2.9.2" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.9.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concurrently@^7.4.0: + version "7.6.0" + resolved "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz" + integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw== + dependencies: + chalk "^4.1.0" + date-fns "^2.29.1" + lodash "^4.17.21" + rxjs "^7.0.0" + shell-quote "^1.7.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^17.3.1" + +consola@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz" + integrity sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA== + +content-disposition@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz" + integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +core-js-compat@^3.40.0: + version "3.41.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz" + integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== + dependencies: + browserslist "^4.24.4" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== + dependencies: + rrweb-cssom "^0.6.0" + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +date-fns@^2.29.1: + version "2.30.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decimal.js@^10.3.1: + version "10.4.1" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz" + integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +dedent@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.6.0.tgz#79d52d6389b1ffa67d2bcef59ba51847a9d503b2" + integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0, depd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +devtools-protocol@0.0.1425554: + version "0.0.1425554" + resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz" + integrity sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw== + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +diff-sequences@^29.0.0: + version "29.0.0" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz" + integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +difflib@~0.2.1: + version "0.2.4" + resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1, domutils@^3.1.0: + version "3.2.2" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dreamopt@~0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/dreamopt/-/dreamopt-0.6.0.tgz" + integrity sha512-KRJa47iBEK0y6ZtgCgy2ykuvMT8c9gj3ua9Dv7vCkclFJJeH2FjhGY2xO5qBoWGahsjCGMlk4Cq9wJYeWxuYhQ== + dependencies: + wordwrap ">=0.0.2" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.5.73: + version "1.5.143" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.143.tgz" + integrity sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^10.2.1: + version "10.4.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +encoding-sniffer@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz" + integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== + dependencies: + iconv-lite "^0.6.3" + whatwg-encoding "^3.1.1" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.15.0: + version "5.18.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz" + integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^4.2.0, entities@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.9: + version "1.24.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +es5-ext@0.8.x: + version "0.8.2" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.8.2.tgz" + integrity sha512-H19ompyhnKiBdjHR1DPHvf5RHgHPmJaY9JNzFGbMbPgdsUkvnUCN1Ke8J4Y0IMyTwFM2M9l4h2GoHwzwpSmXbA== + +esbuild@^0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz" + integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.0" + "@esbuild/android-arm" "0.25.0" + "@esbuild/android-arm64" "0.25.0" + "@esbuild/android-x64" "0.25.0" + "@esbuild/darwin-arm64" "0.25.0" + "@esbuild/darwin-x64" "0.25.0" + "@esbuild/freebsd-arm64" "0.25.0" + "@esbuild/freebsd-x64" "0.25.0" + "@esbuild/linux-arm" "0.25.0" + "@esbuild/linux-arm64" "0.25.0" + "@esbuild/linux-ia32" "0.25.0" + "@esbuild/linux-loong64" "0.25.0" + "@esbuild/linux-mips64el" "0.25.0" + "@esbuild/linux-ppc64" "0.25.0" + "@esbuild/linux-riscv64" "0.25.0" + "@esbuild/linux-s390x" "0.25.0" + "@esbuild/linux-x64" "0.25.0" + "@esbuild/netbsd-arm64" "0.25.0" + "@esbuild/netbsd-x64" "0.25.0" + "@esbuild/openbsd-arm64" "0.25.0" + "@esbuild/openbsd-x64" "0.25.0" + "@esbuild/sunos-x64" "0.25.0" + "@esbuild/win32-arm64" "0.25.0" + "@esbuild/win32-ia32" "0.25.0" + "@esbuild/win32-x64" "0.25.0" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0, escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@8.57.0: + version "8.57.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint@^8.57.1: + version "8.57.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint@^9.13.0: + version "9.17.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz" + integrity sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.9.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.17.0" + "@eslint/plugin-kit" "^0.2.3" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventsource-parser@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz" + integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA== + +eventsource@^3.0.2: + version "3.0.6" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz" + integrity sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA== + dependencies: + eventsource-parser "^3.0.1" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +expect@^28.0.0, expect@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + +expect@^29.0.0, expect@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/expect/-/expect-29.0.3.tgz" + integrity sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q== + dependencies: + "@jest/expect-utils" "^29.0.3" + jest-get-type "^29.0.0" + jest-matcher-utils "^29.0.3" + jest-message-util "^29.0.3" + jest-util "^29.0.3" + +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +expect@^30.0.0: + version "30.0.5" + resolved "https://registry.yarnpkg.com/expect/-/expect-30.0.5.tgz#c23bf193c5e422a742bfd2990ad990811de41a5a" + integrity sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ== + dependencies: + "@jest/expect-utils" "30.0.5" + "@jest/get-type" "30.0.1" + jest-matcher-utils "30.0.5" + jest-message-util "30.0.5" + jest-mock "30.0.5" + jest-util "30.0.5" + +express-rate-limit@^7.5.0: + version "7.5.0" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz" + integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== + +express@^5.0.1: + version "5.1.0" + resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz" + integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.0" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-babel-plugin-utils@^0.13.0: + version "0.13.1" + resolved "https://registry.npmjs.org/fb-babel-plugin-utils/-/fb-babel-plugin-utils-0.13.1.tgz" + integrity sha512-AxAr7ut7v4fzHp5VETGxcDUPmRup5H7bkMNNfxaRunS3jzm2rOS5NLvCPCDnnQIiI6AB0x2GrOx/eIcAOVJAAA== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.7.4" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.7.4" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-numeric-separator" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + json-diff "^0.5.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fbt@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/fbt/-/fbt-1.0.2.tgz" + integrity sha512-vWIasrcX34OW2EWohjrAQM0jpJBH2FjqxW9XrQd38xhtBVXWaks34ePWBSHO3QEShmirRx6kwJNZJrofsHjvlw== + dependencies: + invariant "^2.2.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +fdir@^6.4.3: + version "6.4.3" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz" + integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-node-modules@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.1" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +flow-enums-runtime@^0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.4.tgz" + integrity sha512-kkJ/ABZb4rhyFw05yCWdcA1K2uW7ddYzz9zVNJp5kRX3BzsIynB4f0E4oLlf+zgDLErj9FwGda1qEAmhnRNXPQ== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +folder-hash@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/folder-hash/-/folder-hash-4.0.4.tgz" + integrity sha512-zEyYH+UsHEfJJcCRSf9ai5I4CTZwZ8ObONRuEI5hcEmJY5pS0FUWKruX9mMnYJrgC7MlPFDYnGsK1R+WFYjLlQ== + dependencies: + debug "^4.3.3" + minimatch "~5.1.2" + +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +foreground-child@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-uri@^6.0.1: + version "6.0.4" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^10.4.5: + version "10.4.5" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz" + integrity sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^4.0.1" + minimatch "^10.0.0" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.11, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hermes-eslint@^0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/hermes-eslint/-/hermes-eslint-0.25.1.tgz" + integrity sha512-nPz9+oyejT1zsIwoJ2pWdUvLcN1i+tbaWCOD8PpNBYQtnHXaPXImZp/6zZHnm3bo/DoFcAgh8+SNcxLFxh7m/A== + dependencies: + esrecurse "^4.3.0" + hermes-estree "0.25.1" + hermes-parser "0.25.1" + +hermes-estree@0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz" + integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== + +hermes-estree@0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.26.0.tgz" + integrity sha512-If1T7lhfXnGlVLbnsmwerNB5cyJm2oIE8TN1UKEq6/OUX1nOGUhjXMpqAwZ1wkkn9Brda0VRyJEWOGT2GgVcAQ== + +hermes-parser@0.25.1, hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz" + integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== + dependencies: + hermes-estree "0.25.1" + +hermes-parser@0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.26.0.tgz" + integrity sha512-fWT40jJ/BtlzuyiiQS7lzNIlB5h6flVZoN8Jn8v5l987HL5dK9s+/4+py0FaBmeIEROC2zxt5qMLwXFTPLQ7BA== + dependencies: + hermes-estree "0.26.0" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-to-text@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz" + integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.11.0" + deepmerge "^4.3.1" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.2" + selderee "^0.11.0" + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +htmlparser2@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz" + integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.1.0" + entities "^4.5.0" + +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^7.0.5, https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.6.3, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +istanbul-reports@^3.1.6: + version "3.1.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jackspeak@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz" + integrity sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw== + dependencies: + "@isaacs/cliui" "^8.0.2" + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-changed-files@^29.0.0: + version "29.0.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.0.0.tgz" + integrity sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-circus@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.0.3.tgz" + integrity sha512-QeGzagC6Hw5pP+df1+aoF8+FBSgkPmraC1UdkeunWh0jmrp7wC0Hr6umdUAOELBQmxtKAOMNC3KAdjmCds92Zg== + dependencies: + "@jest/environment" "^29.0.3" + "@jest/expect" "^29.0.3" + "@jest/test-result" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.0.3" + jest-matcher-utils "^29.0.3" + jest-message-util "^29.0.3" + jest-runtime "^29.0.3" + jest-snapshot "^29.0.3" + jest-util "^29.0.3" + p-limit "^3.1.0" + pretty-format "^29.0.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== + dependencies: + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-cli@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.0.3.tgz" + integrity sha512-aUy9Gd/Kut1z80eBzG10jAn6BgS3BoBbXyv+uXEqBJ8wnnuZ5RpNfARoskSrTIy1GY4a8f32YGuCMwibtkl9CQ== + dependencies: + "@jest/core" "^29.0.3" + "@jest/test-result" "^29.0.3" + "@jest/types" "^29.0.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.0.3" + jest-util "^29.0.3" + jest-validate "^29.0.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-config@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.0.3.tgz" + integrity sha512-U5qkc82HHVYe3fNu2CRXLN4g761Na26rWKf7CjM8LlZB3In1jadEkZdMwsE37rd9RSPV0NfYaCjHdk/gu3v+Ew== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.0.3" + "@jest/types" "^29.0.3" + babel-jest "^29.0.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.0.3" + jest-environment-node "^29.0.3" + jest-get-type "^29.0.0" + jest-regex-util "^29.0.0" + jest-resolve "^29.0.3" + jest-runner "^29.0.3" + jest-util "^29.0.3" + jest-validate "^29.0.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.0.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.0.5.tgz#b40f81e0c0d13e5b81c4d62b0d0dfa6a524ee0fd" + integrity sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A== + dependencies: + "@jest/diff-sequences" "30.0.1" + "@jest/get-type" "30.0.1" + chalk "^4.1.2" + pretty-format "30.0.5" + +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-diff@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.0.3.tgz" + integrity sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.0.0" + jest-get-type "^29.0.0" + pretty-format "^29.0.3" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^29.0.0: + version "29.0.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.0.0.tgz" + integrity sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + dependencies: + "@jest/types" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + +jest-each@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.0.3.tgz" + integrity sha512-wILhZfESURHHBNvPMJ0lZlYZrvOQJxAo3wNHi+ycr90V7M+uGR9Gh4+4a/BmaZF0XTyZsk4OiYEf3GJN7Ltqzg== + dependencies: + "@jest/types" "^29.0.3" + chalk "^4.0.0" + jest-get-type "^29.0.0" + jest-util "^29.0.3" + pretty-format "^29.0.3" + +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.0.3.tgz" + integrity sha512-KIGvpm12c71hoYTjL4wC2c8K6KfhOHJqJtaHc1IApu5rG047YWZoEP13BlbucWfzGISBrmli8KFqdhdQEa8Wnw== + dependencies: + "@jest/environment" "^29.0.3" + "@jest/fake-timers" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.0.3" + jest-util "^29.0.3" + jsdom "^20.0.0" + +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +jest-environment-node@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.0.3.tgz" + integrity sha512-cdZqRCnmIlTXC+9vtvmfiY/40Cj6s2T0czXuq1whvQdmpzAnj4sbqVYuZ4zFHk766xTTJ+Ij3uUqkk8KCfXoyg== + dependencies: + "@jest/environment" "^29.0.3" + "@jest/fake-timers" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/node" "*" + jest-mock "^29.0.3" + jest-util "^29.0.3" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-get-type@^29.0.0: + version "29.0.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz" + integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== + dependencies: + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-haste-map@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.0.3.tgz" + integrity sha512-uMqR99+GuBHo0RjRhOE4iA6LmsxEwRdgiIAQgMU/wdT2XebsLDz5obIwLZm/Psj+GwSEQhw9AfAVKGYbh2G55A== + dependencies: + "@jest/types" "^29.0.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.0.0" + jest-util "^29.0.3" + jest-worker "^29.0.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-leak-detector@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.0.3.tgz" + integrity sha512-YfW/G63dAuiuQ3QmQlh8hnqLDe25WFY3eQhuc/Ev1AGmkw5zREblTh7TCSKLoheyggu6G9gxO2hY8p9o6xbaRQ== + dependencies: + jest-get-type "^29.0.0" + pretty-format "^29.0.3" + +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz#dff3334be58faea4a5e1becc228656fbbfc2467d" + integrity sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ== + dependencies: + "@jest/get-type" "30.0.1" + chalk "^4.1.2" + jest-diff "30.0.5" + pretty-format "30.0.5" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.0.3.tgz" + integrity sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w== + dependencies: + chalk "^4.0.0" + jest-diff "^29.0.3" + jest-get-type "^29.0.0" + pretty-format "^29.0.3" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.0.5.tgz#dd12ffec91dd3fa6a59cbd538a513d8e239e070c" + integrity sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@jest/types" "30.0.5" + "@types/stack-utils" "^2.0.3" + chalk "^4.1.2" + graceful-fs "^4.2.11" + micromatch "^4.0.8" + pretty-format "30.0.5" + slash "^3.0.0" + stack-utils "^2.0.6" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.0.3.tgz" + integrity sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.0.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.0.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.0.5.tgz#ef437e89212560dd395198115550085038570bdd" + integrity sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ== + dependencies: + "@jest/types" "30.0.5" + "@types/node" "*" + jest-util "30.0.5" + +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + +jest-mock@^29.0.3, jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@30.0.1: + version "30.0.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" + integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== + +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-regex-util@^29.0.0: + version "29.0.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.0.0.tgz" + integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" + +jest-resolve-dependencies@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.0.3.tgz" + integrity sha512-KzuBnXqNvbuCdoJpv8EanbIGObk7vUBNt/PwQPPx2aMhlv/jaXpUJsqWYRpP/0a50faMBY7WFFP8S3/CCzwfDw== + dependencies: + jest-regex-util "^29.0.0" + jest-snapshot "^29.0.3" + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.0.3.tgz" + integrity sha512-toVkia85Y/BPAjJasTC9zIPY6MmVXQPtrCk8SmiheC4MwVFE/CMFlOtMN6jrwPMC6TtNh8+sTMllasFeu1wMPg== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.0.3" + jest-pnp-resolver "^1.2.2" + jest-util "^29.0.3" + jest-validate "^29.0.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runner@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.0.3.tgz" + integrity sha512-Usu6VlTOZlCZoNuh3b2Tv/yzDpKqtiNAetG9t3kJuHfUyVMNW7ipCCJOUojzKkjPoaN7Bl1f7Buu6PE0sGpQxw== + dependencies: + "@jest/console" "^29.0.3" + "@jest/environment" "^29.0.3" + "@jest/test-result" "^29.0.3" + "@jest/transform" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^29.0.0" + jest-environment-node "^29.0.3" + jest-haste-map "^29.0.3" + jest-leak-detector "^29.0.3" + jest-message-util "^29.0.3" + jest-resolve "^29.0.3" + jest-runtime "^29.0.3" + jest-util "^29.0.3" + jest-watcher "^29.0.3" + jest-worker "^29.0.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-runtime@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.0.3.tgz" + integrity sha512-12gZXRQ7ozEeEHKTY45a+YLqzNDR/x4c//X6AqwKwKJPpWM8FY4vwn4VQJOcLRS3Nd1fWwgP7LU4SoynhuUMHQ== + dependencies: + "@jest/environment" "^29.0.3" + "@jest/fake-timers" "^29.0.3" + "@jest/globals" "^29.0.3" + "@jest/source-map" "^29.0.0" + "@jest/test-result" "^29.0.3" + "@jest/transform" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.0.3" + jest-message-util "^29.0.3" + jest-mock "^29.0.3" + jest-regex-util "^29.0.0" + jest-resolve "^29.0.3" + jest-snapshot "^29.0.3" + jest-util "^29.0.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" + +jest-snapshot@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.0.3.tgz" + integrity sha512-52q6JChm04U3deq+mkQ7R/7uy7YyfVIrebMi6ZkBoDJ85yEjm/sJwdr1P0LOIEHmpyLlXrxy3QP0Zf5J2kj0ew== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.0.3" + "@jest/transform" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.0.3" + graceful-fs "^4.2.9" + jest-diff "^29.0.3" + jest-get-type "^29.0.0" + jest-haste-map "^29.0.3" + jest-matcher-utils "^29.0.3" + jest-message-util "^29.0.3" + jest-util "^29.0.3" + natural-compare "^1.4.0" + pretty-format "^29.0.3" + semver "^7.3.5" + +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.0.5.tgz#035d380c660ad5f1748dff71c4105338e05f8669" + integrity sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g== + dependencies: + "@jest/types" "30.0.5" + "@types/node" "*" + chalk "^4.1.2" + ci-info "^4.2.0" + graceful-fs "^4.2.11" + picomatch "^4.0.2" + +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.0.0, jest-util@^29.0.3, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== + dependencies: + "@jest/types" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" + +jest-validate@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.0.3.tgz" + integrity sha512-OebiqqT6lK8cbMPtrSoS3aZP4juID762lZvpf1u+smZnwTEBCBInan0GAIIhv36MxGaJvmq5uJm7dl5gVt+Zrw== + dependencies: + "@jest/types" "^29.0.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.0.0" + leven "^3.1.0" + pretty-format "^29.0.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-watcher@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.0.3.tgz" + integrity sha512-tQX9lU91A+9tyUQKUMp0Ns8xAcdhC9fo73eqA3LFxP2bSgiF49TNcc+vf3qgGYYK9qRjFpXW9+4RgF/mbxyOOw== + dependencies: + "@jest/test-result" "^29.0.3" + "@jest/types" "^29.0.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^29.0.3" + string-length "^4.0.1" + +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.0.3.tgz" + integrity sha512-Tl/YWUugQOjoTYwjKdfJWkSOfhufJHO5LhXTSZC3TRoQKO+fuXnZAdoXXBlpLXKGODBL3OvdUasfDD4PcMe6ng== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== + dependencies: + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" + import-local "^3.0.2" + jest-cli "^28.1.3" + +jest@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/jest/-/jest-29.0.3.tgz" + integrity sha512-ElgUtJBLgXM1E8L6K1RW1T96R897YY/3lRYqq9uVcPWtP2AAl/nQ16IYDh/FzQOOQ12VEuLdcPU83mbhG2C3PQ== + dependencies: + "@jest/core" "^29.0.3" + "@jest/types" "^29.0.3" + import-local "^3.0.2" + jest-cli "^29.0.3" + +jest@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== + dependencies: + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" + import-local "^3.0.2" + jest-cli "^29.5.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +joi@^17.11.0: + version "17.13.1" + resolved "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz" + integrity sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +jsdom@^20.0.0: + version "20.0.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz" + integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA== + dependencies: + abab "^2.0.6" + acorn "^8.7.1" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "^7.0.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.8.0" + xml-name-validator "^4.0.0" + +jsdom@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz" + integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== + dependencies: + abab "^2.0.6" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-diff@^0.5.4: + version "0.5.5" + resolved "https://registry.npmjs.org/json-diff/-/json-diff-0.5.5.tgz" + integrity sha512-B2RSfPv8Y5iqm6/9aKC3cOhXPzjYupKDpGuqT5py9NRulL8J0UoB/zKXUo70xBsuxPcIFgtsGgEdXLrNp0GL7w== + dependencies: + cli-color "~0.1.6" + difflib "~0.2.1" + dreamopt "~0.6.0" + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.1.0, json5@^2.2.1, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + +keypress@~0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz" + integrity sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + +leven@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz" + integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@4.x, lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + +logform@^2.6.0, logform@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^11.0.0: + version "11.1.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz" + integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@1.x, make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^3.0.0, mime-types@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.6, minimatch@~5.1.2: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + +mkdirp@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mocha@^10.2.0: + version "10.8.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +mocha@^11.0.1: + version "11.0.1" + resolved "https://registry.npmjs.org/mocha/-/mocha-11.0.1.tgz" + integrity sha512-+3GkODfsDG71KSCQhc4IekSW+ItCK/kiez1Z28ksWvYhKXV/syxMlerR/sC7whDp7IyreZ4YxceMLdTs5hQE8A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^10.4.5" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +mri@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz" + integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +native-or-another@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/native-or-another/-/native-or-another-2.0.0.tgz" + integrity sha512-rDE50rrX/PSk2StV5EnwpRk35TENl4I4ZsSGZsMJufLdAJ1P4YzNwVf5UOhjQodwz+RdTP9eZSG7FiqnoY25nA== + dependencies: + native-or-bluebird "^1.1.2" + +native-or-bluebird@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz" + integrity sha512-0SH8UubxDfe382eYiwmd12qxAbiWGzlGZv6CkMA+DPojWa/Y0oH4hE0lRtFfFgJmPQFyKXeB8XxPbZz6TvvKaQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-dts@^1.3.13: + version "1.3.13" + resolved "https://registry.npmjs.org/npm-dts/-/npm-dts-1.3.13.tgz" + integrity sha512-k1G0x0aIN8Wc0KyEZe2zAvBQqPi2NMBTg0fanEUhmBkynvb/KLy+J8F3ozyPGW1sAdnjaSHfCe1hd/X/IaD4Fw== + dependencies: + args "5.0.3" + find-node-modules "2.1.3" + mkdirp "3.0.1" + npm-run "5.0.1" + rimraf "6.0.1" + tmp "0.2.3" + winston "3.13.1" + +npm-path@^2.0.2, npm-path@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== + dependencies: + which "^1.2.10" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npm-run/-/npm-run-5.0.1.tgz" + integrity sha512-s7FyRpHUgaJfzkRgOnevX8rAWWsv1dofY1XS7hliWCF6LSQh+HtDfBvpigPS1krLvXw+Fi17CYMY8mUtblnyWw== + dependencies: + minimist "^1.2.0" + npm-path "^2.0.4" + npm-which "^3.0.1" + serializerr "^1.0.3" + +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz" + integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== + dependencies: + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +nwsapi@^2.2.0: + version "2.2.2" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +nwsapi@^2.2.4: + version "2.2.7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ora@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz" + integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== + dependencies: + chalk "^5.3.0" + cli-cursor "^4.0.0" + cli-spinners "^2.9.0" + is-interactive "^2.0.0" + is-unicode-supported "^1.3.0" + log-symbols "^5.1.0" + stdin-discarder "^0.1.0" + string-width "^6.1.0" + strip-ansi "^7.1.0" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== + dependencies: + domhandler "^5.0.3" + parse5 "^7.0.0" + +parse5-parser-stream@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz" + integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== + dependencies: + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz" + integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + dependencies: + entities "^4.4.0" + +parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseley@^0.12.0: + version "0.12.1" + resolved "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz" + integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== + dependencies: + leac "^0.6.0" + peberminta "^0.9.0" + +parseurl@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-to-regexp@^8.0.0: + version "8.2.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +peberminta@^0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz" + integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pirates@^4.0.4, pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkce-challenge@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz" + integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-plugin-hermes-parser@0.26.0, prettier-plugin-hermes-parser@^0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/prettier-plugin-hermes-parser/-/prettier-plugin-hermes-parser-0.26.0.tgz" + integrity sha512-ajjlx/0OQ+lcZQEnKEUDU7Srr9vw1OoMO6qZDIYmck1u7j9STiCStqb3RG1vE7FripXYAhquuI+oYG8BCTNC4g== + dependencies: + hermes-estree "0.26.0" + hermes-parser "0.26.0" + prettier-plugin-hermes-parser "0.26.0" + +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +pretty-format@30.0.5, pretty-format@^30.0.0: + version "30.0.5" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.0.5.tgz#e001649d472800396c1209684483e18a4d250360" + integrity sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw== + dependencies: + "@jest/schemas" "30.0.5" + ansi-styles "^5.2.0" + react-is "^18.3.1" + +pretty-format@^24: + version "24.9.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.3: + version "29.0.3" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.0.3.tgz" + integrity sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q== + dependencies: + "@jest/schemas" "^29.0.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompt-promise@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/prompt-promise/-/prompt-promise-1.0.3.tgz" + integrity sha512-xIbGSzK59hFiwn9kmD0Cki4igpUqTVx7c6D8lqZoENAZyTwxhMhh/QleHWoRFVVusi7CTj/ByHP3N+2EmkhKIA== + dependencies: + keypress "~0.2.1" + native-or-another "~2.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +protochain@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/protochain/-/protochain-1.0.5.tgz" + integrity sha512-4hDwFSX50C4NE6f/6zg8EPr/WLPTkFPUtG0ulWZu6bwzV2hmb50fpdQLr0HiKBAUehapaFpItzWoCLjraLJhUA== + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +punycode@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +puppeteer-core@24.7.2: + version "24.7.2" + resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz" + integrity sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q== + dependencies: + "@puppeteer/browsers" "2.10.2" + chromium-bidi "4.1.1" + debug "^4.4.0" + devtools-protocol "0.0.1425554" + typed-query-selector "^2.12.0" + ws "^8.18.1" + +puppeteer@^24.7.2: + version "24.7.2" + resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz" + integrity sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow== + dependencies: + "@puppeteer/browsers" "2.10.2" + chromium-bidi "4.1.1" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1425554" + puppeteer-core "24.7.2" + typed-query-selector "^2.12.0" + +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + +qs@^6.14.0: + version "6.14.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.6.3" + unpipe "1.0.0" + +react-dom@0.0.0-experimental-4beb1fd8-20241118: + version "0.0.0-experimental-4beb1fd8-20241118" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-0.0.0-experimental-4beb1fd8-20241118.tgz" + integrity sha512-/Gs2N/6hiuwqf2uuJ3UN/PWxpIncbuY7XY/IynlB2oNpopeV+x1MMXfNdse8TiPkpgg9aw+VUfQUlLPC52bKiQ== + dependencies: + scheduler "0.0.0-experimental-4beb1fd8-20241118" + +react-is@0.0.0-experimental-4beb1fd8-20241118: + version "0.0.0-experimental-4beb1fd8-20241118" + resolved "https://registry.npmjs.org/react-is/-/react-is-0.0.0-experimental-4beb1fd8-20241118.tgz" + integrity sha512-7JE3PtW4zpMYdp1bTXKNmz2t0jzaqc3frMWbvbuZmhif5ndtYx5oCGhfnbm6S5ZeTNKe4GXsN5D73QtZClfepQ== + +react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0, react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react@0.0.0-experimental-4beb1fd8-20241118: + version "0.0.0-experimental-4beb1fd8-20241118" + resolved "https://registry.npmjs.org/react/-/react-0.0.0-experimental-4beb1fd8-20241118.tgz" + integrity sha512-SojDx9IQZXRbze+BNoLRiBDblVTMRebpOZyU2QyRk4ptJob78QiROi58uuE7yxrFMDQN4kBl6tqYkSwQaIM2nQ== + +readable-stream@^3.4.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.escape@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexp.escape/-/regexp.escape-2.0.1.tgz#09e4beef9d202dbd739868f3818223f977cf91da" + integrity sha512-JItRb4rmyTzmERBkAf6J87LjDPy/RscIwmaJQ3gsFlAzrmZbZU8LwBw5IydFZXW9hqpgbPlGbMhtpqtuAhMgtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + for-each "^0.3.3" + safe-regex-test "^1.0.3" + +regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@6.0.1, rimraf@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz" + integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== + dependencies: + glob "^11.0.0" + package-json-from-dist "^1.0.0" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^4.34.8: + version "4.34.9" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz" + integrity sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.34.9" + "@rollup/rollup-android-arm64" "4.34.9" + "@rollup/rollup-darwin-arm64" "4.34.9" + "@rollup/rollup-darwin-x64" "4.34.9" + "@rollup/rollup-freebsd-arm64" "4.34.9" + "@rollup/rollup-freebsd-x64" "4.34.9" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.9" + "@rollup/rollup-linux-arm-musleabihf" "4.34.9" + "@rollup/rollup-linux-arm64-gnu" "4.34.9" + "@rollup/rollup-linux-arm64-musl" "4.34.9" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.9" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.9" + "@rollup/rollup-linux-riscv64-gnu" "4.34.9" + "@rollup/rollup-linux-s390x-gnu" "4.34.9" + "@rollup/rollup-linux-x64-gnu" "4.34.9" + "@rollup/rollup-linux-x64-musl" "4.34.9" + "@rollup/rollup-win32-arm64-msvc" "4.34.9" + "@rollup/rollup-win32-ia32-msvc" "4.34.9" + "@rollup/rollup-win32-x64-msvc" "4.34.9" + fsevents "~2.3.2" + +router@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.0.0, rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@0.0.0-experimental-4beb1fd8-20241118: + version "0.0.0-experimental-4beb1fd8-20241118" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.0.0-experimental-4beb1fd8-20241118.tgz" + integrity sha512-b7GQktevD5BPcS+R5qY5se5oX4b8AHQyebWswGZBdLCmElIwR3Q+RO5EgsLOA4t5D3/TDjLm58CQG16uEB5rMA== + +selderee@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz" + integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== + dependencies: + parseley "^0.12.0" + +semver@7.x, semver@^7.3.5: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^5.4.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.6.0, semver@^7.6.2: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +semver@^7.7.1: + version "7.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +send@^1.1.0, send@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz" + integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + dependencies: + debug "^4.3.5" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.0" + mime-types "^3.0.1" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.1" + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serializerr@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/serializerr/-/serializerr-1.0.3.tgz" + integrity sha512-yXUlHj0fjbndhACj2XWtIH5eJv7b/uadyl7CJA8b9wL5mIKm+g0/sL7rDzEmjC+k5y8ggcaP8i049F4FxA0U9Q== + dependencies: + protochain "^1.0.5" + +serve-static@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz" + integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.4" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.16: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +statuses@2.0.1, statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.0" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== + dependencies: + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz" + integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^10.2.1" + strip-ansi "^7.0.1" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0, supports-color@^8.1.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-fs@^3.0.8: + version "3.0.8" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.11: + version "0.2.12" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz" + integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww== + dependencies: + fdir "^6.4.3" + picomatch "^4.0.2" + +tmp@0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0, tough-cookie@^4.1.2: + version "4.1.4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" + integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +ts-jest@^28.0.7: + version "28.0.8" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +ts-jest@^29.3.2: + version "29.3.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.3.2.tgz#0576cdf0a507f811fe73dcd16d135ce89f8156cb" + integrity sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.7.1" + type-fest "^4.39.1" + yargs-parser "^21.1.1" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^2.0.1, tslib@^2.1.0: + version "2.5.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + +tsup@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/tsup/-/tsup-8.4.0.tgz" + integrity sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ== + dependencies: + bundle-require "^5.1.0" + cac "^6.7.14" + chokidar "^4.0.3" + consola "^3.4.0" + debug "^4.4.0" + esbuild "^0.25.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.34.8" + source-map "0.8.0-beta.0" + sucrase "^3.35.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.11" + tree-kill "^1.2.2" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.39.1: + version "4.40.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.40.1.tgz#d78a09f08dd1081a434dd377967650cfd565401d" + integrity sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA== + +type-is@^2.0.0, type-is@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + +typescript-eslint@^8.16.0: + version "8.18.1" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.1.tgz" + integrity sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ== + dependencies: + "@typescript-eslint/eslint-plugin" "8.18.1" + "@typescript-eslint/parser" "8.18.1" + "@typescript-eslint/utils" "8.18.1" + +typescript@^5.4.3: + version "5.4.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici@^6.19.5: + version "6.21.2" + resolved "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz" + integrity sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.0: + version "9.3.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +vary@^1, vary@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +wait-on@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz" + integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ== + dependencies: + axios "^1.6.1" + joi "^17.11.0" + lodash "^4.17.21" + minimist "^1.2.8" + rxjs "^7.8.1" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^1.2.10, which@^1.2.14: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +winston-transport@^4.7.0: + version "4.9.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz" + integrity sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + +wordwrap@>=0.0.2: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.13.0, ws@^8.18.1, ws@^8.8.0: + version "8.18.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz" + integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1, yargs@^17.7.1, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod-to-json-schema@^3.24.1: + version "3.24.5" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz" + integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== + +"zod-validation-error@^3.5.0 || ^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" + integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== + +zod@^3.23.8, zod@^3.24.1: + version "3.24.3" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz" + integrity sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg== + +"zod@^3.25.0 || ^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.12.tgz#64f1ea53d00eab91853195653b5af9eee68970f0" + integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ== diff --git a/dangerfile.js b/dangerfile.js new file mode 100644 index 00000000000..d60da35b586 --- /dev/null +++ b/dangerfile.js @@ -0,0 +1,282 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +/* eslint-disable no-for-of-loops/no-for-of-loops */ + +// Hi, if this is your first time editing/reading a Dangerfile, here's a summary: +// It's a JS runtime which helps you provide continuous feedback inside GitHub. +// +// You can see the docs here: http://danger.systems/js/ +// +// If you want to test changes Danger, I'd recommend checking out an existing PR +// and then running the `danger pr` command. +// +// You'll need a GitHub token, you can re-use this one: +// +// 0a7d5c3cad9a6dbec2d9 9a5222cf49062a4c1ef7 +// +// (Just remove the space) +// +// So, for example: +// +// `DANGER_GITHUB_API_TOKEN=[ENV_ABOVE] yarn danger pr https://github.com/facebook/react/pull/11865 + +const {markdown, danger, warn} = require('danger'); +const {promisify} = require('util'); +const glob = promisify(require('glob')); +const gzipSize = require('gzip-size'); +const {writeFileSync} = require('fs'); + +const {readFileSync, statSync} = require('fs'); + +const BASE_DIR = 'base-build'; +const HEAD_DIR = 'build'; + +const CRITICAL_THRESHOLD = 0.02; +const SIGNIFICANCE_THRESHOLD = 0.002; +const CRITICAL_ARTIFACT_PATHS = new Set([ + // We always report changes to these bundles, even if the change is + // insignificant or non-existent. + 'oss-stable/react-dom/cjs/react-dom.production.js', + 'oss-stable/react-dom/cjs/react-dom-client.production.js', + 'oss-experimental/react-dom/cjs/react-dom.production.js', + 'oss-experimental/react-dom/cjs/react-dom-client.production.js', + 'facebook-www/ReactDOM-prod.classic.js', + 'facebook-www/ReactDOM-prod.modern.js', +]); + +const kilobyteFormatter = new Intl.NumberFormat('en', { + style: 'unit', + unit: 'kilobyte', + minimumFractionDigits: 2, + maximumFractionDigits: 2, +}); + +function kbs(bytes) { + return kilobyteFormatter.format(bytes / 1000); +} + +const percentFormatter = new Intl.NumberFormat('en', { + style: 'percent', + signDisplay: 'exceptZero', + minimumFractionDigits: 2, + maximumFractionDigits: 2, +}); + +function change(decimal) { + if (decimal === Infinity) { + return 'New file'; + } + if (decimal === -1) { + return 'Deleted'; + } + if (decimal < 0.0001) { + return '='; + } + return percentFormatter.format(decimal); +} + +const header = ` + | Name | +/- | Base | Current | +/- gzip | Base gzip | Current gzip | + | ---- | --- | ---- | ------- | -------- | --------- | ------------ |`; + +function row(result, baseSha, headSha) { + const diffViewUrl = `https://react-builds.vercel.app/commits/${headSha}/files/${result.path}?compare=${baseSha}`; + const rowArr = [ + `| [${result.path}](${diffViewUrl})`, + `**${change(result.change)}**`, + `${kbs(result.baseSize)}`, + `${kbs(result.headSize)}`, + `${change(result.changeGzip)}`, + `${kbs(result.baseSizeGzip)}`, + `${kbs(result.headSizeGzip)}`, + ]; + return rowArr.join(' | '); +} + +(async function () { + // Use git locally to grab the commit which represents the place + // where the branches differ + + const upstreamRepo = danger.github.pr.base.repo.full_name; + if (upstreamRepo !== 'facebook/react') { + // Exit unless we're running in the main repo + return; + } + + let headSha; + let baseSha; + try { + headSha = String(readFileSync(HEAD_DIR + '/COMMIT_SHA')).trim(); + baseSha = String(readFileSync(BASE_DIR + '/COMMIT_SHA')).trim(); + } catch { + warn( + "Failed to read build artifacts. It's possible a build configuration " + + 'has changed upstream. Try pulling the latest changes from the ' + + 'main branch.' + ); + return; + } + + // Disable sizeBot in a Devtools Pull Request. Because that doesn't affect production bundle size. + const commitFiles = [ + ...danger.git.created_files, + ...danger.git.deleted_files, + ...danger.git.modified_files, + ]; + if ( + commitFiles.every(filename => filename.includes('packages/react-devtools')) + ) + return; + + const resultsMap = new Map(); + + // Find all the head (current) artifacts paths. + const headArtifactPaths = await glob('**/*.js', {cwd: 'build'}); + for (const artifactPath of headArtifactPaths) { + try { + // This will throw if there's no matching base artifact + const baseSize = statSync(BASE_DIR + '/' + artifactPath).size; + const baseSizeGzip = gzipSize.fileSync(BASE_DIR + '/' + artifactPath); + + const headSize = statSync(HEAD_DIR + '/' + artifactPath).size; + const headSizeGzip = gzipSize.fileSync(HEAD_DIR + '/' + artifactPath); + resultsMap.set(artifactPath, { + path: artifactPath, + headSize, + headSizeGzip, + baseSize, + baseSizeGzip, + change: (headSize - baseSize) / baseSize, + changeGzip: (headSizeGzip - baseSizeGzip) / baseSizeGzip, + }); + } catch { + // There's no matching base artifact. This is a new file. + const baseSize = 0; + const baseSizeGzip = 0; + const headSize = statSync(HEAD_DIR + '/' + artifactPath).size; + const headSizeGzip = gzipSize.fileSync(HEAD_DIR + '/' + artifactPath); + resultsMap.set(artifactPath, { + path: artifactPath, + headSize, + headSizeGzip, + baseSize, + baseSizeGzip, + change: Infinity, + changeGzip: Infinity, + }); + } + } + + // Check for base artifacts that were deleted in the head. + const baseArtifactPaths = await glob('**/*.js', {cwd: 'base-build'}); + for (const artifactPath of baseArtifactPaths) { + if (!resultsMap.has(artifactPath)) { + const baseSize = statSync(BASE_DIR + '/' + artifactPath).size; + const baseSizeGzip = gzipSize.fileSync(BASE_DIR + '/' + artifactPath); + const headSize = 0; + const headSizeGzip = 0; + resultsMap.set(artifactPath, { + path: artifactPath, + headSize, + headSizeGzip, + baseSize, + baseSizeGzip, + change: -1, + changeGzip: -1, + }); + } + } + + const results = Array.from(resultsMap.values()); + results.sort((a, b) => b.change - a.change); + + let criticalResults = []; + for (const artifactPath of CRITICAL_ARTIFACT_PATHS) { + const result = resultsMap.get(artifactPath); + if (result === undefined) { + throw new Error( + 'Missing expected bundle. If this was an intentional change to the ' + + 'build configuration, update Dangerfile.js accordingly: ' + + artifactPath + ); + } + criticalResults.push(row(result, baseSha, headSha)); + } + + let significantResults = []; + for (const result of results) { + // If result exceeds critical threshold, add to top section. + if ( + (result.change > CRITICAL_THRESHOLD || + 0 - result.change > CRITICAL_THRESHOLD || + // New file + result.change === Infinity || + // Deleted file + result.change === -1) && + // Skip critical artifacts. We added those earlier, in a fixed order. + !CRITICAL_ARTIFACT_PATHS.has(result.path) + ) { + criticalResults.push(row(result, baseSha, headSha)); + } + + // Do the same for results that exceed the significant threshold. These + // will go into the bottom, collapsed section. Intentionally including + // critical artifacts in this section, too. + if ( + result.change > SIGNIFICANCE_THRESHOLD || + 0 - result.change > SIGNIFICANCE_THRESHOLD || + result.change === Infinity || + result.change === -1 + ) { + significantResults.push(row(result, baseSha, headSha)); + } + } + + const message = ` +Comparing: ${baseSha}...${headSha} + +## Critical size changes + +Includes critical production bundles, as well as any change greater than ${ + CRITICAL_THRESHOLD * 100 + }%: + +${header} +${criticalResults.join('\n')} + +## Significant size changes + +Includes any change greater than ${SIGNIFICANCE_THRESHOLD * 100}%: + +${ + significantResults.length > 0 + ? ` +
+Expand to show +${header} +${significantResults.join('\n')} +
+` + : '(No significant changes)' +} +`; + + // GitHub comments are limited to 65536 characters. + if (message.length > 65536) { + // Make message available as an artifact + writeFileSync('sizebot-message.md', message); + markdown( + 'The size diff is too large to display in a single comment. ' + + `The GitHub action for this pull request contains an artifact called 'sizebot-message.md' with the full message.` + ); + } else { + markdown(message); + } +})(); diff --git a/docs/404.md b/docs/404.md deleted file mode 100644 index ab9ba1d60cf..00000000000 --- a/docs/404.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: single -title: Page Not Found -permalink: 404.html ---- - -We couldn't find what you were looking for. - -Please contact the owner of the site that linked you to the original URL and let them know their link is broken. diff --git a/docs/Gemfile b/docs/Gemfile deleted file mode 100644 index f144584eff3..00000000000 --- a/docs/Gemfile +++ /dev/null @@ -1,29 +0,0 @@ -source 'https://rubygems.org' - -gem 'rake' - -# jekyll, which builds it all -# 3.0 includes sass processing -gem 'jekyll', '~>3.1' - -# Jekyll extensions -gem 'jekyll-redirect-from' -gem 'jekyll-paginate' - -# JSON -gem 'json' - -# For `rake watch` -gem 'rb-fsevent' - -# For markdown header cleanup -gem 'sanitize', '~>2.0' - -# Markdown -gem 'redcarpet' - -# Syntax highlighting -gem 'pygments.rb' - -# Avoid having to poll for changes on Windows -gem 'wdm', '>= 0.1.0' if Gem.win_platform? \ No newline at end of file diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock deleted file mode 100644 index bd775465628..00000000000 --- a/docs/Gemfile.lock +++ /dev/null @@ -1,70 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - colorator (0.1) - ffi (1.9.14) - ffi (1.9.14-x64-mingw32) - jekyll (3.1.6) - colorator (~> 0.1) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 1.1) - kramdown (~> 1.3) - liquid (~> 3.0) - mercenary (~> 0.3.3) - rouge (~> 1.7) - safe_yaml (~> 1.0) - jekyll-paginate (1.1.0) - jekyll-redirect-from (0.11.0) - jekyll (>= 2.0) - jekyll-sass-converter (1.4.0) - sass (~> 3.4) - jekyll-watch (1.4.0) - listen (~> 3.0, < 3.1) - json (2.0.1) - kramdown (1.11.1) - liquid (3.0.6) - listen (3.0.8) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - mercenary (0.3.6) - mini_portile2 (2.1.0) - nokogiri (1.6.8) - mini_portile2 (~> 2.1.0) - pkg-config (~> 1.1.7) - nokogiri (1.6.8-x64-mingw32) - mini_portile2 (~> 2.1.0) - pkg-config (~> 1.1.7) - pkg-config (1.1.7) - posix-spawn (0.3.11) - pygments.rb (0.6.3) - posix-spawn (~> 0.3.6) - yajl-ruby (~> 1.2.0) - rake (11.2.2) - rb-fsevent (0.9.7) - rb-inotify (0.9.7) - ffi (>= 0.5.0) - redcarpet (3.3.4) - rouge (1.11.1) - safe_yaml (1.0.4) - sanitize (2.1.0) - nokogiri (>= 1.4.4) - sass (3.4.22) - yajl-ruby (1.2.1) - -PLATFORMS - ruby - x64-mingw32 - -DEPENDENCIES - jekyll (~> 3.1) - jekyll-paginate - jekyll-redirect-from - json - pygments.rb - rake - rb-fsevent - redcarpet - sanitize (~> 2.0) - -BUNDLED WITH - 1.11.2 diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 6517ab8bb47..00000000000 --- a/docs/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# React Documentation & Website - -We use [Jekyll](http://jekyllrb.com/) to build the site using ([mostly](http://zpao.com/posts/adding-line-highlights-to-markdown-code-fences/)) Markdown, and we host it by pushing HTML to [GitHub Pages](http://pages.github.com/). - -## Installation - -If you are working on the site, you will want to install and run a local copy of it. - -### Dependencies - -In order to use Jekyll, you will need to have Ruby installed. macOS comes pre-installed with Ruby, but you may need to update RubyGems (via `gem update --system`). -Otherwise, [RVM](https://rvm.io/) and [rbenv](https://github.com/sstephenson/rbenv) are popular ways to install Ruby. - - - [Ruby](http://www.ruby-lang.org/) (version >= 1.8.7) - - [RubyGems](http://rubygems.org/) (version >= 1.3.7) - - [Bundler](http://gembundler.com/) - -The version of the Pygment syntax highlighter used by Jekyll requires Python 2.7.x (not 3.x). macOS comes pre-installed with Python 2.7, but you may need to install it on other OSs. - - - [Python](https://www.python.org) (version 2.7.x) - -Once you have RubyGems and installed Bundler (via `gem install bundler`), use it to install the dependencies: - -```sh -$ cd react/docs -$ bundle install # Might need sudo. -$ npm install -``` - -### Instructions - -The site requires React, so first make sure you've built the project (via [`grunt`](http://gruntjs.com/getting-started)). - -Use Jekyll to serve the website locally (by default, at `http://localhost:4000`): - -```sh -$ cd react/docs -$ bundle exec rake -$ bundle exec rake fetch_remotes -$ bundle exec jekyll serve -w -$ open http://localhost:4000/react/index.html -``` - -We use [SASS](http://sass-lang.com/) (with [Bourbon](http://bourbon.io/)) for our CSS, and we use JSX to transform some of our JS. -If you only want to modify the HTML or Markdown, you do not have to do anything because we package pre-compiled copies of the CSS and JS. -If you want to modify the CSS or JS, use [Rake](http://rake.rubyforge.org/) to compile them: - -```sh -$ cd react/docs -$ bundle exec rake watch # Automatically compiles as needed. -# bundle exec rake Manually compile CSS and JS. -# bundle exec rake js Manually compile JS, only. -``` - -## Afterthoughts - -### Updating `facebook.github.io/react` - -The easiest way to do this is to have a separate clone of this repository, checked out to the `gh-pages` branch. We have a build step that expects this to be in a directory named `react-gh-pages` at the same depth as `react`. Then it's just a matter of running `grunt docs`, which will compile the site and copy it out to this repository. From there, you can check it in. - -**Note:** This should only be done for new releases. You should create a tag corresponding to the release tag in the main repository. - -We also have a rake task that does the same thing (without creating commits). It expects the directory structure mentioned above. - -```sh -$ bundle exec rake release -``` - -### Removing the Jekyll / Ruby Dependency - -In an ideal world, we would not be adding a Ruby dependency on part of our project. We would like to move towards a point where we are using React to render the website. diff --git a/docs/Rakefile b/docs/Rakefile deleted file mode 100644 index 5f5e1e4c7b3..00000000000 --- a/docs/Rakefile +++ /dev/null @@ -1,74 +0,0 @@ -require('rubygems') -require('json') -require('yaml') -require('open-uri') - -desc "download babel-browser" -task :fetch_remotes do - IO.copy_stream( - open('https://unpkg.com/babel-standalone@6.15.0/babel.min.js'), - 'js/babel.min.js' - ) -end - -desc "generate js from jsx" -task :js do - system "../node_modules/.bin/babel _js --out-dir=js" -end - -desc "watch js" -task :watch do - Process.spawn "../node_modules/.bin/babel _js --out-dir=js --watch" - Process.waitall -end - -desc "update version to match ../package.json" -task :update_version do - react_version = JSON.parse(File.read('../package.json'))['version'] - site_config = YAML.load_file('_config.yml') - if site_config['react_version'] != react_version - site_config['react_version'] = react_version - File.open('_config.yml', 'w+') { |f| f.write(site_config.to_yaml) } - end -end - -desc "update SRI hashes" -task :update_hashes do - map = { - 'react.js' => 'dev', - 'react.min.js' => 'prod', - 'react-dom.js' => 'dom_dev', - 'react-dom.min.js' => 'dom_prod', - 'react-dom-server.js' => 'dom_server_dev', - 'react-dom-server.min.js' => 'dom_server_prod' - } - site_config = YAML.load_file('_config.yml') - map.each do |file, key| - site_config['react_hashes'][key] = `openssl dgst -sha384 -binary ../../react-bower/#{file} | openssl base64 -A` - end - File.open('_config.yml', 'w+') { |f| f.write(site_config.to_yaml) } -end - -desc "update acknowledgements list" -task :update_acknowledgements do - authors = File.readlines('../AUTHORS').map {|author| author.gsub(/ <.*\n/,'')} - # split into cols here because nobody knows how to use liquid - # need to to_f because ruby will keep slice_size as int and round on its own - slice_size = (authors.size / 3.to_f).ceil - cols = authors.each_slice(slice_size).to_a - File.open('_data/acknowledgements.yml', 'w+') { |f| f.write(cols.to_yaml) } -end - -desc "copy error codes to docs" -task :copy_error_codes do - codes_json = File.read('../scripts/error-codes/codes.json') - codes_js = "var errorMap = #{codes_json.chomp};\n" - File.write('js/errorMap.js', codes_js) -end - -desc "build into ../../react-gh-pages" -task :release => [:update_version, :js, :fetch_remotes, :copy_error_codes] do - system "jekyll build -d ../../react-gh-pages" -end - -task :default => [:js] diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 0b6d13d4dfc..00000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,72 +0,0 @@ ---- -name: React -description: A JavaScript library for building user interfaces -url: https://facebook.github.io -baseurl: /react -permalink: /blog/:year/:month/:day/:title.html -paginate_path: /blog/page:num/ -paginate: 5 -timezone: America/Los_Angeles -highlighter: pygments -defaults: -- scope: - path: '' - type: posts - values: - layout: post - sectionid: blog -- scope: - path: blog - type: pages - values: - sectionid: blog -- scope: - path: tutorial - type: pages - values: - layout: tutorial - sectionid: tutorial -- scope: - path: docs - type: pages - values: - layout: docs - sectionid: docs -- scope: - path: contributing - type: pages - values: - sectionid: docs -- scope: - path: community - type: pages - values: - layout: community - sectionid: community -exclude: -- Gemfile -- Gemfile.lock -- README.md -- Rakefile -- vendor/bundle -markdown: redcarpet -redcarpet: - extensions: - - fenced_code_blocks - - footnotes -sass: - style: :compressed - sass_dir: _css -gems: -- jekyll-redirect-from -- jekyll-paginate -react_version: 15.4.0 -react_hashes: - dev: buVLzxzBI8Ps3svVMSUurNdb5dozNidH5Ow4H0YgZeia3t6Oeui2VLpvtAq1fwtK - prod: nCjsa0kjNQPQdxWm12/ReVJzfBJaVubEwwDswyQDGMKYJmeWv3qShMuETfU5fisu - addons_dev: /u97pKzBwasbC1yj8gSIq1z30o4ZTUX9j1Mv/hyAjmG41ydTNHw9JFOhwFbDgxmR - addons_prod: /p86n4b5VTlWoA/INEHQZ+zjx9g1pJduoFmTEJ6fSzFTq1mBaXaBcWVGtZJXD68L - dom_dev: lUxkeWjg3I3lXmxcM1gvgo0yvm2w9alc1osa4L8yWZFO6l/vg9h5hSlHPFioltrm - dom_prod: u8x1yIGN9IjGNYbBaDMsp1D4MK3sCmMU13mcBX+bm+aMo5+gaT8HIwIj39GlXaRS - dom_server_dev: Okj1hVX1VF+oZSkPcJQ/YcnW6bsIpeni222ylwUaMnSmdCe0zWKmMwpFMVqzy4Ws - dom_server_prod: wiA4u+G5fEfF4xzhhVnNWeSifVyttoEIpgc3APaMKQgw5A4wHbEMihf63tk1qoyt diff --git a/docs/_css/_solarized.scss b/docs/_css/_solarized.scss deleted file mode 100644 index 2776017ea7d..00000000000 --- a/docs/_css/_solarized.scss +++ /dev/null @@ -1,171 +0,0 @@ -html * { - color-profile: sRGB; - rendering-intent: auto; -} - .cm-s-solarized-light { - background-color: #f8f5ec; - color: #637c84; - } - .cm-s-solarized-light .emphasis { - font-weight: bold; - } - .cm-s-solarized-light .dotted { - border-bottom: 1px dotted #cb4b16; - } - .cm-s-solarized-light .CodeMirror-gutter { - background-color: #eee8d5; - border-right: 3px solid #eee8d5; - } - .cm-s-solarized-light .CodeMirror-gutter .CodeMirror-gutter-text { - color: #93a1a1; - } - .cm-s-solarized-light .CodeMirror-cursor { - border-left-color: #002b36 !important; - } - .cm-s-solarized-light .CodeMirror-matchingbracket { - color: #002b36; - background-color: #eee8d5; - box-shadow: 0 0 10px #eee8d5; - font-weight: bold; - } - .cm-s-solarized-light .CodeMirror-nonmatchingbracket { - color: #002b36; - background-color: #eee8d5; - box-shadow: 0 0 10px #eee8d5; - font-weight: bold; - color: #dc322f; - border-bottom: 1px dotted #cb4b16; - } - .cm-s-solarized-light span.cm-keyword { - color: #859900; - } - .cm-s-solarized-light span.cm-atom { - color: #2aa198; - } - .cm-s-solarized-light span.cm-number { - color: #586e75; - } - .cm-s-solarized-light span.cm-def { - color: #637c84; - } - .cm-s-solarized-light span.cm-variable { - color: #637c84; - } - .cm-s-solarized-light span.cm-variable-2 { - color: #b58900; - } - .cm-s-solarized-light span.cm-variable-3 { - color: #cb4b16; - } - .cm-s-solarized-light span.cm-comment { - color: #93a1a1; - } - .cm-s-solarized-light span.cm-property { - color: #657b83; - } - .cm-s-solarized-light span.cm-operator { - color: #657b83; - } - .cm-s-solarized-light span.cm-string { - color: #36958e; - } - .cm-s-solarized-light span.cm-error { - font-weight: bold; - border-bottom: 1px dotted #cb4b16; - } - .cm-s-solarized-light span.cm-bracket { - color: #268bd2; - } - .cm-s-solarized-light span.cm-tag { - color: #268bd2; - } - .cm-s-solarized-light span.cm-attribute { - color: #586e75; - } - .cm-s-solarized-light span.cm-meta { - color: #268bd2; - } - .cm-s-solarized-dark { - background-color: #002b36; - color: #839496; - } - .cm-s-solarized-dark .emphasis { - font-weight: bold; - } - .cm-s-solarized-dark .dotted { - border-bottom: 1px dotted #cb4b16; - } - .cm-s-solarized-dark .CodeMirror-gutter { - background-color: #073642; - border-right: 3px solid #073642; - } - .cm-s-solarized-dark .CodeMirror-gutter .CodeMirror-gutter-text { - color: #586e75; - } - .cm-s-solarized-dark .CodeMirror-cursor { - border-left-color: #fdf6e3 !important; - } - .cm-s-solarized-dark .CodeMirror-matchingbracket { - color: #fdf6e3; - background-color: #073642; - box-shadow: 0 0 10px #073642; - font-weight: bold; - } - .cm-s-solarized-dark .CodeMirror-nonmatchingbracket { - color: #fdf6e3; - background-color: #073642; - box-shadow: 0 0 10px #073642; - font-weight: bold; - color: #dc322f; - border-bottom: 1px dotted #cb4b16; - } - .cm-s-solarized-dark span.cm-keyword { - color: #839496; - font-weight: bold; - } - .cm-s-solarized-dark span.cm-atom { - color: #2aa198; - } - .cm-s-solarized-dark span.cm-number { - color: #93a1a1; - } - .cm-s-solarized-dark span.cm-def { - color: #268bd2; - } - .cm-s-solarized-dark span.cm-variable { - color: #cb4b16; - } - .cm-s-solarized-dark span.cm-variable-2 { - color: #cb4b16; - } - .cm-s-solarized-dark span.cm-variable-3 { - color: #cb4b16; - } - .cm-s-solarized-dark span.cm-comment { - color: #586e75; - } - .cm-s-solarized-dark span.cm-property { - color: #b58900; - } - .cm-s-solarized-dark span.cm-operator { - color: #839496; - } - .cm-s-solarized-dark span.cm-string { - color: #6c71c4; - } - .cm-s-solarized-dark span.cm-error { - font-weight: bold; - border-bottom: 1px dotted #cb4b16; - } - .cm-s-solarized-dark span.cm-bracket { - color: #cb4b16; - } - .cm-s-solarized-dark span.cm-tag { - color: #839496; - } - .cm-s-solarized-dark span.cm-attribute { - color: #93a1a1; - } - .cm-s-solarized-dark span.cm-meta { - color: #268bd2; - } diff --git a/docs/_css/_typography.scss b/docs/_css/_typography.scss deleted file mode 100644 index 3d94ba05b6a..00000000000 --- a/docs/_css/_typography.scss +++ /dev/null @@ -1,135 +0,0 @@ -@import 'variables.scss'; - -$textColor: $mediumColor; -$textColorLight: lighten($textColor, 20%); - -html { - font-family: $helvetica; - font-family: proxima-nova, $helvetica; - color: $textColor; - line-height: 1.28; -} - -p { - margin: 0 0 10px; -} - -.subHeader { - font-size: 21px; - font-weight: 200; - line-height: 30px; - margin-bottom: 10px; -} - -em { - font-style: italic; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: $textColorLight -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 39px; -} - -h2 { - font-size: 31px; -} - -h3 { - font-size: 23px; -} - -h4 { - font-size: 16px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11px; -} - -h1 small { - font-size: 24px; -} - -h2 small { - font-size: 18px; -} - -h3 small { - font-size: 16px; -} - -h4 small { - font-size: 14px; -} - -ul, -ol { - margin: 0 0 10px 25px; - padding: 0; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -a { - color: $linkColor; - text-decoration: none; - &:hover, - &:focus { - color: $linkInteract; - text-decoration: underline; - } - &:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; - } -} -.center { - text-align: center; -} - -input { - font-family: inherit; -} diff --git a/docs/_css/_variables.scss b/docs/_css/_variables.scss deleted file mode 100644 index 8cc217f85fe..00000000000 --- a/docs/_css/_variables.scss +++ /dev/null @@ -1,22 +0,0 @@ -$primary: #cc7a6f; -$linkColor: darken($primary, 9%); -$linkInteract: darken($linkColor, 9%); -$pageBg: #f9f9f9; - -$lightColor: #e9e9e9; -$mediumestColor: #666; -$mediumColor: #484848; -$darkColor: #2d2d2d; -$darkestColor: #222222; -$blueColor: #61dafb; -$orangeColor: complement($blueColor); - -$lightTextColor: #fafafa; -$mediumTextColor: #aaa; -$darkTextColor: $mediumColor; - -$buttonBlueTop: #77a3d2; -$buttonBlueBottom: #4783c2; -$buttonGreyTop: #9a9a9a; -$buttonGreyBottom: #646464; - diff --git a/docs/_css/bourbon/_bourbon-deprecated-upcoming.scss b/docs/_css/bourbon/_bourbon-deprecated-upcoming.scss deleted file mode 100644 index f946b3b456d..00000000000 --- a/docs/_css/bourbon/_bourbon-deprecated-upcoming.scss +++ /dev/null @@ -1,8 +0,0 @@ -//************************************************************************// -// These mixins/functions are deprecated -// They will be removed in the next MAJOR version release -//************************************************************************// -@mixin inline-block { - display: inline-block; - @warn "inline-block mixin is deprecated and will be removed in the next major version release"; -} diff --git a/docs/_css/bourbon/_bourbon.scss b/docs/_css/bourbon/_bourbon.scss deleted file mode 100644 index eea6e21e9ed..00000000000 --- a/docs/_css/bourbon/_bourbon.scss +++ /dev/null @@ -1,79 +0,0 @@ -// Settings -@import "settings/prefixer"; -@import "settings/px-to-em"; -@import "settings/asset-pipeline"; - -// Custom Helpers -@import "helpers/convert-units"; -@import "helpers/gradient-positions-parser"; -@import "helpers/is-num"; -@import "helpers/linear-angle-parser"; -@import "helpers/linear-gradient-parser"; -@import "helpers/linear-positions-parser"; -@import "helpers/linear-side-corner-parser"; -@import "helpers/radial-arg-parser"; -@import "helpers/radial-positions-parser"; -@import "helpers/radial-gradient-parser"; -@import "helpers/render-gradients"; -@import "helpers/shape-size-stripper"; -@import "helpers/str-to-num"; - -// Custom Functions -@import "functions/assign"; -@import "functions/color-lightness"; -@import "functions/flex-grid"; -@import "functions/golden-ratio"; -@import "functions/grid-width"; -@import "functions/modular-scale"; -@import "functions/px-to-em"; -@import "functions/px-to-rem"; -@import "functions/strip-units"; -@import "functions/tint-shade"; -@import "functions/transition-property-name"; -@import "functions/unpack"; - -// CSS3 Mixins -@import "css3/animation"; -@import "css3/appearance"; -@import "css3/backface-visibility"; -@import "css3/background"; -@import "css3/background-image"; -@import "css3/border-image"; -@import "css3/border-radius"; -@import "css3/box-sizing"; -@import "css3/calc"; -@import "css3/columns"; -@import "css3/filter"; -@import "css3/flex-box"; -@import "css3/font-face"; -@import "css3/font-feature-settings"; -@import "css3/hyphens"; -@import "css3/hidpi-media-query"; -@import "css3/image-rendering"; -@import "css3/keyframes"; -@import "css3/linear-gradient"; -@import "css3/perspective"; -@import "css3/radial-gradient"; -@import "css3/transform"; -@import "css3/transition"; -@import "css3/user-select"; -@import "css3/placeholder"; - -// Addons & other mixins -@import "addons/button"; -@import "addons/clearfix"; -@import "addons/directional-values"; -@import "addons/ellipsis"; -@import "addons/font-family"; -@import "addons/hide-text"; -@import "addons/html5-input-types"; -@import "addons/position"; -@import "addons/prefixer"; -@import "addons/retina-image"; -@import "addons/size"; -@import "addons/timing-functions"; -@import "addons/triangle"; -@import "addons/word-wrap"; - -// Soon to be deprecated Mixins -@import "bourbon-deprecated-upcoming"; diff --git a/docs/_css/bourbon/addons/_button.scss b/docs/_css/bourbon/addons/_button.scss deleted file mode 100644 index 14a89e480c1..00000000000 --- a/docs/_css/bourbon/addons/_button.scss +++ /dev/null @@ -1,374 +0,0 @@ -@mixin button ($style: simple, $base-color: #4294f0, $text-size: inherit, $padding: 7px 18px) { - - @if type-of($style) == string and type-of($base-color) == color { - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == string and type-of($base-color) == number { - $padding: $text-size; - $text-size: $base-color; - $base-color: #4294f0; - - @if $padding == inherit { - $padding: 7px 18px; - } - - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == color and type-of($base-color) == color { - $base-color: $style; - $style: simple; - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == color and type-of($base-color) == number { - $padding: $text-size; - $text-size: $base-color; - $base-color: $style; - $style: simple; - - @if $padding == inherit { - $padding: 7px 18px; - } - - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == number { - $padding: $base-color; - $text-size: $style; - $base-color: #4294f0; - $style: simple; - - @if $padding == #4294f0 { - $padding: 7px 18px; - } - - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } -} - - -// Selector Style Button -//************************************************************************// -@mixin buttonstyle($type, $b-color, $t-size, $pad) { - // Grayscale button - @if $type == simple and $b-color == grayscale($b-color) { - @include simple($b-color, true, $t-size, $pad); - } - - @if $type == shiny and $b-color == grayscale($b-color) { - @include shiny($b-color, true, $t-size, $pad); - } - - @if $type == pill and $b-color == grayscale($b-color) { - @include pill($b-color, true, $t-size, $pad); - } - - @if $type == flat and $b-color == grayscale($b-color) { - @include flat($b-color, true, $t-size, $pad); - } - - // Colored button - @if $type == simple { - @include simple($b-color, false, $t-size, $pad); - } - - @else if $type == shiny { - @include shiny($b-color, false, $t-size, $pad); - } - - @else if $type == pill { - @include pill($b-color, false, $t-size, $pad); - } - - @else if $type == flat { - @include flat($b-color, false, $t-size, $pad); - } -} - - -// Simple Button -//************************************************************************// -@mixin simple($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - $border: adjust-color($base-color, $saturation: 9%, $lightness: -14%); - $inset-shadow: adjust-color($base-color, $saturation: -8%, $lightness: 15%); - $stop-gradient: adjust-color($base-color, $saturation: 9%, $lightness: -11%); - $text-shadow: adjust-color($base-color, $saturation: 15%, $lightness: -18%); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%); - } - - @if $grayscale == true { - $border: grayscale($border); - $inset-shadow: grayscale($inset-shadow); - $stop-gradient: grayscale($stop-gradient); - $text-shadow: grayscale($text-shadow); - } - - border: 1px solid $border; - border-radius: 3px; - box-shadow: inset 0 1px 0 0 $inset-shadow; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: bold; - @include linear-gradient ($base-color, $stop-gradient); - padding: $padding; - text-decoration: none; - text-shadow: 0 1px 0 $text-shadow; - background-clip: padding-box; - - &:hover:not(:disabled) { - $base-color-hover: adjust-color($base-color, $saturation: -4%, $lightness: -5%); - $inset-shadow-hover: adjust-color($base-color, $saturation: -7%, $lightness: 5%); - $stop-gradient-hover: adjust-color($base-color, $saturation: 8%, $lightness: -14%); - - @if $grayscale == true { - $base-color-hover: grayscale($base-color-hover); - $inset-shadow-hover: grayscale($inset-shadow-hover); - $stop-gradient-hover: grayscale($stop-gradient-hover); - } - - box-shadow: inset 0 1px 0 0 $inset-shadow-hover; - cursor: pointer; - @include linear-gradient ($base-color-hover, $stop-gradient-hover); - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $border-active: adjust-color($base-color, $saturation: 9%, $lightness: -14%); - $inset-shadow-active: adjust-color($base-color, $saturation: 7%, $lightness: -17%); - - @if $grayscale == true { - $border-active: grayscale($border-active); - $inset-shadow-active: grayscale($inset-shadow-active); - } - - border: 1px solid $border-active; - box-shadow: inset 0 0 8px 4px $inset-shadow-active, inset 0 0 8px 4px $inset-shadow-active; - } -} - - -// Shiny Button -//************************************************************************// -@mixin shiny($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - $border: adjust-color($base-color, $red: -117, $green: -111, $blue: -81); - $border-bottom: adjust-color($base-color, $red: -126, $green: -127, $blue: -122); - $fourth-stop: adjust-color($base-color, $red: -79, $green: -70, $blue: -46); - $inset-shadow: adjust-color($base-color, $red: 37, $green: 29, $blue: 12); - $second-stop: adjust-color($base-color, $red: -56, $green: -50, $blue: -33); - $text-shadow: adjust-color($base-color, $red: -140, $green: -141, $blue: -114); - $third-stop: adjust-color($base-color, $red: -86, $green: -75, $blue: -48); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%); - } - - @if $grayscale == true { - $border: grayscale($border); - $border-bottom: grayscale($border-bottom); - $fourth-stop: grayscale($fourth-stop); - $inset-shadow: grayscale($inset-shadow); - $second-stop: grayscale($second-stop); - $text-shadow: grayscale($text-shadow); - $third-stop: grayscale($third-stop); - } - - border: 1px solid $border; - border-bottom: 1px solid $border-bottom; - border-radius: 5px; - box-shadow: inset 0 1px 0 0 $inset-shadow; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: bold; - @include linear-gradient(top, $base-color 0%, $second-stop 50%, $third-stop 50%, $fourth-stop 100%); - padding: $padding; - text-align: center; - text-decoration: none; - text-shadow: 0 -1px 1px $text-shadow; - - &:hover:not(:disabled) { - $first-stop-hover: adjust-color($base-color, $red: -13, $green: -15, $blue: -18); - $second-stop-hover: adjust-color($base-color, $red: -66, $green: -62, $blue: -51); - $third-stop-hover: adjust-color($base-color, $red: -93, $green: -85, $blue: -66); - $fourth-stop-hover: adjust-color($base-color, $red: -86, $green: -80, $blue: -63); - - @if $grayscale == true { - $first-stop-hover: grayscale($first-stop-hover); - $second-stop-hover: grayscale($second-stop-hover); - $third-stop-hover: grayscale($third-stop-hover); - $fourth-stop-hover: grayscale($fourth-stop-hover); - } - - cursor: pointer; - @include linear-gradient(top, $first-stop-hover 0%, - $second-stop-hover 50%, - $third-stop-hover 50%, - $fourth-stop-hover 100%); - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $inset-shadow-active: adjust-color($base-color, $red: -111, $green: -116, $blue: -122); - - @if $grayscale == true { - $inset-shadow-active: grayscale($inset-shadow-active); - } - - box-shadow: inset 0 0 20px 0 $inset-shadow-active; - } -} - - -// Pill Button -//************************************************************************// -@mixin pill($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - $border-bottom: adjust-color($base-color, $hue: 8, $saturation: -11%, $lightness: -26%); - $border-sides: adjust-color($base-color, $hue: 4, $saturation: -21%, $lightness: -21%); - $border-top: adjust-color($base-color, $hue: -1, $saturation: -30%, $lightness: -15%); - $inset-shadow: adjust-color($base-color, $hue: -1, $saturation: -1%, $lightness: 7%); - $stop-gradient: adjust-color($base-color, $hue: 8, $saturation: 14%, $lightness: -10%); - $text-shadow: adjust-color($base-color, $hue: 5, $saturation: -19%, $lightness: -15%); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%); - } - - @if $grayscale == true { - $border-bottom: grayscale($border-bottom); - $border-sides: grayscale($border-sides); - $border-top: grayscale($border-top); - $inset-shadow: grayscale($inset-shadow); - $stop-gradient: grayscale($stop-gradient); - $text-shadow: grayscale($text-shadow); - } - - border: 1px solid $border-top; - border-color: $border-top $border-sides $border-bottom; - border-radius: 16px; - box-shadow: inset 0 1px 0 0 $inset-shadow; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: normal; - line-height: 1; - @include linear-gradient ($base-color, $stop-gradient); - padding: $padding; - text-align: center; - text-decoration: none; - text-shadow: 0 -1px 1px $text-shadow; - background-clip: padding-box; - - &:hover:not(:disabled) { - $base-color-hover: adjust-color($base-color, $lightness: -4.5%); - $border-bottom: adjust-color($base-color, $hue: 8, $saturation: 13.5%, $lightness: -32%); - $border-sides: adjust-color($base-color, $hue: 4, $saturation: -2%, $lightness: -27%); - $border-top: adjust-color($base-color, $hue: -1, $saturation: -17%, $lightness: -21%); - $inset-shadow-hover: adjust-color($base-color, $saturation: -1%, $lightness: 3%); - $stop-gradient-hover: adjust-color($base-color, $hue: 8, $saturation: -4%, $lightness: -15.5%); - $text-shadow-hover: adjust-color($base-color, $hue: 5, $saturation: -5%, $lightness: -22%); - - @if $grayscale == true { - $base-color-hover: grayscale($base-color-hover); - $border-bottom: grayscale($border-bottom); - $border-sides: grayscale($border-sides); - $border-top: grayscale($border-top); - $inset-shadow-hover: grayscale($inset-shadow-hover); - $stop-gradient-hover: grayscale($stop-gradient-hover); - $text-shadow-hover: grayscale($text-shadow-hover); - } - - border: 1px solid $border-top; - border-color: $border-top $border-sides $border-bottom; - box-shadow: inset 0 1px 0 0 $inset-shadow-hover; - cursor: pointer; - @include linear-gradient ($base-color-hover, $stop-gradient-hover); - text-shadow: 0 -1px 1px $text-shadow-hover; - background-clip: padding-box; - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $active-color: adjust-color($base-color, $hue: 4, $saturation: -12%, $lightness: -10%); - $border-active: adjust-color($base-color, $hue: 6, $saturation: -2.5%, $lightness: -30%); - $border-bottom-active: adjust-color($base-color, $hue: 11, $saturation: 6%, $lightness: -31%); - $inset-shadow-active: adjust-color($base-color, $hue: 9, $saturation: 2%, $lightness: -21.5%); - $text-shadow-active: adjust-color($base-color, $hue: 5, $saturation: -12%, $lightness: -21.5%); - - @if $grayscale == true { - $active-color: grayscale($active-color); - $border-active: grayscale($border-active); - $border-bottom-active: grayscale($border-bottom-active); - $inset-shadow-active: grayscale($inset-shadow-active); - $text-shadow-active: grayscale($text-shadow-active); - } - - background: $active-color; - border: 1px solid $border-active; - border-bottom: 1px solid $border-bottom-active; - box-shadow: inset 0 0 6px 3px $inset-shadow-active; - text-shadow: 0 -1px 1px $text-shadow-active; - } -} - - - -// Flat Button -//************************************************************************// -@mixin flat($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - } - - background-color: $base-color; - border-radius: 3px; - border: none; - color: $color; - display: inline-block; - font-size: inherit; - font-weight: bold; - padding: 7px 18px; - text-decoration: none; - background-clip: padding-box; - - &:hover:not(:disabled){ - $base-color-hover: adjust-color($base-color, $saturation: 4%, $lightness: 5%); - - @if $grayscale == true { - $base-color-hover: grayscale($base-color-hover); - } - - background-color: $base-color-hover; - cursor: pointer; - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $base-color-active: adjust-color($base-color, $saturation: -4%, $lightness: -5%); - - @if $grayscale == true { - $base-color-active: grayscale($base-color-active); - } - - background-color: $base-color-active; - cursor: pointer; - } -} diff --git a/docs/_css/bourbon/addons/_clearfix.scss b/docs/_css/bourbon/addons/_clearfix.scss deleted file mode 100644 index 783cfbc7922..00000000000 --- a/docs/_css/bourbon/addons/_clearfix.scss +++ /dev/null @@ -1,23 +0,0 @@ -// Modern micro clearfix provides an easy way to contain floats without adding additional markup. -// -// Example usage: -// -// // Contain all floats within .wrapper -// .wrapper { -// @include clearfix; -// .content, -// .sidebar { -// float : left; -// } -// } - -@mixin clearfix { - &:after { - content:""; - display:table; - clear:both; - } -} - -// Acknowledgements -// Beat *that* clearfix: [Thierry Koblentz](http://www.css-101.org/articles/clearfix/latest-new-clearfix-so-far.php) diff --git a/docs/_css/bourbon/addons/_directional-values.scss b/docs/_css/bourbon/addons/_directional-values.scss deleted file mode 100644 index 742f1031a48..00000000000 --- a/docs/_css/bourbon/addons/_directional-values.scss +++ /dev/null @@ -1,111 +0,0 @@ -// directional-property mixins are shorthands -// for writing properties like the following -// -// @include margin(null 0 10px); -// ------ -// margin-right: 0; -// margin-bottom: 10px; -// margin-left: 0; -// -// - or - -// -// @include border-style(dotted null); -// ------ -// border-top-style: dotted; -// border-bottom-style: dotted; -// -// ------ -// -// Note: You can also use false instead of null - -@function collapse-directionals($vals) { - $output: null; - - $A: nth( $vals, 1 ); - $B: if( length($vals) < 2, $A, nth($vals, 2)); - $C: if( length($vals) < 3, $A, nth($vals, 3)); - $D: if( length($vals) < 2, $A, nth($vals, if( length($vals) < 4, 2, 4) )); - - @if $A == 0 { $A: 0 } - @if $B == 0 { $B: 0 } - @if $C == 0 { $C: 0 } - @if $D == 0 { $D: 0 } - - @if $A == $B and $A == $C and $A == $D { $output: $A } - @else if $A == $C and $B == $D { $output: $A $B } - @else if $B == $D { $output: $A $B $C } - @else { $output: $A $B $C $D } - - @return $output; -} - -@function contains-falsy($list) { - @each $item in $list { - @if not $item { - @return true; - } - } - - @return false; -} - -@mixin directional-property($pre, $suf, $vals) { - // Property Names - $top: $pre + "-top" + if($suf, "-#{$suf}", ""); - $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", ""); - $left: $pre + "-left" + if($suf, "-#{$suf}", ""); - $right: $pre + "-right" + if($suf, "-#{$suf}", ""); - $all: $pre + if($suf, "-#{$suf}", ""); - - $vals: collapse-directionals($vals); - - @if contains-falsy($vals) { - @if nth($vals, 1) { #{$top}: nth($vals, 1); } - - @if length($vals) == 1 { - @if nth($vals, 1) { #{$right}: nth($vals, 1); } - } @else { - @if nth($vals, 2) { #{$right}: nth($vals, 2); } - } - - // prop: top/bottom right/left - @if length($vals) == 2 { - @if nth($vals, 1) { #{$bottom}: nth($vals, 1); } - @if nth($vals, 2) { #{$left}: nth($vals, 2); } - - // prop: top right/left bottom - } @else if length($vals) == 3 { - @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } - @if nth($vals, 2) { #{$left}: nth($vals, 2); } - - // prop: top right bottom left - } @else if length($vals) == 4 { - @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } - @if nth($vals, 4) { #{$left}: nth($vals, 4); } - } - - // prop: top/right/bottom/left - } @else { - #{$all}: $vals; - } -} - -@mixin margin($vals...) { - @include directional-property(margin, false, $vals...); -} - -@mixin padding($vals...) { - @include directional-property(padding, false, $vals...); -} - -@mixin border-style($vals...) { - @include directional-property(border, style, $vals...); -} - -@mixin border-color($vals...) { - @include directional-property(border, color, $vals...); -} - -@mixin border-width($vals...) { - @include directional-property(border, width, $vals...); -} diff --git a/docs/_css/bourbon/addons/_ellipsis.scss b/docs/_css/bourbon/addons/_ellipsis.scss deleted file mode 100644 index a8ea2a4a867..00000000000 --- a/docs/_css/bourbon/addons/_ellipsis.scss +++ /dev/null @@ -1,7 +0,0 @@ -@mixin ellipsis($width: 100%) { - display: inline-block; - max-width: $width; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} diff --git a/docs/_css/bourbon/addons/_font-family.scss b/docs/_css/bourbon/addons/_font-family.scss deleted file mode 100644 index 31f5d9ca75c..00000000000 --- a/docs/_css/bourbon/addons/_font-family.scss +++ /dev/null @@ -1,5 +0,0 @@ -$georgia: Georgia, Cambria, "Times New Roman", Times, serif; -$helvetica: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; -$lucida-grande: "Lucida Grande", Tahoma, Verdana, Arial, sans-serif; -$monospace: "Bitstream Vera Sans Mono", Consolas, Courier, monospace; -$verdana: Verdana, Geneva, sans-serif; diff --git a/docs/_css/bourbon/addons/_hide-text.scss b/docs/_css/bourbon/addons/_hide-text.scss deleted file mode 100644 index fc7943811d3..00000000000 --- a/docs/_css/bourbon/addons/_hide-text.scss +++ /dev/null @@ -1,10 +0,0 @@ -@mixin hide-text { - overflow: hidden; - - &:before { - content: ""; - display: block; - width: 0; - height: 100%; - } -} diff --git a/docs/_css/bourbon/addons/_html5-input-types.scss b/docs/_css/bourbon/addons/_html5-input-types.scss deleted file mode 100644 index 9e9324ae0a7..00000000000 --- a/docs/_css/bourbon/addons/_html5-input-types.scss +++ /dev/null @@ -1,86 +0,0 @@ -//************************************************************************// -// Generate a variable ($all-text-inputs) with a list of all html5 -// input types that have a text-based input, excluding textarea. -// http://diveintohtml5.org/forms.html -//************************************************************************// -$inputs-list: 'input[type="email"]', - 'input[type="number"]', - 'input[type="password"]', - 'input[type="search"]', - 'input[type="tel"]', - 'input[type="text"]', - 'input[type="url"]', - - // Webkit & Gecko may change the display of these in the future - 'input[type="color"]', - 'input[type="date"]', - 'input[type="datetime"]', - 'input[type="datetime-local"]', - 'input[type="month"]', - 'input[type="time"]', - 'input[type="week"]'; - -// Bare inputs -//************************************************************************// -$all-text-inputs: assign-inputs($inputs-list); - -// Hover Pseudo-class -//************************************************************************// -$all-text-inputs-hover: assign-inputs($inputs-list, hover); - -// Focus Pseudo-class -//************************************************************************// -$all-text-inputs-focus: assign-inputs($inputs-list, focus); - - - -// You must use interpolation on the variable: -// #{$all-text-inputs} -// #{$all-text-inputs-hover} -// #{$all-text-inputs-focus} - -// Example -//************************************************************************// -// #{$all-text-inputs}, textarea { -// border: 1px solid red; -// } - - - -//************************************************************************// -// Generate a variable ($all-button-inputs) with a list of all html5 -// input types that have a button-based input, excluding button. -//************************************************************************// -$inputs-button-list: 'input[type="button"]', - 'input[type="reset"]', - 'input[type="submit"]'; - -// Bare inputs -//************************************************************************// -$all-button-inputs: assign-inputs($inputs-button-list); - -// Hover Pseudo-class -//************************************************************************// -$all-button-inputs-hover: assign-inputs($inputs-button-list, hover); - -// Focus Pseudo-class -//************************************************************************// -$all-button-inputs-focus: assign-inputs($inputs-button-list, focus); - -// Active Pseudo-class -//************************************************************************// -$all-button-inputs-active: assign-inputs($inputs-button-list, active); - - - -// You must use interpolation on the variable: -// #{$all-button-inputs} -// #{$all-button-inputs-hover} -// #{$all-button-inputs-focus} -// #{$all-button-inputs-active} - -// Example -//************************************************************************// -// #{$all-button-inputs}, button { -// border: 1px solid red; -// } diff --git a/docs/_css/bourbon/addons/_position.scss b/docs/_css/bourbon/addons/_position.scss deleted file mode 100644 index 7de75182bc0..00000000000 --- a/docs/_css/bourbon/addons/_position.scss +++ /dev/null @@ -1,32 +0,0 @@ -@mixin position ($position: relative, $coordinates: null null null null) { - - @if type-of($position) == list { - $coordinates: $position; - $position: relative; - } - - $coordinates: unpack($coordinates); - - $top: nth($coordinates, 1); - $right: nth($coordinates, 2); - $bottom: nth($coordinates, 3); - $left: nth($coordinates, 4); - - position: $position; - - @if ($top and $top == auto) or (type-of($top) == number) { - top: $top; - } - - @if ($right and $right == auto) or (type-of($right) == number) { - right: $right; - } - - @if ($bottom and $bottom == auto) or (type-of($bottom) == number) { - bottom: $bottom; - } - - @if ($left and $left == auto) or (type-of($left) == number) { - left: $left; - } -} diff --git a/docs/_css/bourbon/addons/_prefixer.scss b/docs/_css/bourbon/addons/_prefixer.scss deleted file mode 100644 index c32f502758f..00000000000 --- a/docs/_css/bourbon/addons/_prefixer.scss +++ /dev/null @@ -1,45 +0,0 @@ -//************************************************************************// -// Example: @include prefixer(border-radius, $radii, webkit ms spec); -//************************************************************************// -// Variables located in /settings/_prefixer.scss - -@mixin prefixer ($property, $value, $prefixes) { - @each $prefix in $prefixes { - @if $prefix == webkit { - @if $prefix-for-webkit { - -webkit-#{$property}: $value; - } - } - @else if $prefix == moz { - @if $prefix-for-mozilla { - -moz-#{$property}: $value; - } - } - @else if $prefix == ms { - @if $prefix-for-microsoft { - -ms-#{$property}: $value; - } - } - @else if $prefix == o { - @if $prefix-for-opera { - -o-#{$property}: $value; - } - } - @else if $prefix == spec { - @if $prefix-for-spec { - #{$property}: $value; - } - } - @else { - @warn "Unrecognized prefix: #{$prefix}"; - } - } -} - -@mixin disable-prefix-for-all() { - $prefix-for-webkit: false !global; - $prefix-for-mozilla: false !global; - $prefix-for-microsoft: false !global; - $prefix-for-opera: false !global; - $prefix-for-spec: false !global; -} diff --git a/docs/_css/bourbon/addons/_retina-image.scss b/docs/_css/bourbon/addons/_retina-image.scss deleted file mode 100644 index 3995c1970a6..00000000000 --- a/docs/_css/bourbon/addons/_retina-image.scss +++ /dev/null @@ -1,31 +0,0 @@ -@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x, $asset-pipeline: $asset-pipeline) { - @if $asset-pipeline { - background-image: image-url("#{$filename}.#{$extension}"); - } - @else { - background-image: url("#{$filename}.#{$extension}"); - } - - @include hidpi { - @if $asset-pipeline { - @if $retina-filename { - background-image: image-url("#{$retina-filename}.#{$extension}"); - } - @else { - background-image: image-url("#{$filename}#{$retina-suffix}.#{$extension}"); - } - } - - @else { - @if $retina-filename { - background-image: url("#{$retina-filename}.#{$extension}"); - } - @else { - background-image: url("#{$filename}#{$retina-suffix}.#{$extension}"); - } - } - - background-size: $background-size; - - } -} diff --git a/docs/_css/bourbon/addons/_size.scss b/docs/_css/bourbon/addons/_size.scss deleted file mode 100644 index a8653799a7e..00000000000 --- a/docs/_css/bourbon/addons/_size.scss +++ /dev/null @@ -1,16 +0,0 @@ -@mixin size($size) { - $height: nth($size, 1); - $width: $height; - - @if length($size) > 1 { - $height: nth($size, 2); - } - - @if $height == auto or (type-of($height) == number and not unitless($height)) { - height: $height; - } - - @if $width == auto or (type-of($width) == number and not unitless($width)) { - width: $width; - } -} diff --git a/docs/_css/bourbon/addons/_timing-functions.scss b/docs/_css/bourbon/addons/_timing-functions.scss deleted file mode 100644 index 5ecc6f9dcf9..00000000000 --- a/docs/_css/bourbon/addons/_timing-functions.scss +++ /dev/null @@ -1,32 +0,0 @@ -// CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie) -// Timing functions are the same as demo'ed here: http://jqueryui.com/resources/demos/effect/easing.html - -// EASE IN -$ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530); -$ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190); -$ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220); -$ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060); -$ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715); -$ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035); -$ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335); -$ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045); - -// EASE OUT -$ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940); -$ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000); -$ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000); -$ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000); -$ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000); -$ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000); -$ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000); -$ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275); - -// EASE IN OUT -$ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955); -$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000); -$ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000); -$ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000); -$ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950); -$ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000); -$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860); -$ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550); diff --git a/docs/_css/bourbon/addons/_triangle.scss b/docs/_css/bourbon/addons/_triangle.scss deleted file mode 100644 index 573954e41e3..00000000000 --- a/docs/_css/bourbon/addons/_triangle.scss +++ /dev/null @@ -1,83 +0,0 @@ -@mixin triangle ($size, $color, $direction) { - height: 0; - width: 0; - - $width: nth($size, 1); - $height: nth($size, length($size)); - - $foreground-color: nth($color, 1); - $background-color: if(length($color) == 2, nth($color, 2), transparent); - - @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) { - - $width: $width / 2; - $height: if(length($size) > 1, $height, $height/2); - - @if $direction == up { - border-left: $width solid $background-color; - border-right: $width solid $background-color; - border-bottom: $height solid $foreground-color; - - } @else if $direction == right { - border-top: $width solid $background-color; - border-bottom: $width solid $background-color; - border-left: $height solid $foreground-color; - - } @else if $direction == down { - border-left: $width solid $background-color; - border-right: $width solid $background-color; - border-top: $height solid $foreground-color; - - } @else if $direction == left { - border-top: $width solid $background-color; - border-bottom: $width solid $background-color; - border-right: $height solid $foreground-color; - } - } - - @else if ($direction == up-right) or ($direction == up-left) { - border-top: $height solid $foreground-color; - - @if $direction == up-right { - border-left: $width solid $background-color; - - } @else if $direction == up-left { - border-right: $width solid $background-color; - } - } - - @else if ($direction == down-right) or ($direction == down-left) { - border-bottom: $height solid $foreground-color; - - @if $direction == down-right { - border-left: $width solid $background-color; - - } @else if $direction == down-left { - border-right: $width solid $background-color; - } - } - - @else if ($direction == inset-up) { - border-width: $height $width; - border-style: solid; - border-color: $background-color $background-color $foreground-color; - } - - @else if ($direction == inset-down) { - border-width: $height $width; - border-style: solid; - border-color: $foreground-color $background-color $background-color; - } - - @else if ($direction == inset-right) { - border-width: $width $height; - border-style: solid; - border-color: $background-color $background-color $background-color $foreground-color; - } - - @else if ($direction == inset-left) { - border-width: $width $height; - border-style: solid; - border-color: $background-color $foreground-color $background-color $background-color; - } -} diff --git a/docs/_css/bourbon/addons/_word-wrap.scss b/docs/_css/bourbon/addons/_word-wrap.scss deleted file mode 100644 index 9734a597cd0..00000000000 --- a/docs/_css/bourbon/addons/_word-wrap.scss +++ /dev/null @@ -1,8 +0,0 @@ -@mixin word-wrap($wrap: break-word) { - word-wrap: $wrap; - - @if $wrap == break-word { - overflow-wrap: break-word; - word-break: break-all; - } -} diff --git a/docs/_css/bourbon/css3/_animation.scss b/docs/_css/bourbon/css3/_animation.scss deleted file mode 100644 index 08c3dbf157c..00000000000 --- a/docs/_css/bourbon/css3/_animation.scss +++ /dev/null @@ -1,52 +0,0 @@ -// http://www.w3.org/TR/css3-animations/#the-animation-name-property- -// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties. - -// Official animation shorthand property. -@mixin animation ($animations...) { - @include prefixer(animation, $animations, webkit moz spec); -} - -// Individual Animation Properties -@mixin animation-name ($names...) { - @include prefixer(animation-name, $names, webkit moz spec); -} - - -@mixin animation-duration ($times...) { - @include prefixer(animation-duration, $times, webkit moz spec); -} - - -@mixin animation-timing-function ($motions...) { -// ease | linear | ease-in | ease-out | ease-in-out - @include prefixer(animation-timing-function, $motions, webkit moz spec); -} - - -@mixin animation-iteration-count ($values...) { -// infinite | - @include prefixer(animation-iteration-count, $values, webkit moz spec); -} - - -@mixin animation-direction ($directions...) { -// normal | alternate - @include prefixer(animation-direction, $directions, webkit moz spec); -} - - -@mixin animation-play-state ($states...) { -// running | paused - @include prefixer(animation-play-state, $states, webkit moz spec); -} - - -@mixin animation-delay ($times...) { - @include prefixer(animation-delay, $times, webkit moz spec); -} - - -@mixin animation-fill-mode ($modes...) { -// none | forwards | backwards | both - @include prefixer(animation-fill-mode, $modes, webkit moz spec); -} diff --git a/docs/_css/bourbon/css3/_appearance.scss b/docs/_css/bourbon/css3/_appearance.scss deleted file mode 100644 index 3eb16e45de7..00000000000 --- a/docs/_css/bourbon/css3/_appearance.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin appearance ($value) { - @include prefixer(appearance, $value, webkit moz ms o spec); -} diff --git a/docs/_css/bourbon/css3/_backface-visibility.scss b/docs/_css/bourbon/css3/_backface-visibility.scss deleted file mode 100644 index 1161fe60dd1..00000000000 --- a/docs/_css/bourbon/css3/_backface-visibility.scss +++ /dev/null @@ -1,6 +0,0 @@ -//************************************************************************// -// Backface-visibility mixin -//************************************************************************// -@mixin backface-visibility($visibility) { - @include prefixer(backface-visibility, $visibility, webkit spec); -} diff --git a/docs/_css/bourbon/css3/_background-image.scss b/docs/_css/bourbon/css3/_background-image.scss deleted file mode 100644 index 6abe88be9a5..00000000000 --- a/docs/_css/bourbon/css3/_background-image.scss +++ /dev/null @@ -1,42 +0,0 @@ -//************************************************************************// -// Background-image property for adding multiple background images with -// gradients, or for stringing multiple gradients together. -//************************************************************************// - -@mixin background-image($images...) { - $webkit-images: (); - $spec-images: (); - - @each $image in $images { - $webkit-image: (); - $spec-image: (); - - @if (type-of($image) == string) { - $url-str: str-slice($image, 0, 3); - $gradient-type: str-slice($image, 0, 6); - - @if $url-str == "url" { - $webkit-image: $image; - $spec-image: $image; - } - - @else if $gradient-type == "linear" { - $gradients: _linear-gradient-parser($image); - $webkit-image: map-get($gradients, webkit-image); - $spec-image: map-get($gradients, spec-image); - } - - @else if $gradient-type == "radial" { - $gradients: _radial-gradient-parser($image); - $webkit-image: map-get($gradients, webkit-image); - $spec-image: map-get($gradients, spec-image); - } - } - - $webkit-images: append($webkit-images, $webkit-image, comma); - $spec-images: append($spec-images, $spec-image, comma); - } - - background-image: $webkit-images; - background-image: $spec-images; -} diff --git a/docs/_css/bourbon/css3/_background.scss b/docs/_css/bourbon/css3/_background.scss deleted file mode 100644 index 9bce9308bf9..00000000000 --- a/docs/_css/bourbon/css3/_background.scss +++ /dev/null @@ -1,55 +0,0 @@ -//************************************************************************// -// Background property for adding multiple backgrounds using shorthand -// notation. -//************************************************************************// - -@mixin background($backgrounds...) { - $webkit-backgrounds: (); - $spec-backgrounds: (); - - @each $background in $backgrounds { - $webkit-background: (); - $spec-background: (); - $background-type: type-of($background); - - @if $background-type == string or list { - $background-str: if($background-type == list, nth($background, 1), $background); - - $url-str: str-slice($background-str, 0, 3); - $gradient-type: str-slice($background-str, 0, 6); - - @if $url-str == "url" { - $webkit-background: $background; - $spec-background: $background; - } - - @else if $gradient-type == "linear" { - $gradients: _linear-gradient-parser("#{$background}"); - $webkit-background: map-get($gradients, webkit-image); - $spec-background: map-get($gradients, spec-image); - } - - @else if $gradient-type == "radial" { - $gradients: _radial-gradient-parser("#{$background}"); - $webkit-background: map-get($gradients, webkit-image); - $spec-background: map-get($gradients, spec-image); - } - - @else { - $webkit-background: $background; - $spec-background: $background; - } - } - - @else { - $webkit-background: $background; - $spec-background: $background; - } - - $webkit-backgrounds: append($webkit-backgrounds, $webkit-background, comma); - $spec-backgrounds: append($spec-backgrounds, $spec-background, comma); - } - - background: $webkit-backgrounds; - background: $spec-backgrounds; -} diff --git a/docs/_css/bourbon/css3/_border-image.scss b/docs/_css/bourbon/css3/_border-image.scss deleted file mode 100644 index e338c2dcd24..00000000000 --- a/docs/_css/bourbon/css3/_border-image.scss +++ /dev/null @@ -1,59 +0,0 @@ -@mixin border-image($borders...) { - $webkit-borders: (); - $spec-borders: (); - - @each $border in $borders { - $webkit-border: (); - $spec-border: (); - $border-type: type-of($border); - - @if $border-type == string or list { - $border-str: if($border-type == list, nth($border, 1), $border); - - $url-str: str-slice($border-str, 0, 3); - $gradient-type: str-slice($border-str, 0, 6); - - @if $url-str == "url" { - $webkit-border: $border; - $spec-border: $border; - } - - @else if $gradient-type == "linear" { - $gradients: _linear-gradient-parser("#{$border}"); - $webkit-border: map-get($gradients, webkit-image); - $spec-border: map-get($gradients, spec-image); - } - - @else if $gradient-type == "radial" { - $gradients: _radial-gradient-parser("#{$border}"); - $webkit-border: map-get($gradients, webkit-image); - $spec-border: map-get($gradients, spec-image); - } - - @else { - $webkit-border: $border; - $spec-border: $border; - } - } - - @else { - $webkit-border: $border; - $spec-border: $border; - } - - $webkit-borders: append($webkit-borders, $webkit-border, comma); - $spec-borders: append($spec-borders, $spec-border, comma); - } - - -webkit-border-image: $webkit-borders; - border-image: $spec-borders; - border-style: solid; -} - -//Examples: -// @include border-image(url("image.png")); -// @include border-image(url("image.png") 20 stretch); -// @include border-image(linear-gradient(45deg, orange, yellow)); -// @include border-image(linear-gradient(45deg, orange, yellow) stretch); -// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round); -// @include border-image(radial-gradient(top, cover, orange, yellow, orange)); diff --git a/docs/_css/bourbon/css3/_border-radius.scss b/docs/_css/bourbon/css3/_border-radius.scss deleted file mode 100644 index 7c171901090..00000000000 --- a/docs/_css/bourbon/css3/_border-radius.scss +++ /dev/null @@ -1,22 +0,0 @@ -//************************************************************************// -// Shorthand Border-radius mixins -//************************************************************************// -@mixin border-top-radius($radii) { - @include prefixer(border-top-left-radius, $radii, spec); - @include prefixer(border-top-right-radius, $radii, spec); -} - -@mixin border-bottom-radius($radii) { - @include prefixer(border-bottom-left-radius, $radii, spec); - @include prefixer(border-bottom-right-radius, $radii, spec); -} - -@mixin border-left-radius($radii) { - @include prefixer(border-top-left-radius, $radii, spec); - @include prefixer(border-bottom-left-radius, $radii, spec); -} - -@mixin border-right-radius($radii) { - @include prefixer(border-top-right-radius, $radii, spec); - @include prefixer(border-bottom-right-radius, $radii, spec); -} diff --git a/docs/_css/bourbon/css3/_box-sizing.scss b/docs/_css/bourbon/css3/_box-sizing.scss deleted file mode 100644 index f07e1d412e3..00000000000 --- a/docs/_css/bourbon/css3/_box-sizing.scss +++ /dev/null @@ -1,4 +0,0 @@ -@mixin box-sizing ($box) { -// content-box | border-box | inherit - @include prefixer(box-sizing, $box, webkit moz spec); -} diff --git a/docs/_css/bourbon/css3/_calc.scss b/docs/_css/bourbon/css3/_calc.scss deleted file mode 100644 index 94d7e4cef3c..00000000000 --- a/docs/_css/bourbon/css3/_calc.scss +++ /dev/null @@ -1,4 +0,0 @@ -@mixin calc($property, $value) { - #{$property}: -webkit-calc(#{$value}); - #{$property}: calc(#{$value}); -} diff --git a/docs/_css/bourbon/css3/_columns.scss b/docs/_css/bourbon/css3/_columns.scss deleted file mode 100644 index 96f601c1a81..00000000000 --- a/docs/_css/bourbon/css3/_columns.scss +++ /dev/null @@ -1,47 +0,0 @@ -@mixin columns($arg: auto) { -// || - @include prefixer(columns, $arg, webkit moz spec); -} - -@mixin column-count($int: auto) { -// auto || integer - @include prefixer(column-count, $int, webkit moz spec); -} - -@mixin column-gap($length: normal) { -// normal || length - @include prefixer(column-gap, $length, webkit moz spec); -} - -@mixin column-fill($arg: auto) { -// auto || length - @include prefixer(column-fill, $arg, webkit moz spec); -} - -@mixin column-rule($arg) { -// || || - @include prefixer(column-rule, $arg, webkit moz spec); -} - -@mixin column-rule-color($color) { - @include prefixer(column-rule-color, $color, webkit moz spec); -} - -@mixin column-rule-style($style: none) { -// none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid - @include prefixer(column-rule-style, $style, webkit moz spec); -} - -@mixin column-rule-width ($width: none) { - @include prefixer(column-rule-width, $width, webkit moz spec); -} - -@mixin column-span($arg: none) { -// none || all - @include prefixer(column-span, $arg, webkit moz spec); -} - -@mixin column-width($length: auto) { -// auto || length - @include prefixer(column-width, $length, webkit moz spec); -} diff --git a/docs/_css/bourbon/css3/_filter.scss b/docs/_css/bourbon/css3/_filter.scss deleted file mode 100644 index 8560d77676d..00000000000 --- a/docs/_css/bourbon/css3/_filter.scss +++ /dev/null @@ -1,5 +0,0 @@ -@mixin filter($function: none) { - // [ - @include prefixer(perspective, $depth, webkit moz spec); -} - -@mixin perspective-origin($value: 50% 50%) { - @include prefixer(perspective-origin, $value, webkit moz spec); -} diff --git a/docs/_css/bourbon/css3/_placeholder.scss b/docs/_css/bourbon/css3/_placeholder.scss deleted file mode 100644 index 5682fd097a5..00000000000 --- a/docs/_css/bourbon/css3/_placeholder.scss +++ /dev/null @@ -1,8 +0,0 @@ -@mixin placeholder { - $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input"; - @each $placeholder in $placeholders { - &:#{$placeholder}-placeholder { - @content; - } - } -} diff --git a/docs/_css/bourbon/css3/_radial-gradient.scss b/docs/_css/bourbon/css3/_radial-gradient.scss deleted file mode 100644 index 7a8c3765f16..00000000000 --- a/docs/_css/bourbon/css3/_radial-gradient.scss +++ /dev/null @@ -1,39 +0,0 @@ -// Requires Sass 3.1+ -@mixin radial-gradient($G1, $G2, - $G3: null, $G4: null, - $G5: null, $G6: null, - $G7: null, $G8: null, - $G9: null, $G10: null, - $pos: null, - $shape-size: null, - $fallback: null) { - - $data: _radial-arg-parser($G1, $G2, $pos, $shape-size); - $G1: nth($data, 1); - $G2: nth($data, 2); - $pos: nth($data, 3); - $shape-size: nth($data, 4); - - $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10; - - // Strip deprecated cover/contain for spec - $shape-size-spec: _shape-size-stripper($shape-size); - - // Set $G1 as the default fallback color - $first-color: nth($full, 1); - $fallback-color: nth($first-color, 1); - - @if (type-of($fallback) == color) or ($fallback == "transparent") { - $fallback-color: $fallback; - } - - // Add Commas and spaces - $shape-size: if($shape-size, '#{$shape-size}, ', null); - $pos: if($pos, '#{$pos}, ', null); - $pos-spec: if($pos, 'at #{$pos}', null); - $shape-size-spec: if(($shape-size-spec != ' ') and ($pos == null), '#{$shape-size-spec}, ', '#{$shape-size-spec} '); - - background-color: $fallback-color; - background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full})); - background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})"); -} diff --git a/docs/_css/bourbon/css3/_transform.scss b/docs/_css/bourbon/css3/_transform.scss deleted file mode 100644 index 8cc35963d55..00000000000 --- a/docs/_css/bourbon/css3/_transform.scss +++ /dev/null @@ -1,15 +0,0 @@ -@mixin transform($property: none) { -// none | - @include prefixer(transform, $property, webkit moz ms o spec); -} - -@mixin transform-origin($axes: 50%) { -// x-axis - left | center | right | length | % -// y-axis - top | center | bottom | length | % -// z-axis - length - @include prefixer(transform-origin, $axes, webkit moz ms o spec); -} - -@mixin transform-style ($style: flat) { - @include prefixer(transform-style, $style, webkit moz ms o spec); -} diff --git a/docs/_css/bourbon/css3/_transition.scss b/docs/_css/bourbon/css3/_transition.scss deleted file mode 100644 index 5ad4c0aed23..00000000000 --- a/docs/_css/bourbon/css3/_transition.scss +++ /dev/null @@ -1,77 +0,0 @@ -// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable. -// Example: @include transition (all 2s ease-in-out); -// @include transition (opacity 1s ease-in 2s, width 2s ease-out); -// @include transition-property (transform, opacity); - -@mixin transition ($properties...) { - // Fix for vendor-prefix transform property - $needs-prefixes: false; - $webkit: (); - $moz: (); - $spec: (); - - // Create lists for vendor-prefixed transform - @each $list in $properties { - @if nth($list, 1) == "transform" { - $needs-prefixes: true; - $list1: -webkit-transform; - $list2: -moz-transform; - $list3: (); - - @each $var in $list { - $list3: join($list3, $var); - - @if $var != "transform" { - $list1: join($list1, $var); - $list2: join($list2, $var); - } - } - - $webkit: append($webkit, $list1); - $moz: append($moz, $list2); - $spec: append($spec, $list3); - } - - // Create lists for non-prefixed transition properties - @else { - $webkit: append($webkit, $list, comma); - $moz: append($moz, $list, comma); - $spec: append($spec, $list, comma); - } - } - - @if $needs-prefixes { - -webkit-transition: $webkit; - -moz-transition: $moz; - transition: $spec; - } - @else { - @if length($properties) >= 1 { - @include prefixer(transition, $properties, webkit moz spec); - } - - @else { - $properties: all 0.15s ease-out 0s; - @include prefixer(transition, $properties, webkit moz spec); - } - } -} - -@mixin transition-property ($properties...) { - -webkit-transition-property: transition-property-names($properties, 'webkit'); - -moz-transition-property: transition-property-names($properties, 'moz'); - transition-property: transition-property-names($properties, false); -} - -@mixin transition-duration ($times...) { - @include prefixer(transition-duration, $times, webkit moz spec); -} - -@mixin transition-timing-function ($motions...) { -// ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier() - @include prefixer(transition-timing-function, $motions, webkit moz spec); -} - -@mixin transition-delay ($times...) { - @include prefixer(transition-delay, $times, webkit moz spec); -} diff --git a/docs/_css/bourbon/css3/_user-select.scss b/docs/_css/bourbon/css3/_user-select.scss deleted file mode 100644 index 1380aa8baa9..00000000000 --- a/docs/_css/bourbon/css3/_user-select.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin user-select($arg: none) { - @include prefixer(user-select, $arg, webkit moz ms spec); -} diff --git a/docs/_css/bourbon/functions/_assign.scss b/docs/_css/bourbon/functions/_assign.scss deleted file mode 100644 index 9a1db93ef74..00000000000 --- a/docs/_css/bourbon/functions/_assign.scss +++ /dev/null @@ -1,11 +0,0 @@ -@function assign-inputs($inputs, $pseudo: null) { - $list : (); - - @each $input in $inputs { - $input: unquote($input); - $input: if($pseudo, $input + ":" + $pseudo, $input); - $list: append($list, $input, comma); - } - - @return $list; -} \ No newline at end of file diff --git a/docs/_css/bourbon/functions/_color-lightness.scss b/docs/_css/bourbon/functions/_color-lightness.scss deleted file mode 100644 index 8c6df4e2564..00000000000 --- a/docs/_css/bourbon/functions/_color-lightness.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Programatically determines whether a color is light or dark -// Returns a boolean -// More details here http://robots.thoughtbot.com/closer-look-color-lightness - -@function is-light($hex-color) { - $-local-red: red(rgba($hex-color, 1.0)); - $-local-green: green(rgba($hex-color, 1.0)); - $-local-blue: blue(rgba($hex-color, 1.0)); - - $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255; - - @return $-local-lightness > .6; -} diff --git a/docs/_css/bourbon/functions/_flex-grid.scss b/docs/_css/bourbon/functions/_flex-grid.scss deleted file mode 100644 index 3bbd8665732..00000000000 --- a/docs/_css/bourbon/functions/_flex-grid.scss +++ /dev/null @@ -1,39 +0,0 @@ -// Flexible grid -@function flex-grid($columns, $container-columns: $fg-max-columns) { - $width: $columns * $fg-column + ($columns - 1) * $fg-gutter; - $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; - @return percentage($width / $container-width); -} - -// Flexible gutter -@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) { - $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; - @return percentage($gutter / $container-width); -} - -// The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function. -// This function takes the fluid grid equation (target / context = result) and uses columns to help define each. -// -// The calculation presumes that your column structure will be missing the last gutter: -// -// -- column -- gutter -- column -- gutter -- column -// -// $fg-column: 60px; // Column Width -// $fg-gutter: 25px; // Gutter Width -// $fg-max-columns: 12; // Total Columns For Main Container -// -// div { -// width: flex-grid(4); // returns (315px / 995px) = 31.65829%; -// margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%; -// -// p { -// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%; -// float: left; -// margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%; -// } -// -// blockquote { -// float: left; -// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%; -// } -// } \ No newline at end of file diff --git a/docs/_css/bourbon/functions/_golden-ratio.scss b/docs/_css/bourbon/functions/_golden-ratio.scss deleted file mode 100644 index 463d14a00c1..00000000000 --- a/docs/_css/bourbon/functions/_golden-ratio.scss +++ /dev/null @@ -1,3 +0,0 @@ -@function golden-ratio($value, $increment) { - @return modular-scale($value, $increment, $golden) -} diff --git a/docs/_css/bourbon/functions/_grid-width.scss b/docs/_css/bourbon/functions/_grid-width.scss deleted file mode 100644 index 8e63d83d602..00000000000 --- a/docs/_css/bourbon/functions/_grid-width.scss +++ /dev/null @@ -1,13 +0,0 @@ -@function grid-width($n) { - @return $n * $gw-column + ($n - 1) * $gw-gutter; -} - -// The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function. -// -// $gw-column: 100px; // Column Width -// $gw-gutter: 40px; // Gutter Width -// -// div { -// width: grid-width(4); // returns 520px; -// margin-left: $gw-gutter; // returns 40px; -// } diff --git a/docs/_css/bourbon/functions/_modular-scale.scss b/docs/_css/bourbon/functions/_modular-scale.scss deleted file mode 100644 index afc59eb954d..00000000000 --- a/docs/_css/bourbon/functions/_modular-scale.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Scaling Variables -$golden: 1.618; -$minor-second: 1.067; -$major-second: 1.125; -$minor-third: 1.2; -$major-third: 1.25; -$perfect-fourth: 1.333; -$augmented-fourth: 1.414; -$perfect-fifth: 1.5; -$minor-sixth: 1.6; -$major-sixth: 1.667; -$minor-seventh: 1.778; -$major-seventh: 1.875; -$octave: 2; -$major-tenth: 2.5; -$major-eleventh: 2.667; -$major-twelfth: 3; -$double-octave: 4; - -@function modular-scale($value, $increment, $ratio) { - $v1: nth($value, 1); - $v2: nth($value, length($value)); - $value: $v1; - - // scale $v2 to just above $v1 - @while $v2 > $v1 { - $v2: ($v2 / $ratio); // will be off-by-1 - } - @while $v2 < $v1 { - $v2: ($v2 * $ratio); // will fix off-by-1 - } - - // check AFTER scaling $v2 to prevent double-counting corner-case - $double-stranded: $v2 > $v1; - - @if $increment > 0 { - @for $i from 1 through $increment { - @if $double-stranded and ($v1 * $ratio) > $v2 { - $value: $v2; - $v2: ($v2 * $ratio); - } @else { - $v1: ($v1 * $ratio); - $value: $v1; - } - } - } - - @if $increment < 0 { - // adjust $v2 to just below $v1 - @if $double-stranded { - $v2: ($v2 / $ratio); - } - - @for $i from $increment through -1 { - @if $double-stranded and ($v1 / $ratio) < $v2 { - $value: $v2; - $v2: ($v2 / $ratio); - } @else { - $v1: ($v1 / $ratio); - $value: $v1; - } - } - } - - @return $value; -} diff --git a/docs/_css/bourbon/functions/_px-to-em.scss b/docs/_css/bourbon/functions/_px-to-em.scss deleted file mode 100644 index 4832245e455..00000000000 --- a/docs/_css/bourbon/functions/_px-to-em.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Convert pixels to ems -// eg. for a relational value of 12px write em(12) when the parent is 16px -// if the parent is another value say 24px write em(12, 24) - -@function em($pxval, $base: $em-base) { - @if not unitless($pxval) { - $pxval: strip-units($pxval); - } - @if not unitless($base) { - $base: strip-units($base); - } - @return ($pxval / $base) * 1em; -} diff --git a/docs/_css/bourbon/functions/_px-to-rem.scss b/docs/_css/bourbon/functions/_px-to-rem.scss deleted file mode 100644 index 96b244e4cb1..00000000000 --- a/docs/_css/bourbon/functions/_px-to-rem.scss +++ /dev/null @@ -1,15 +0,0 @@ -// Convert pixels to rems -// eg. for a relational value of 12px write rem(12) -// Assumes $em-base is the font-size of - -@function rem($pxval) { - @if not unitless($pxval) { - $pxval: strip-units($pxval); - } - - $base: $em-base; - @if not unitless($base) { - $base: strip-units($base); - } - @return ($pxval / $base) * 1rem; -} diff --git a/docs/_css/bourbon/functions/_strip-units.scss b/docs/_css/bourbon/functions/_strip-units.scss deleted file mode 100644 index 6afc6e601c0..00000000000 --- a/docs/_css/bourbon/functions/_strip-units.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Srtips the units from a value. e.g. 12px -> 12 - -@function strip-units($val) { - @return ($val / ($val * 0 + 1)); -} diff --git a/docs/_css/bourbon/functions/_tint-shade.scss b/docs/_css/bourbon/functions/_tint-shade.scss deleted file mode 100644 index f7172004ac6..00000000000 --- a/docs/_css/bourbon/functions/_tint-shade.scss +++ /dev/null @@ -1,9 +0,0 @@ -// Add percentage of white to a color -@function tint($color, $percent){ - @return mix(white, $color, $percent); -} - -// Add percentage of black to a color -@function shade($color, $percent){ - @return mix(black, $color, $percent); -} diff --git a/docs/_css/bourbon/functions/_transition-property-name.scss b/docs/_css/bourbon/functions/_transition-property-name.scss deleted file mode 100644 index 54cd4228112..00000000000 --- a/docs/_css/bourbon/functions/_transition-property-name.scss +++ /dev/null @@ -1,22 +0,0 @@ -// Return vendor-prefixed property names if appropriate -// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background -//************************************************************************// -@function transition-property-names($props, $vendor: false) { - $new-props: (); - - @each $prop in $props { - $new-props: append($new-props, transition-property-name($prop, $vendor), comma); - } - - @return $new-props; -} - -@function transition-property-name($prop, $vendor: false) { - // put other properties that need to be prefixed here aswell - @if $vendor and $prop == transform { - @return unquote('-'+$vendor+'-'+$prop); - } - @else { - @return $prop; - } -} \ No newline at end of file diff --git a/docs/_css/bourbon/functions/_unpack.scss b/docs/_css/bourbon/functions/_unpack.scss deleted file mode 100644 index 377596365c8..00000000000 --- a/docs/_css/bourbon/functions/_unpack.scss +++ /dev/null @@ -1,17 +0,0 @@ -// Convert shorthand to the 4-value syntax - -@function unpack($shorthand) { - @if length($shorthand) == 1 { - @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1); - } - @else if length($shorthand) == 2 { - @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2); - } - @else if length($shorthand) == 3 { - @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2); - } - @else { - @return $shorthand; - } -} - diff --git a/docs/_css/bourbon/helpers/_convert-units.scss b/docs/_css/bourbon/helpers/_convert-units.scss deleted file mode 100644 index 3443db397c2..00000000000 --- a/docs/_css/bourbon/helpers/_convert-units.scss +++ /dev/null @@ -1,15 +0,0 @@ -//************************************************************************// -// Helper function for str-to-num fn. -// Source: http://sassmeister.com/gist/9647408 -//************************************************************************// -@function _convert-units($number, $unit) { - $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax', 'deg', 'rad', 'grad', 'turn'; - $units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax, 1deg, 1rad, 1grad, 1turn; - $index: index($strings, $unit); - - @if not $index { - @warn "Unknown unit `#{$unit}`."; - @return false; - } - @return $number * nth($units, $index); -} diff --git a/docs/_css/bourbon/helpers/_gradient-positions-parser.scss b/docs/_css/bourbon/helpers/_gradient-positions-parser.scss deleted file mode 100644 index 07d30b6cf95..00000000000 --- a/docs/_css/bourbon/helpers/_gradient-positions-parser.scss +++ /dev/null @@ -1,13 +0,0 @@ -@function _gradient-positions-parser($gradient-type, $gradient-positions) { - @if $gradient-positions - and ($gradient-type == linear) - and (type-of($gradient-positions) != color) { - $gradient-positions: _linear-positions-parser($gradient-positions); - } - @else if $gradient-positions - and ($gradient-type == radial) - and (type-of($gradient-positions) != color) { - $gradient-positions: _radial-positions-parser($gradient-positions); - } - @return $gradient-positions; -} diff --git a/docs/_css/bourbon/helpers/_is-num.scss b/docs/_css/bourbon/helpers/_is-num.scss deleted file mode 100644 index 71459e1404a..00000000000 --- a/docs/_css/bourbon/helpers/_is-num.scss +++ /dev/null @@ -1,8 +0,0 @@ -//************************************************************************// -// Helper for linear-gradient-parser -//************************************************************************// -@function _is-num($char) { - $values: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0 1 2 3 4 5 6 7 8 9; - $index: index($values, $char); - @return if($index, true, false); -} diff --git a/docs/_css/bourbon/helpers/_linear-angle-parser.scss b/docs/_css/bourbon/helpers/_linear-angle-parser.scss deleted file mode 100644 index e0401ed8df1..00000000000 --- a/docs/_css/bourbon/helpers/_linear-angle-parser.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Private function for linear-gradient-parser -@function _linear-angle-parser($image, $first-val, $prefix, $suffix) { - $offset: null; - $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val)); - $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val)); - - @if ($unit-long == "grad") or - ($unit-long == "turn") { - $offset: if($unit-long == "grad", -100grad * 3, -0.75turn); - } - - @else if ($unit-short == "deg") or - ($unit-short == "rad") { - $offset: if($unit-short == "deg", -90 * 3, 1.6rad); - } - - @if $offset { - $num: _str-to-num($first-val); - - @return ( - webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix, - spec-image: $image - ); - } -} diff --git a/docs/_css/bourbon/helpers/_linear-gradient-parser.scss b/docs/_css/bourbon/helpers/_linear-gradient-parser.scss deleted file mode 100644 index 12bcdcda8fd..00000000000 --- a/docs/_css/bourbon/helpers/_linear-gradient-parser.scss +++ /dev/null @@ -1,41 +0,0 @@ -@function _linear-gradient-parser($image) { - $image: unquote($image); - $gradients: (); - $start: str-index($image, "("); - $end: str-index($image, ","); - $first-val: str-slice($image, $start + 1, $end - 1); - - $prefix: str-slice($image, 0, $start); - $suffix: str-slice($image, $end, str-length($image)); - - $has-multiple-vals: str-index($first-val, " "); - $has-single-position: unquote(_position-flipper($first-val) + ""); - $has-angle: _is-num(str-slice($first-val, 0, 0)); - - @if $has-multiple-vals { - $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals); - } - - @else if $has-single-position != "" { - $pos: unquote($has-single-position + ""); - - $gradients: ( - webkit-image: -webkit- + $image, - spec-image: $prefix + "to " + $pos + $suffix - ); - } - - @else if $has-angle { - // Rotate degree for webkit - $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix); - } - - @else { - $gradients: ( - webkit-image: -webkit- + $image, - spec-image: $image - ); - } - - @return $gradients; -} diff --git a/docs/_css/bourbon/helpers/_linear-positions-parser.scss b/docs/_css/bourbon/helpers/_linear-positions-parser.scss deleted file mode 100644 index 9d619301ef8..00000000000 --- a/docs/_css/bourbon/helpers/_linear-positions-parser.scss +++ /dev/null @@ -1,61 +0,0 @@ -@function _linear-positions-parser($pos) { - $type: type-of(nth($pos, 1)); - $spec: null; - $degree: null; - $side: null; - $corner: null; - $length: length($pos); - // Parse Side and corner positions - @if ($length > 1) { - @if nth($pos, 1) == "to" { // Newer syntax - $side: nth($pos, 2); - - @if $length == 2 { // eg. to top - // Swap for backwards compatibility - $degree: _position-flipper(nth($pos, 2)); - } - @else if $length == 3 { // eg. to top left - $corner: nth($pos, 3); - } - } - @else if $length == 2 { // Older syntax ("top left") - $side: _position-flipper(nth($pos, 1)); - $corner: _position-flipper(nth($pos, 2)); - } - - @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - $spec: to $side $corner; - } - @else if $length == 1 { - // Swap for backwards compatibility - @if $type == string { - $degree: $pos; - $spec: to _position-flipper($pos); - } - @else { - $degree: -270 - $pos; //rotate the gradient opposite from spec - $spec: $pos; - } - } - $degree: unquote($degree + ","); - $spec: unquote($spec + ","); - @return $degree $spec; -} - -@function _position-flipper($pos) { - @return if($pos == left, right, null) - if($pos == right, left, null) - if($pos == top, bottom, null) - if($pos == bottom, top, null); -} diff --git a/docs/_css/bourbon/helpers/_linear-side-corner-parser.scss b/docs/_css/bourbon/helpers/_linear-side-corner-parser.scss deleted file mode 100644 index 86ad88fbb7d..00000000000 --- a/docs/_css/bourbon/helpers/_linear-side-corner-parser.scss +++ /dev/null @@ -1,31 +0,0 @@ -// Private function for linear-gradient-parser -@function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) { - $val-1: str-slice($first-val, 0, $has-multiple-vals - 1 ); - $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val)); - $val-3: null; - $has-val-3: str-index($val-2, " "); - - @if $has-val-3 { - $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2)); - $val-2: str-slice($val-2, 0, $has-val-3 - 1); - } - - $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3); - $pos: unquote($pos + ""); - - // Use old spec for webkit - @if $val-1 == "to" { - @return ( - webkit-image: -webkit- + $prefix + $pos + $suffix, - spec-image: $image - ); - } - - // Bring the code up to spec - @else { - @return ( - webkit-image: -webkit- + $image, - spec-image: $prefix + "to " + $pos + $suffix - ); - } -} diff --git a/docs/_css/bourbon/helpers/_radial-arg-parser.scss b/docs/_css/bourbon/helpers/_radial-arg-parser.scss deleted file mode 100644 index a3a3704af5e..00000000000 --- a/docs/_css/bourbon/helpers/_radial-arg-parser.scss +++ /dev/null @@ -1,69 +0,0 @@ -@function _radial-arg-parser($G1, $G2, $pos, $shape-size) { - @each $value in $G1, $G2 { - $first-val: nth($value, 1); - $pos-type: type-of($first-val); - $spec-at-index: null; - - // Determine if spec was passed to mixin - @if type-of($value) == list { - $spec-at-index: if(index($value, at), index($value, at), false); - } - @if $spec-at-index { - @if $spec-at-index > 1 { - @for $i from 1 through ($spec-at-index - 1) { - $shape-size: $shape-size nth($value, $i); - } - @for $i from ($spec-at-index + 1) through length($value) { - $pos: $pos nth($value, $i); - } - } - @else if $spec-at-index == 1 { - @for $i from ($spec-at-index + 1) through length($value) { - $pos: $pos nth($value, $i); - } - } - $G1: null; - } - - // If not spec calculate correct values - @else { - @if ($pos-type != color) or ($first-val != "transparent") { - @if ($pos-type == number) - or ($first-val == "center") - or ($first-val == "top") - or ($first-val == "right") - or ($first-val == "bottom") - or ($first-val == "left") { - - $pos: $value; - - @if $pos == $G1 { - $G1: null; - } - } - - @else if - ($first-val == "ellipse") - or ($first-val == "circle") - or ($first-val == "closest-side") - or ($first-val == "closest-corner") - or ($first-val == "farthest-side") - or ($first-val == "farthest-corner") - or ($first-val == "contain") - or ($first-val == "cover") { - - $shape-size: $value; - - @if $value == $G1 { - $G1: null; - } - - @else if $value == $G2 { - $G2: null; - } - } - } - } - } - @return $G1, $G2, $pos, $shape-size; -} diff --git a/docs/_css/bourbon/helpers/_radial-gradient-parser.scss b/docs/_css/bourbon/helpers/_radial-gradient-parser.scss deleted file mode 100644 index 6dde50f0640..00000000000 --- a/docs/_css/bourbon/helpers/_radial-gradient-parser.scss +++ /dev/null @@ -1,50 +0,0 @@ -@function _radial-gradient-parser($image) { - $image: unquote($image); - $gradients: (); - $start: str-index($image, "("); - $end: str-index($image, ","); - $first-val: str-slice($image, $start + 1, $end - 1); - - $prefix: str-slice($image, 0, $start); - $suffix: str-slice($image, $end, str-length($image)); - - $is-spec-syntax: str-index($first-val, "at"); - - @if $is-spec-syntax and $is-spec-syntax > 1 { - $keyword: str-slice($first-val, 1, $is-spec-syntax - 2); - $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); - $pos: append($pos, $keyword, comma); - - $gradients: ( - webkit-image: -webkit- + $prefix + $pos + $suffix, - spec-image: $image - ) - } - - @else if $is-spec-syntax == 1 { - $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); - - $gradients: ( - webkit-image: -webkit- + $prefix + $pos + $suffix, - spec-image: $image - ) - } - - @else if str-index($image, "cover") or str-index($image, "contain") { - @warn "Radial-gradient needs to be updated to conform to latest spec."; - - $gradients: ( - webkit-image: null, - spec-image: $image - ) - } - - @else { - $gradients: ( - webkit-image: -webkit- + $image, - spec-image: $image - ) - } - - @return $gradients; -} diff --git a/docs/_css/bourbon/helpers/_radial-positions-parser.scss b/docs/_css/bourbon/helpers/_radial-positions-parser.scss deleted file mode 100644 index 6a5b4777781..00000000000 --- a/docs/_css/bourbon/helpers/_radial-positions-parser.scss +++ /dev/null @@ -1,18 +0,0 @@ -@function _radial-positions-parser($gradient-pos) { - $shape-size: nth($gradient-pos, 1); - $pos: nth($gradient-pos, 2); - $shape-size-spec: _shape-size-stripper($shape-size); - - $pre-spec: unquote(if($pos, "#{$pos}, ", null)) - unquote(if($shape-size, "#{$shape-size},", null)); - $pos-spec: if($pos, "at #{$pos}", null); - - $spec: "#{$shape-size-spec} #{$pos-spec}"; - - // Add comma - @if ($spec != ' ') { - $spec: "#{$spec}," - } - - @return $pre-spec $spec; -} diff --git a/docs/_css/bourbon/helpers/_render-gradients.scss b/docs/_css/bourbon/helpers/_render-gradients.scss deleted file mode 100644 index 5765676838d..00000000000 --- a/docs/_css/bourbon/helpers/_render-gradients.scss +++ /dev/null @@ -1,26 +0,0 @@ -// User for linear and radial gradients within background-image or border-image properties - -@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) { - $pre-spec: null; - $spec: null; - $vendor-gradients: null; - @if $gradient-type == linear { - @if $gradient-positions { - $pre-spec: nth($gradient-positions, 1); - $spec: nth($gradient-positions, 2); - } - } - @else if $gradient-type == radial { - $pre-spec: nth($gradient-positions, 1); - $spec: nth($gradient-positions, 2); - } - - @if $vendor { - $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients); - } - @else if $vendor == false { - $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})"; - $vendor-gradients: unquote($vendor-gradients); - } - @return $vendor-gradients; -} diff --git a/docs/_css/bourbon/helpers/_shape-size-stripper.scss b/docs/_css/bourbon/helpers/_shape-size-stripper.scss deleted file mode 100644 index ee5eda42205..00000000000 --- a/docs/_css/bourbon/helpers/_shape-size-stripper.scss +++ /dev/null @@ -1,10 +0,0 @@ -@function _shape-size-stripper($shape-size) { - $shape-size-spec: null; - @each $value in $shape-size { - @if ($value == "cover") or ($value == "contain") { - $value: null; - } - $shape-size-spec: "#{$shape-size-spec} #{$value}"; - } - @return $shape-size-spec; -} diff --git a/docs/_css/bourbon/helpers/_str-to-num.scss b/docs/_css/bourbon/helpers/_str-to-num.scss deleted file mode 100644 index b3d616824d3..00000000000 --- a/docs/_css/bourbon/helpers/_str-to-num.scss +++ /dev/null @@ -1,50 +0,0 @@ -//************************************************************************// -// Helper function for linear/radial-gradient-parsers. -// Source: http://sassmeister.com/gist/9647408 -//************************************************************************// -@function _str-to-num($string) { - // Matrices - $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'; - $numbers: 0 1 2 3 4 5 6 7 8 9; - - // Result - $result: 0; - $divider: 0; - $minus: false; - - // Looping through all characters - @for $i from 1 through str-length($string) { - $character: str-slice($string, $i, $i); - $index: index($strings, $character); - - @if $character == '-' { - $minus: true; - } - - @else if $character == '.' { - $divider: 1; - } - - @else { - @if not $index { - $result: if($minus, $result * -1, $result); - @return _convert-units($result, str-slice($string, $i)); - } - - $number: nth($numbers, $index); - - @if $divider == 0 { - $result: $result * 10; - } - - @else { - // Move the decimal dot to the left - $divider: $divider * 10; - $number: $number / $divider; - } - - $result: $result + $number; - } - } - @return if($minus, $result * -1, $result); -} diff --git a/docs/_css/bourbon/settings/_asset-pipeline.scss b/docs/_css/bourbon/settings/_asset-pipeline.scss deleted file mode 100644 index d481a6afb16..00000000000 --- a/docs/_css/bourbon/settings/_asset-pipeline.scss +++ /dev/null @@ -1 +0,0 @@ -$asset-pipeline: false !default; diff --git a/docs/_css/bourbon/settings/_prefixer.scss b/docs/_css/bourbon/settings/_prefixer.scss deleted file mode 100644 index ecab49fb542..00000000000 --- a/docs/_css/bourbon/settings/_prefixer.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Variable settings for /addons/prefixer.scss -$prefix-for-webkit: true !default; -$prefix-for-mozilla: true !default; -$prefix-for-microsoft: true !default; -$prefix-for-opera: true !default; -$prefix-for-spec: true !default; // required for keyframe mixin diff --git a/docs/_css/bourbon/settings/_px-to-em.scss b/docs/_css/bourbon/settings/_px-to-em.scss deleted file mode 100644 index f2f9a3e8dee..00000000000 --- a/docs/_css/bourbon/settings/_px-to-em.scss +++ /dev/null @@ -1 +0,0 @@ -$em-base: 16px !default; diff --git a/docs/_data/acknowledgements.yml b/docs/_data/acknowledgements.yml deleted file mode 100644 index 45e934230bf..00000000000 --- a/docs/_data/acknowledgements.yml +++ /dev/null @@ -1,697 +0,0 @@ ---- -- - '839' - - Aaron Franks - - Aaron Gelter - - Adam Bloomston - - Adam Krebs - - Adam Mark - - Adam Solove - - Adam Timberlake - - Adam Zapletal - - Ahmad Wali Sidiqi - - Alan Plum - - Alan Souza - - Alan deLevie - - Alastair Hole - - Alex - - Alex Boatwright - - Alex Boyd - - Alex Dajani - - Alex Lopatin - - Alex Mykyta - - Alex Pien - - Alex Smith - - Alex Zelenskiy - - Alexander Shtuchkin - - Alexander Solovyov - - Alexander Tseung - - Alexandre Gaudencio - - Alexey Raspopov - - Alexey Shamrin - - Ali Ukani - - Andre Z Sanchez - - Andreas Savvides - - Andreas Svensson - - Andres Kalle - - Andres Suarez - - Andrew Clark - - Andrew Cobby - - Andrew Davey - - Andrew Henderson - - Andrew Kulakov - - Andrew Rasmussen - - Andrew Sokolov - - Andrew Zich - - Andrey Popp - - Anthony van der Hoorn - - Anto Aravinth - - Antonio Ruberto - - Antti Ahti - - Anuj Tomar - - AoDev - - April Arcus - - Areeb Malik - - Aria Buckles - - Aria Stewart - - Arian Faurtosh - - Artem Nezvigin - - Austin Wright - - Ayman Osman - - Baraa Hamodi - - Bartosz Kaszubowski - - Basarat Ali Syed - - Battaile Fauber - - Beau Smith - - Ben Alpert - - Ben Anderson - - Ben Brooks - - Ben Foxall - - Ben Halpern - - Ben Jaffe - - Ben Moss - - Ben Newman - - Ben Ripkens - - Benjamin Keen - - Benjamin Leiken - - Benjamin Woodruff - - Benjy Cui - - Bill Blanchard - - Bill Fisher - - Blaine Hatab - - Blaine Kasten - - Bob Eagan - - Bob Ralian - - Bob Renwick - - Bobby - - Bojan Mihelac - - Bradley Spaulding - - Brandon Bloom - - Brandon Tilley - - Brenard Cubacub - - Brian Cooke - - Brian Holt - - Brian Hsu - - Brian Kim - - Brian Kung - - Brian Reavis - - Brian Rue - - Bruno Škvorc - - Cam Song - - Cam Spiers - - Cameron Chamberlain - - Cameron Matheson - - Carter Chung - - Cassus Adam Banko - - Cat Chen - - Cedric Sohrauer - - Cesar William Alvarenga - - Changsoon Bok - - Charles Marsh - - Chase Adams - - Cheng Lou - - Chitharanjan Das - - Chris Bolin - - Chris Grovers - - Chris Ha - - Chris Rebert - - Chris Sciolla - - Christian Alfoni - - Christian Oliff - - Christian Roman - - Christoffer Sawicki - - Christoph Pojer - - Christopher Monsanto - - Clay Allsopp - - Connor McSheffrey - - Conor Hastings - - Cory House - - Cotton Hou - - Craig Akimoto - - Cristovao Verstraeten - - Damien Pellier - - Dan Abramov - - Dan Fox - - Dan Schafer - - Daniel Carlsson - - Daniel Cousens - - Daniel Friesen - - Daniel Gasienica - - Daniel Hejl - - Daniel Hejl - - Daniel Lo Nigro - - Daniel Mané - - Daniel Miladinov - - Daniel Rodgers-Pryor - - Daniel Schonfeld - - Danny Ben-David - - Darcy - - Daryl Lau - - Darío Javier Cravero - - Dave Galbraith - - David Baker - - David Ed Mellum - - David Goldberg - - David Granado - - David Greenspan - - David Hellsing - - David Hu - - David Khourshid - - David Mininger - - David Neubauer - - David Percy - - Dean Shi - - Denis Sokolov - - Deniss Jacenko - - Dennis Johnson - - Devon Blandin - - Devon Harvey - - Dmitrii Abramov - - Dmitriy Rozhkov - - Dmitry Blues - - Dmitry Mazuro - - Domenico Matteo - - Don Abrams - - Dongsheng Liu - - Dustan Kasten - - Dustin Getz - - Dylan Harrington - - Eduardo Garcia - - Edvin Erikson - - Elaine Fang - - Enguerran - - Eric Clemmons - - Eric Eastwood - - Eric Florenzano - - Eric O'Connell - - Eric Schoffstall - - Erik Harper - - Espen Hovlandsdal - - Evan Coonrod - - Evan Vosberg - - Fabio M. Costa - - Federico Rampazzo - - Felipe Oliveira Carvalho - - Felix Gnass - - Felix Kling - - Fernando Correia - - Frankie Bagnardi - - François-Xavier Bois - - Fred Zhao - - Freddy Rangel - - Fyodor Ivanishchev - - G Scott Olson - - G. Kay Lee - - Gabe Levi - - Gajus Kuizinas - - Gareth Nicholson - - Garren Smith - - Gavin McQuistin - - Geert Pasteels - - Geert-Jan Brits - - George A Sisco III - - Georgii Dolzhykov - - Gilbert - - Glen Mailer - - Grant Timmerman - - Greg Hurrell - - Greg Perkins - - Greg Roodt - - Gregory - - Guangqiang Dong - - Guido Bouman - - Harry Hull - - Harry Marr - - Harry Moreno - - Harshad Sabne - - Hekar Khani - - Hendrik Swanepoel - - Henrik Nyh - - Henry Wong - - Henry Zhu - - Hideo Matsumoto - - Hou Chia - - Huang-Wei Chang -- - Hugo Agbonon - - Hugo Jobling - - Hyeock Kwon - - Héliton Nordt - - Ian Obermiller - - Ignacio Carbajo - - Igor Scekic - - Ilia Pavlenkov - - Ilya Shuklin - - Ilyá Belsky - - Ingvar Stepanyan - - Irae Carvalho - - Isaac Salier-Hellendag - - Iurii Kucherov - - Ivan Kozik - - Ivan Krechetov - - Ivan Vergiliev - - J. Andrew Brassington - - J. Renée Beach - - JD Isaacks - - JJ Weber - - JW - - Jack Zhang - - Jackie Wung - - Jacob Gable - - Jacob Greenleaf - - Jae Hun Ro - - Jaeho Lee - - Jaime Mingo - - Jake Worth - - Jakub Malinowski - - James - - James Brantly - - James Burnett - - James Friend - - James Ide - - James Long - - James Pearce - - James Seppi - - James South - - James Wen - - Jamie Wong - - Jamis Charles - - Jamison Dance - - Jan Hancic - - Jan Kassens - - Jan Raasch - - Jared Forsyth - - Jason - - Jason Bonta - - Jason Ly - - Jason Miller - - Jason Quense - - Jason Trill - - Jason Webster - - Jay Jaeho Lee - - Jean Lauliac - - Jed Watson - - Jeff Barczewski - - Jeff Carpenter - - Jeff Chan - - Jeff Hicken - - Jeff Kolesky - - Jeff Morrison - - Jeff Welch - - Jeffrey Lin - - Jeremy Fairbank - - Jesse Skinner - - Jignesh Kakadiya - - Jim OBrien - - Jim Sproch - - Jimmy Jea - - Jing Chen - - Jinwoo Oh - - Jinxiu Lee - - Jiyeon Seo - - Jody McIntyre - - Joe Critchley - - Joe Stein - - Joel Auterson - - Johannes Baiter - - Johannes Emerich - - Johannes Lumpe - - John Heroy - - John Ryan - - John Watson - - John-David Dalton - - Jon Beebe - - Jon Chester - - Jon Hester - - Jon Madison - - Jon Scott Clark - - Jon Tewksbury - - Jonas Enlund - - Jonas Gebhardt - - Jonathan Hsu - - Jonathan Persson - - Jordan Harband - - Jordan Walke - - Jorrit Schippers - - Joseph Nudell - - Joseph Savona - - Josh Bassett - - Josh Duck - - Josh Perez - - Josh Yudaken - - Joshua Evans - - Joshua Go - - Joshua Goldberg - - Joshua Ma - - João Valente - - Juan Serrano - - Julen Ruiz Aizpuru - - Julian Viereck - - Julien Bordellier - - Julio Lopez - - Jun Wu - - Juraj Dudak - - Justas Brazauskas - - Justin Jaffray - - Justin Robison - - Justin Woo - - Kale - - Kamron Batman - - Karl Mikkelsen - - Karpich Dmitry - - Keito Uchiyama - - Ken Powers - - Kent C. Dodds - - Kevin Cheng - - Kevin Coughlin - - Kevin Huang - - Kevin Lau - - Kevin Old - - Kevin Robinson - - Kewei Jiang - - Kier Borromeo - - KimCoding - - Kirk Steven Hansen - - Kit Randel - - Kohei TAKATA - - Koo Youngmin - - Krystian Karczewski - - Kunal Mehta - - Kurt Ruppel - - Kyle Kelley - - Kyle Mathews - - Laurence Rowe - - Laurent Etiemble - - Lee Byron - - Lee Jaeyoung - - Lei - - Leland Richardson - - Leon Fedotov - - Leon Yip - - Leonardo YongUk Kim - - Levi Buzolic - - Levi McCallum - - Lily - - Logan Allen - - Lovisa Svallingson - - Ludovico Fischer - - Luigy Leon - - Luke Horvat - - MIKAMI Yoshiyuki - - Maher Beg - - Manas - - Marcin K. - - Marcin Kwiatkowski - - Marcin Szczepanski - - Mariano Desanze - - Marjan - - Mark Anderson - - Mark Funk - - Mark Hintz - - Mark IJbema - - Mark Murphy - - Mark Richardson - - Mark Rushakoff - - Mark Sun - - Marlon Landaverde - - Marshall Roch - - Martin Andert - - Martin Hujer - - Martin Jul - - Martin Konicek - - Martin Mihaylov - - Masaki KOBAYASHI - - Mathieu M-Gosselin - - Mathieu Savy - - Matias Singers - - Matsunoki - - Matt Brookes - - Matt Dunn-Rankin - - Matt Harrison - - Matt Huggins - - Matt Stow - - Matt Zabriskie - - Matthew Dapena-Tretter - - Matthew Herbst - - Matthew Hodgson - - Matthew Johnston - - Matthew King - - Matthew Looi - - Matthew Miner - - Matthias Le Brun - - Matti Nelimarkka - - Mattijs Kneppers - - Max F. Albrecht - - Max Heiber - - Max Stoiber - - Maxi Ferreira - - Maxim Abramchuk - - Merrick Christensen - - Mert Kahyaoğlu - - Michael Chan - - Michael McDermott - - Michael Randers-Pehrson - - Michael Ridgway - - Michael Warner - - Michael Wiencek - - Michael Ziwisky - - Michal Srb - - Michelle Todd - - Mihai Parparita - - Mike D Pilsbury - - Mike Groseclose - - Mike Nordick - - Mikolaj Dadela - - Miles Johnson - - Minwe LUO - - Miorel Palii -- - Morhaus - - Moshe Kolodny - - Mouad Debbar - - Murad - - Murray M. Moss - - Nadeesha Cabral - - Naman Goel - - Nate Hunzaker - - Nate Lee - - Nathan Smith - - Nathan White - - Nee - - Neri Marschik - - Nguyen Truong Duy - - Nicholas Bergson-Shilcock - - Nicholas Clawson - - Nick Balestra - - Nick Fitzgerald - - Nick Gavalas - - Nick Merwin - - Nick Presta - - Nick Raienko - - Nick Thompson - - Nick Williams - - Niklas Boström - - Ning Xia - - Niole Nelson - - Oiva Eskola - - Oleg - - Oleksii Markhovskyi - - Oliver Zeigermann - - Olivier Tassinari - - Owen Coutts - - Pablo Lacerda de Miranda - - Paolo Moretti - - Pascal Hartig - - Patrick - - Patrick Laughlin - - Patrick Stapleton - - Paul Benigeri - - Paul Harper - - Paul O’Shannessy - - Paul Seiffert - - Paul Shen - - Pedro Nauck - - Pete Hunt - - Peter Blazejewicz - - Peter Cottle - - Peter Jaros - - Peter Newnham - - Petri Lehtinen - - Petri Lievonen - - Pieter Vanderwerff - - Pouja Nikray - - Prathamesh Sonpatki - - Prayag Verma - - Preston Parry - - Rafael - - Rafal Dittwald - - Rainer Oviir - - Rajat Sehgal - - Rajiv Tirumalareddy - - Ram Kaniyur - - Randall Randall - - Ray - - Raymond Ha - - Reed Loden - - Remko Tronçon - - Richard D. Worth - - Richard Feldman - - Richard Kho - - Richard Littauer - - Richard Livesey - - Richard Wood - - Rick Beerendonk - - Rick Ford - - Riley Tomasek - - Rob Arnold - - Robert Binna - - Robert Knight - - Robert Sedovsek - - Robin Berjon - - Robin Frischmann - - Roman Pominov - - Roman Vanesyan - - Russ - - Ryan Seddon - - Sahat Yalkabov - - Saif Hakim - - Saiichi Hashimoto - - Sam Beveridge - - Sam Saccone - - Sam Selikoff - - Samy Al Zahrani - - Sander Spies - - Scott Burch - - Scott Feeney - - Sean Kinsey - - Sebastian Markbåge - - Sebastian McKenzie - - Seoh Char - - Sercan Eraslan - - Serg - - Sergey Generalov - - Sergey Rubanov - - Seyi Adebajo - - Shane O'Sullivan - - Shaun Trennery - - ShihChi Huang - - Shim Won - - Shinnosuke Watanabe - - Shogun Sea - - Shota Kubota - - Shripad K - - Sibi - - Simen Bekkhus - - Simon Højberg - - Simon Welsh - - Simone Vittori - - Soichiro Kawamura - - Sophia Westwood - - Sota Ohara - - Spencer Handley - - Stefan Dombrowski - - Stephen Murphy - - Sterling Cobb - - Steve Baker - - Steven Luscher - - Steven Vachon - - Stoyan Stefanov - - Sundeep Malladi - - Sunny Juneja - - Sven Helmberger - - Sverre Johansen - - Sébastien Lorber - - Sławomir Laskowski - - Taeho Kim - - Tay Yang Shun - - Ted Kim - - Tengfei Guo - - Teodor Szente - - Thomas Aylott - - Thomas Boyt - - Thomas Broadley - - Thomas Reggi - - Thomas Röggla - - Thomas Shaddox - - Thomas Shafer - - ThomasCrvsr - - Tienchai Wirojsaksaree - - Tim Routowicz - - Tim Schaub - - Timothy Yung - - Timur Carpeev - - Tobias Reiss - - Tom Duncalf - - Tom Haggie - - Tom Hauburger - - Tom MacWright - - Tom Occhino - - Tomasz Kołodziejski - - Tomoya Suzuki - - Tony Spiro - - Toru Kobayashi - - Trinh Hoang Nhu - - Tsung Hung - - Tyler Brock - - Ustin Zarubin - - Vadim Chernysh - - Varun Rau - - Vasiliy Loginevskiy - - Victor Alvarez - - Victor Homyakov - - Victor Koenders - - Ville Immonen - - Vincent Riemer - - Vincent Siao - - Vipul A M - - Vitaly Kramskikh - - Vitor Balocco - - Vjeux - - Volkan Unsal - - Wander Wang - - Wayne Larsen - - WickyNilliams - - Wincent Colaiuta - - Wout Mertens - - Xavier Morel - - XuefengWu - - Yakov Dalinchuk - - Yasar icli - - YouBao Nong - - Yuichi Hagio - - Yuriy Dybskiy - - Yutaka Nakajima - - Yuval Dekel - - Zach Bruggeman - - Zach Ramaekers - - Zacharias - - Zeke Sikelianos - - Zhangjd - - adraeth - - arush - - brafdlog - - chen - - clariroid - - claudiopro - - cutbko - - davidxi - - dongmeng.ldm - - iamchenxin - - iamdoron - - iawia002 - - imagentleman - - koh-taka - - kohashi85 - - laiso - - leeyoungalias - - li.li - - maxprafferty - - rgarifullin - - songawee - - sugarshin - - wali-s - - yiminghe - - youmoo - - zhangjg - - zwhitchcox - - "Árni Hermann Reynisson" - - "元彦" - - "凌恒" - - "张敏" diff --git a/docs/_data/authors.yml b/docs/_data/authors.yml deleted file mode 100644 index eff00b7e2eb..00000000000 --- a/docs/_data/authors.yml +++ /dev/null @@ -1,69 +0,0 @@ -# Map of short name to more information. `name` will be used but if you don't -# want to use your real name, just use whatever. If url is included, your name -# will be a link to the provided url. -benigeri: - name: Paul Benigeri - url: https://github.com/benigeri -chenglou: - name: Cheng Lou - url: https://twitter.com/_chenglou -Daniel15: - name: Daniel Lo Nigro - url: http://dan.cx/ -fisherwebdev: - name: Bill Fisher - url: https://twitter.com/fisherwebdev -gaearon: - name: Dan Abramov - url: https://twitter.com/dan_abramov -jaredly: - name: Jared Forsyth - url: https://twitter.com/jaredforsyth -jgebhardt: - name: Jonas Gebhardt - url: https://twitter.com/jonasgebhardt -jimfb: - name: Jim Sproch - url: http://www.jimsproch.com -jingc: - name: Jing Chen - url: https://twitter.com/jingc -josephsavona: - name: Joseph Savona - url: https://twitter.com/en_JS -keyanzhang: - name: Keyan Zhang - url: https://twitter.com/keyanzhang -kmeht: - name: Kunal Mehta - url: https://github.com/kmeht -LoukaN: - name: Lou Husson - url: https://twitter.com/loukan42 -matthewjohnston4: - name: Matthew Johnston - url: https://github.com/matthewathome -petehunt: - name: Pete Hunt - url: https://twitter.com/floydophone -schrockn: - name: Nick Schrock - url: https://twitter.com/schrockn -sebmarkbage: - name: Sebastian Markbåge - url: https://twitter.com/sebmarkbage -spicyj: - name: Ben Alpert - url: http://benalpert.com -steveluscher: - name: Steven Luscher - url: https://twitter.com/steveluscher -vjeux: - name: Vjeux - url: https://twitter.com/vjeux -wincent: - name: Greg Hurrell - url: https://twitter.com/wincent -zpao: - name: Paul O’Shannessy - url: https://twitter.com/zpao diff --git a/docs/_data/nav_community.yml b/docs/_data/nav_community.yml deleted file mode 100644 index 3740d3af7e8..00000000000 --- a/docs/_data/nav_community.yml +++ /dev/null @@ -1,14 +0,0 @@ -- title: Community Resources - items: - - id: support - title: Where To Get Support - - id: conferences - title: Conferences - - id: videos - title: Videos - - id: complementary-tools - title: Complementary Tools - href: https://github.com/facebook/react/wiki/Complementary-Tools - - id: examples - title: Examples - href: https://github.com/facebook/react/wiki/Examples diff --git a/docs/_data/nav_contributing.yml b/docs/_data/nav_contributing.yml deleted file mode 100644 index 1e1f02fd5b6..00000000000 --- a/docs/_data/nav_contributing.yml +++ /dev/null @@ -1,10 +0,0 @@ -- title: Contributing - items: - - id: how-to-contribute - title: How to Contribute - - id: codebase-overview - title: Codebase Overview - - id: implementation-notes - title: Implementation Notes - - id: design-principles - title: Design Principles diff --git a/docs/_data/nav_docs.yml b/docs/_data/nav_docs.yml deleted file mode 100644 index 1e66741d1fb..00000000000 --- a/docs/_data/nav_docs.yml +++ /dev/null @@ -1,86 +0,0 @@ -- title: Quick Start - items: - - id: installation - title: Installation - - id: hello-world - title: Hello World - - id: introducing-jsx - title: Introducing JSX - - id: rendering-elements - title: Rendering Elements - - id: components-and-props - title: Components and Props - - id: state-and-lifecycle - title: State and Lifecycle - - id: handling-events - title: Handling Events - - id: conditional-rendering - title: Conditional Rendering - - id: lists-and-keys - title: Lists and Keys - - id: forms - title: Forms - - id: lifting-state-up - title: Lifting State Up - - id: composition-vs-inheritance - title: Composition vs Inheritance - - id: thinking-in-react - title: Thinking In React -- title: Advanced Guides - items: - - id: jsx-in-depth - title: JSX In Depth - - id: typechecking-with-proptypes - title: Typechecking With PropTypes - - id: refs-and-the-dom - title: Refs and the DOM - - id: uncontrolled-components - title: Uncontrolled Components - - id: optimizing-performance - title: Optimizing Performance - - id: react-without-es6 - title: React Without ES6 - - id: react-without-jsx - title: React Without JSX - - id: reconciliation - title: Reconciliation - - id: context - title: Context - - id: web-components - title: Web Components - - id: higher-order-components - title: Higher-Order Components -- title: Reference - items: - - id: react-api - title: React - subitems: - - id: react-component - title: React.Component - - id: react-dom - title: ReactDOM - - id: react-dom-server - title: ReactDOMServer - - id: dom-elements - title: DOM Elements - - id: events - title: SyntheticEvent - - id: addons - title: Add-Ons - subitems: - - id: perf - title: Performance Tools - - id: test-utils - title: Test Utilities - - id: animation - title: Animation - - id: create-fragment - title: Keyed Fragments - - id: update - title: Immutability Helpers - - id: pure-render-mixin - title: PureRenderMixin - - id: shallow-compare - title: Shallow Compare - - id: two-way-binding-helpers - title: Two-way Binding Helpers diff --git a/docs/_data/nav_tutorial.yml b/docs/_data/nav_tutorial.yml deleted file mode 100644 index efa090f0cec..00000000000 --- a/docs/_data/nav_tutorial.yml +++ /dev/null @@ -1,71 +0,0 @@ -- title: Tutorial - items: - - id: tutorial - title: Overview - subitems: - - id: what-were-building - title: What We're Building - href: /react/tutorial/tutorial.html#what-were-building - forceInternal: true - - id: what-is-react - title: What is React? - href: /react/tutorial/tutorial.html#what-is-react - forceInternal: true - - id: getting-started - title: Getting Started - href: /react/tutorial/tutorial.html#getting-started - forceInternal: true - - id: passing-data-through-props - title: Passing Data Through Props - href: /react/tutorial/tutorial.html#passing-data-through-props - forceInternal: true - - id: an-interactive-component - title: An Interactive Component - href: /react/tutorial/tutorial.html#an-interactive-component - forceInternal: true - - id: developer-tools - title: Developer Tools - href: /react/tutorial/tutorial.html#developer-tools - forceInternal: true - - id: lifting-state-up - title: Lifting State Up - href: /react/tutorial/tutorial.html#lifting-state-up - forceInternal: true - subitems: - - id: why-immutability-is-important - title: Why Immutability Is Important - href: /react/tutorial/tutorial.html#why-immutability-is-important - forceInternal: true - - id: functional-components - title: Functional Components - href: /react/tutorial/tutorial.html#functional-components - forceInternal: true - - id: taking-turns - title: Taking Turns - href: /react/tutorial/tutorial.html#taking-turns - forceInternal: true - - id: declaring-a-winner - title: Declaring a Winner - href: /react/tutorial/tutorial.html#declaring-a-winner - forceInternal: true - - id: storing-a-history - title: Storing A History - href: /react/tutorial/tutorial.html#storing-a-history - forceInternal: true - subitems: - - id: showing-the-moves - title: Showing the Moves - href: /react/tutorial/tutorial.html#showing-the-moves - forceInternal: true - - id: keys - title: Keys - href: /react/tutorial/tutorial.html#keys - forceInternal: true - - id: implementing-time-travel - title: Implementing Time Travel - href: /react/tutorial/tutorial.html#implementing-time-travel - forceInternal: true - - id: wrapping-up - title: Wrapping Up - href: /react/tutorial/tutorial.html#wrapping-up - forceInternal: true diff --git a/docs/_includes/blog_post.html b/docs/_includes/blog_post.html deleted file mode 100644 index 894299c8f7c..00000000000 --- a/docs/_includes/blog_post.html +++ /dev/null @@ -1,32 +0,0 @@ -{% assign page = include.page %} - -

-{% if include.isPermalink %} - {{ page.title }} -{% else %} - {{ page.title }} -{% endif %} -

- -

- {{ page.date | date: "%B %e, %Y" }} - by - {% for author in page.authors %} - {% if author.url %} - {{ author.name }} - {% else %} - {{ author.name }} - {% endif %} - {% if forloop.last == false %} and {% endif %} - {% endfor %} -

- -
- -
- {{ include.content }} -
- -{% if include.isPermalink %} -
-{% endif %} diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html deleted file mode 100644 index e2e6fdb6586..00000000000 --- a/docs/_includes/footer.html +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/docs/_includes/hero.html b/docs/_includes/hero.html deleted file mode 100644 index 10530a7060d..00000000000 --- a/docs/_includes/hero.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
React
-
- A JavaScript library for building user interfaces -
- - -
-
diff --git a/docs/_includes/nav_blog.html b/docs/_includes/nav_blog.html deleted file mode 100644 index 75ff77e50eb..00000000000 --- a/docs/_includes/nav_blog.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/docs/_includes/nav_community.html b/docs/_includes/nav_community.html deleted file mode 100644 index 7b26b8df93e..00000000000 --- a/docs/_includes/nav_community.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/docs/_includes/nav_docs.html b/docs/_includes/nav_docs.html deleted file mode 100644 index be10a9c5131..00000000000 --- a/docs/_includes/nav_docs.html +++ /dev/null @@ -1,39 +0,0 @@ - diff --git a/docs/_includes/nav_tutorial.html b/docs/_includes/nav_tutorial.html deleted file mode 100644 index 2a720cbdd0b..00000000000 --- a/docs/_includes/nav_tutorial.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/docs/_includes/navigation.html b/docs/_includes/navigation.html deleted file mode 100644 index 31ecd5b6978..00000000000 --- a/docs/_includes/navigation.html +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/docs/_js/ErrorDecoderComponent.js b/docs/_js/ErrorDecoderComponent.js deleted file mode 100644 index 7ac945228e5..00000000000 --- a/docs/_js/ErrorDecoderComponent.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) 2013-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -/* global React ReactDOM errorMap:true */ -'use strict'; - -function replaceArgs(msg, argList) { - let argIdx = 0; - return msg.replace(/%s/g, function() { - const arg = argList[argIdx++]; - return arg === undefined ? '[missing argument]' : arg; - }); -} - -function urlify(str) { - const urlRegex = /(https:\/\/fb\.me\/[a-z\-]+)/g; - - const segments = str.split(urlRegex); - - for (let i = 0; i < segments.length; i++) { - if (i % 2 === 1) { - segments[i] = ({segments[i]}); - } - } - - return segments; -} - -// ?invariant=123&args[]=foo&args[]=bar -function parseQueryString() { - const rawQueryString = window.location.search.substring(1); - if (!rawQueryString) { - return null; - } - - let code = ''; - let args = []; - - const queries = rawQueryString.split('&'); - for (let i = 0; i < queries.length; i++) { - const query = decodeURIComponent(queries[i]); - if (query.indexOf('invariant=') === 0) { - code = query.slice(10); - } else if (query.indexOf('args[]=') === 0) { - args.push(query.slice(7)); - } - } - - return [code, args]; -} - -function ErrorResult(props) { - const code = props.code; - const errorMsg = props.msg; - - if (!code) { - return ( -

When you encounter an error, you'll receive a link to this page for that specific error and we'll show you the full error text.

- ); - } - - return ( -
-

The full text of the error you just encountered is:

- {urlify(errorMsg)} -
- ); -} - -class ErrorDecoder extends React.Component { - constructor(...args) { - super(...args); - - this.state = { - code: null, - errorMsg: '', - }; - } - - componentWillMount() { - const parseResult = parseQueryString(); - if (parseResult != null) { - const [code, args] = parseResult; - if (errorMap[code]) { - this.setState({ - code: code, - errorMsg: replaceArgs(errorMap[code], args), - }); - } - } - } - - render() { - return ( - - ); - } -} - -ReactDOM.render( - , - document.querySelector('.error-decoder-container') -); diff --git a/docs/_js/anchor-links.js b/docs/_js/anchor-links.js deleted file mode 100644 index c8a1c86890e..00000000000 --- a/docs/_js/anchor-links.js +++ /dev/null @@ -1,30 +0,0 @@ -// Add anchors to headings client-side, which prevents them from showing up -// in RSS feeds. See https://github.com/facebook/react/issues/4124. -(function() { - var selector = '.inner-content h2, .inner-content h3, .inner-content h4'; - var elements = document.querySelectorAll(selector); - for (var i = 0; i < elements.length; i++) { - var textMethod = document.body.textContent ? "textContent" : "innerText"; - var roughText = elements[i][textMethod]; - - // Regex rule for making the title URL-friendly. - var urlFriendlyText = roughText.trim() - .toLowerCase() - .replace(/\s+/g, '-') - .replace(/[^A-Za-z0-9\-_.\p{Cyrillic}\p{Hangul}\p{Hiragana}\p{Katakana}\p{Han}]/g, ''); - - // Create the anchor we'll jump to. - var anchor = document.createElement('a'); - anchor.className = 'anchor'; - anchor.name = urlFriendlyText; - elements[i].insertBefore(anchor, elements[i].firstChild); - - // Create the clickable "#" icon. - var hashLink = document.createElement('a'); - var icon = document.createTextNode("#"); - hashLink.appendChild(icon); - hashLink.className = 'hash-link'; - hashLink.href = '#' + urlFriendlyText; - elements[i].appendChild(hashLink); - } -}()); diff --git a/docs/_js/examples/.eslintrc b/docs/_js/examples/.eslintrc deleted file mode 100644 index 5c1e2e2ca7f..00000000000 --- a/docs/_js/examples/.eslintrc +++ /dev/null @@ -1,7 +0,0 @@ ---- -rules: - block-scoped-var: 0 - no-undef: 0 - strict: 0 - react/react-in-jsx-scope: 0 - react/jsx-no-undef: 0 diff --git a/docs/_js/examples/hello.js b/docs/_js/examples/hello.js deleted file mode 100644 index 16f7f1a4094..00000000000 --- a/docs/_js/examples/hello.js +++ /dev/null @@ -1,15 +0,0 @@ -var name = Math.random() > 0.5 ? 'Jane' : 'John'; -var HELLO_COMPONENT = ` -class HelloMessage extends React.Component { - render() { - return
Hello {this.props.name}
; - } -} - -ReactDOM.render(, mountNode); -`.trim(); - -ReactDOM.render( - , - document.getElementById('helloExample') -); diff --git a/docs/_js/examples/markdown.js b/docs/_js/examples/markdown.js deleted file mode 100644 index f0cab2b8b0d..00000000000 --- a/docs/_js/examples/markdown.js +++ /dev/null @@ -1,41 +0,0 @@ -var MARKDOWN_COMPONENT = ` -class MarkdownEditor extends React.Component { - constructor(props) { - super(props); - this.handleChange = this.handleChange.bind(this); - this.state = {value: 'Type some *markdown* here!'}; - } - - handleChange(e) { - this.setState({value: e.target.value}); - } - - getRawMarkup() { - var md = new Remarkable(); - return { __html: md.render(this.state.value) }; - } - - render() { - return ( -
-

Input

- -``` - -In React, a `); + }); + + expect(node.value).toBe('0'); + }); + + it('should not incur unnecessary DOM mutations', async () => { + const container = document.createElement('div'); + const root = ReactDOMClient.createRoot(container); + await act(() => { + root.render(, + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on ); + }); + + expect(node.value).toEqual(''); + }); + } + + if (ReactFeatureFlags.disableTextareaChildren) { + it('should receive defaultValue and still ignore children content', async () => { + const container = document.createElement('div'); + const root = ReactDOMClient.createRoot(container); + + const node = await renderTextarea( + , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on ); + }); + + expect(node.value).toEqual('giraffe'); + }); + } + + it('should keep value when switching to uncontrolled element if not changed', async () => { + const container = document.createElement('div'); + const root = ReactDOMClient.createRoot(container); + const node = await renderTextarea( + , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + container, + root, + ); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on , + ); + }); + }).rejects.toThrow(', + container, + root, + )))(), + ).resolves.not.toThrow(); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on ); + }); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on ); + }); + assertConsoleErrorDev([ + 'Use the `defaultValue` or `value` props instead of setting children on - {null} -
-
- - - {null} - - ); - } - if (props.x === 221) { - return ; - } - if (props.x === 250) { - return ; - } - if (props.x === 280) { - return ; - } -}; - -var BUIPopoverButton77 = function(props) { - if (props.x === 182) { - return ; - } -}; - -var BUIDateRangePicker78 = function(props) { - if (props.x === 184) { - return ( - - - {[ - , - ]} - - ); - } -}; - -var AdsPEStatsRangePicker79 = function(props) { - if (props.x === 185) { - return ; - } -}; - -var AdsPEStatRange80 = function(props) { - if (props.x === 191) { - return ( -
- {"Stats:"} - - - - - {[ - , - ]} -
- ); - } -}; - -var AdsPEStatRangeContainer81 = function(props) { - if (props.x === 192) { - return ; - } -}; - -var AdsPESideTrayTabButton82 = function(props) { - if (props.x === 196) { - return ( -
- -
-
-
- ); - } - if (props.x === 199) { - return ( -
- -
-
-
- ); - } - if (props.x === 203) { - return null; - } -}; - -var AdsPEEditorTrayTabButton83 = function(props) { - if (props.x === 197) { - return ; - } -}; - -var AdsPEInsightsTrayTabButton84 = function(props) { - if (props.x === 202) { - return ( - - - - - ); - } -}; - -var AdsPENekoDebuggerTrayTabButton85 = function(props) { - if (props.x === 204) { - return ; - } -}; - -var AdsPEEditorChildLink86 = function(props) { - if (props.x === 211) { - return ( -
- - {"|"} - -
- ); - } -}; - -var AdsPEEditorChildLinkContainer87 = function(props) { - if (props.x === 212) { - return ; - } -}; - -var AdsPEHeaderSection88 = function(props) { - if (props.x === 213) { - return ( -
-
- -
-
- -
-
- -
- ); - } -}; - -var AdsPECampaignGroupHeaderSectionContainer89 = function(props) { - if (props.x === 214) { - return ; - } -}; - -var AdsEditorLoadingErrors90 = function(props) { - if (props.x === 215) { - return null; - } -}; - -var AdsTextInput91 = function(props) { - if (props.x === 217) { - return ; - } -}; - -var BUIFormElement92 = function(props) { - if (props.x === 218) { - return ( -
-
- -
-
-
- - - {null} - -
- {null} -
-
- ); - } -}; - -var BUIForm93 = function(props) { - if (props.x === 219) { - return ( -
- -
- ); - } -}; - -var XUICard94 = function(props) { - if (props.x === 220) { - return ( -
- -
- ); - } - if (props.x === 249) { - return ( -
- - -
- ); - } - if (props.x === 279) { - return ( -
- -
- ); - } -}; - -var AdsCard95 = function(props) { - if (props.x === 222) { - return ; - } - if (props.x === 251) { - return ; - } - if (props.x === 281) { - return ; - } -}; - -var AdsEditorNameSection96 = function(props) { - if (props.x === 223) { - return ; - } -}; - -var AdsCampaignGroupNameSectionContainer97 = function(props) { - if (props.x === 224) { - return ; - } -}; - -var _render98 = function(props) { - if (props.x === 225) { - return ; - } -}; - -var AdsPluginWrapper99 = function(props) { - if (props.x === 226) { - return <_render98 x={225} />; - } - if (props.x === 255) { - return <_render111 x={254} />; - } - if (props.x === 258) { - return <_render113 x={257} />; - } - if (props.x === 287) { - return <_render127 x={286} />; - } - if (props.x === 291) { - return <_render130 x={290} />; - } -}; - -var XUICardHeaderTitle100 = function(props) { - if (props.x === 227) { - return ( - - {"Campaign Details"} - {null} - - - ); - } - if (props.x === 265) { - return ( - - {[ - - {"Campaign ID"} - {": "} - {"98010048849317"} - , -
- -
, - ]} - {null} - -
- ); - } -}; - -var XUICardSection101 = function(props) { - if (props.x === 228) { - return ( -
- {[ - , - ]} - {undefined} - {undefined} -
-
- ); - } - if (props.x === 247) { - return ( -
-
- - - - {null} - {null} -
-
- ); - } -}; - -var XUICardHeader102 = function(props) { - if (props.x === 229) { - return ; - } -}; - -var AdsCardHeader103 = function(props) { - if (props.x === 230) { - return ; - } -}; - -var AdsLabeledField104 = function(props) { - if (props.x === 231) { - return ( -
- - {null} -
-
- ); - } - if (props.x === 234) { - return ( -
- - {null} -
-
- ); - } - if (props.x === 240) { - return ( -
- - -
-
- ); - } -}; - -var FlexibleBlock105 = function(props) { - if (props.x === 233) { - return ; - } - if (props.x === 236) { - return ; - } - if (props.x === 246) { - return ; - } -}; - -var AdsBulkCampaignSpendCapField106 = function(props) { - if (props.x === 243) { - return ( -
- {""} - - {" (optional)"} -
- ); - } -}; - -var FluxContainer_AdsCampaignGroupSpendCapContainer_107 = function(props) { - if (props.x === 244) { - return ; - } -}; - -var AdsCardSection108 = function(props) { - if (props.x === 248) { - return ; - } -}; - -var AdsEditorCampaignGroupDetailsSection109 = function(props) { - if (props.x === 252) { - return ; - } -}; - -var AdsEditorCampaignGroupDetailsSectionContainer110 = function(props) { - if (props.x === 253) { - return ; - } -}; - -var _render111 = function(props) { - if (props.x === 254) { - return ; - } -}; - -var FluxContainer_AdsEditorToplineDetailsSectionContainer_112 = function(props) { - if (props.x === 256) { - return null; - } -}; - -var _render113 = function(props) { - if (props.x === 257) { - return ; - } -}; - -var AdsStickyArea114 = function(props) { - if (props.x === 259) { - return ( -
-
-
- ); - } - if (props.x === 292) { - return ( -
-
- {[ -
- -
, - ]} -
-
- ); - } -}; - -var FluxContainer_AdsEditorColumnContainer_115 = function(props) { - if (props.x === 260) { - return ( -
- {[ -
- -
, -
- -
, -
- -
, - ]} - -
- ); - } - if (props.x === 293) { - return ( -
- {[ -
- -
, - ]} - -
- ); - } -}; - -var BUISwitch116 = function(props) { - if (props.x === 261) { - return ( -
-
-
-
- {null} -
- ); - } -}; - -var AdsStatusSwitchInternal117 = function(props) { - if (props.x === 262) { - return ; - } -}; - -var AdsStatusSwitch118 = function(props) { - if (props.x === 263) { - return ; - } -}; - -var FluxContainer_AdsCampaignGroupStatusSwitchContainer_119 = function(props) { - if (props.x === 264) { - return ; - } -}; - -var AdsLinksMenu120 = function(props) { - if (props.x === 275) { - return ; - } -}; - -var FluxContainer_AdsPluginizedLinksMenuContainer_121 = function(props) { - if (props.x === 276) { - return ( -
- {null} - -
- ); - } -}; - -var AdsCardLeftRightHeader122 = function(props) { - if (props.x === 278) { - return ; - } -}; - -var AdsPEIDSection123 = function(props) { - if (props.x === 282) { - return ; - } -}; - -var FluxContainer_AdsPECampaignGroupIDSectionContainer_124 = function(props) { - if (props.x === 283) { - return ; - } -}; - -var DeferredComponent125 = function(props) { - if (props.x === 284) { - return ; - } -}; - -var BootloadedComponent126 = function(props) { - if (props.x === 285) { - return ; - } -}; - -var _render127 = function(props) { - if (props.x === 286) { - return ; - } -}; - -var AdsEditorErrorsCard128 = function(props) { - if (props.x === 288) { - return null; - } -}; - -var FluxContainer_FunctionalContainer_129 = function(props) { - if (props.x === 289) { - return ; - } -}; - -var _render130 = function(props) { - if (props.x === 290) { - return ; - } -}; - -var AdsEditorMultiColumnLayout131 = function(props) { - if (props.x === 294) { - return ( -
-
-
- -
-
- -
-
- -
-
-
-
-
- ); - } -}; - -var AdsPECampaignGroupEditor132 = function(props) { - if (props.x === 295) { - return ( -
- - -
- ); - } -}; - -var AdsPECampaignGroupEditorContainer133 = function(props) { - if (props.x === 296) { - return ; - } -}; - -var AdsPESideTrayTabContent134 = function(props) { - if (props.x === 297) { - return ( -
- -
- ); - } -}; - -var AdsPEEditorTrayTabContentContainer135 = function(props) { - if (props.x === 298) { - return ; - } -}; - -var AdsPEMultiTabDrawer136 = function(props) { - if (props.x === 299) { - return ( -
-
- - - -
-
- - {null} -
-
- ); - } -}; - -var FluxContainer_AdsPEMultiTabDrawerContainer_137 = function(props) { - if (props.x === 300) { - return ; - } -}; - -var AdsPESimpleOrganizer138 = function(props) { - if (props.x === 309) { - return ( -
- - - -
- ); - } -}; - -var AdsPEOrganizerContainer139 = function(props) { - if (props.x === 310) { - return ( -
- -
- ); - } -}; - -var FixedDataTableColumnResizeHandle140 = function(props) { - if (props.x === 313) { - return ( -
-
-
- ); - } -}; - -var AdsPETableHeader141 = function(props) { - if (props.x === 315) { - return ( -
- - {"Campaigns"} -
- ); - } - if (props.x === 320) { - return ( -
- {null} - {"Performance"} -
- ); - } - if (props.x === 323) { - return ( -
- {null} - {"Overview"} -
- ); - } - if (props.x === 326) { - return ( -
- {null} - {"Toplines"} -
- ); - } - if (props.x === 329) { - return
; - } - if (props.x === 340) { - return ( -
- {null} - {"Campaign Name"} -
- ); - } - if (props.x === 346) { - return ( -
- - {null} -
- ); - } - if (props.x === 352) { - return ( -
- - {null} -
- ); - } - if (props.x === 357) { - return ( -
- {null} - {"Status"} -
- ); - } - if (props.x === 362) { - return ( -
- {null} - {"Delivery"} -
- ); - } - if (props.x === 369) { - return ( -
- {null} - {"Results"} -
- ); - } - if (props.x === 374) { - return ( -
- {null} - {"Cost"} -
- ); - } - if (props.x === 379) { - return ( -
- {null} - {"Reach"} -
- ); - } - if (props.x === 384) { - return ( -
- {null} - {"Impressions"} -
- ); - } - if (props.x === 389) { - return ( -
- {null} - {"Clicks"} -
- ); - } - if (props.x === 394) { - return ( -
- {null} - {"Avg. CPM"} -
- ); - } - if (props.x === 399) { - return ( -
- {null} - {"Avg. CPC"} -
- ); - } - if (props.x === 404) { - return ( -
- {null} - {"CTR %"} -
- ); - } - if (props.x === 409) { - return ( -
- {null} - {"Spent"} -
- ); - } - if (props.x === 414) { - return ( -
- {null} - {"Objective"} -
- ); - } - if (props.x === 419) { - return ( -
- {null} - {"Buying Type"} -
- ); - } - if (props.x === 424) { - return ( -
- {null} - {"Campaign ID"} -
- ); - } - if (props.x === 429) { - return ( -
- {null} - {"Start"} -
- ); - } - if (props.x === 434) { - return ( -
- {null} - {"End"} -
- ); - } - if (props.x === 439) { - return ( -
- {null} - {"Date created"} -
- ); - } - if (props.x === 444) { - return ( -
- {null} - {"Date last edited"} -
- ); - } - if (props.x === 449) { - return ( -
- {null} - {"Tags"} -
- ); - } - if (props.x === 452) { - return
; - } -}; - -var TransitionCell142 = function(props) { - if (props.x === 316) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 321) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 324) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 327) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 330) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 338) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 343) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 349) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 355) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 360) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 365) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 372) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 377) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 382) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 387) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 392) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 397) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 402) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 407) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 412) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 417) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 422) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 427) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 432) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 437) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 442) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 447) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 450) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 453) { - return ( -
-
-
- -
-
-
- ); - } -}; - -var FixedDataTableCell143 = function(props) { - if (props.x === 317) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 322) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 325) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 328) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 331) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 339) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 344) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 350) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 356) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 361) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 366) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 373) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 378) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 383) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 388) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 393) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 398) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 403) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 408) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 413) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 418) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 423) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 428) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 433) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 438) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 443) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 448) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 451) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 454) { - return ( -
- {undefined} - -
- ); - } -}; - -var FixedDataTableCellGroupImpl144 = function(props) { - if (props.x === 318) { - return ( -
- -
- ); - } - if (props.x === 332) { - return ( -
- - - - -
- ); - } - if (props.x === 367) { - return ( -
- - - - - - -
- ); - } - if (props.x === 455) { - return ( -
- - - - - - - - - - - - - - - - - - -
- ); - } -}; - -var FixedDataTableCellGroup145 = function(props) { - if (props.x === 319) { - return ( -
- -
- ); - } - if (props.x === 333) { - return ( -
- -
- ); - } - if (props.x === 368) { - return ( -
- -
- ); - } - if (props.x === 456) { - return ( -
- -
- ); - } -}; - -var FixedDataTableRowImpl146 = function(props) { - if (props.x === 334) { - return ( -
-
- - -
-
-
- ); - } - if (props.x === 457) { - return ( -
-
- - -
-
-
- ); - } -}; - -var FixedDataTableRow147 = function(props) { - if (props.x === 335) { - return ( -
- -
- ); - } - if (props.x === 458) { - return ( -
- -
- ); - } -}; - -var FixedDataTableAbstractSortableHeader148 = function(props) { - if (props.x === 341) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 347) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 353) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 358) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 363) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 370) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 375) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 380) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 385) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 390) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 395) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 400) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 405) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 410) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 415) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 420) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 425) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 430) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 435) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 440) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 445) { - return ( -
-
- {null} - -
-
- ); - } -}; - -var FixedDataTableSortableHeader149 = function(props) { - if (props.x === 342) { - return ; - } - if (props.x === 348) { - return ; - } - if (props.x === 354) { - return ; - } - if (props.x === 359) { - return ; - } - if (props.x === 364) { - return ; - } - if (props.x === 371) { - return ; - } - if (props.x === 376) { - return ; - } - if (props.x === 381) { - return ; - } - if (props.x === 386) { - return ; - } - if (props.x === 391) { - return ; - } - if (props.x === 396) { - return ; - } - if (props.x === 401) { - return ; - } - if (props.x === 406) { - return ; - } - if (props.x === 411) { - return ; - } - if (props.x === 416) { - return ; - } - if (props.x === 421) { - return ; - } - if (props.x === 426) { - return ; - } - if (props.x === 431) { - return ; - } - if (props.x === 436) { - return ; - } - if (props.x === 441) { - return ; - } - if (props.x === 446) { - return ; - } -}; - -var FixedDataTableBufferedRows150 = function(props) { - if (props.x === 459) { - return
; - } -}; - -var Scrollbar151 = function(props) { - if (props.x === 460) { - return null; - } - if (props.x === 461) { - return ( -
-
-
- ); - } -}; - -var HorizontalScrollbar152 = function(props) { - if (props.x === 462) { - return ( -
-
- -
-
- ); - } -}; - -var FixedDataTable153 = function(props) { - if (props.x === 463) { - return ( -
-
- - - - - {null} - {undefined} -
-
- - -
- ); - } -}; - -var TransitionTable154 = function(props) { - if (props.x === 464) { - return ; - } -}; - -var AdsSelectableFixedDataTable155 = function(props) { - if (props.x === 465) { - return ( -
- -
- ); - } -}; - -var AdsDataTableKeyboardSupportDecorator156 = function(props) { - if (props.x === 466) { - return ( -
- -
- ); - } -}; - -var AdsEditableDataTableDecorator157 = function(props) { - if (props.x === 467) { - return ( -
- -
- ); - } -}; - -var AdsPEDataTableContainer158 = function(props) { - if (props.x === 468) { - return ( -
- {null} - {null} - {null} - -
- ); - } -}; - -var AdsPECampaignGroupTableContainer159 = function(props) { - if (props.x === 470) { - return ; - } -}; - -var AdsPEManageAdsPaneContainer160 = function(props) { - if (props.x === 473) { - return ( -
- -
- -
-
- -
- - -
-
-
- -
- -
-
- -
-
-
- ); - } -}; - -var AdsPEContentContainer161 = function(props) { - if (props.x === 474) { - return ; - } -}; - -var FluxContainer_AdsPEWorkspaceContainer_162 = function(props) { - if (props.x === 477) { - return ( -
- - - {null} -
- ); - } -}; - -var FluxContainer_AdsSessionExpiredDialogContainer_163 = function(props) { - if (props.x === 478) { - return null; - } -}; - -var FluxContainer_AdsPEUploadDialogLazyContainer_164 = function(props) { - if (props.x === 479) { - return null; - } -}; - -var FluxContainer_DialogContainer_165 = function(props) { - if (props.x === 480) { - return null; - } -}; - -var AdsBugReportContainer166 = function(props) { - if (props.x === 481) { - return ; - } -}; - -var AdsPEAudienceSplittingDialog167 = function(props) { - if (props.x === 482) { - return null; - } -}; - -var AdsPEAudienceSplittingDialogContainer168 = function(props) { - if (props.x === 483) { - return ( -
- -
- ); - } -}; - -var FluxContainer_AdsRuleDialogBootloadContainer_169 = function(props) { - if (props.x === 484) { - return null; - } -}; - -var FluxContainer_AdsPECFTrayContainer_170 = function(props) { - if (props.x === 485) { - return null; - } -}; - -var FluxContainer_AdsPEDeleteDraftContainer_171 = function(props) { - if (props.x === 486) { - return null; - } -}; - -var FluxContainer_AdsPEInitialDraftPublishDialogContainer_172 = function(props) { - if (props.x === 487) { - return null; - } -}; - -var FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173 = function(props) { - if (props.x === 488) { - return null; - } -}; - -var FluxContainer_AdsPEPurgeArchiveDialogContainer_174 = function(props) { - if (props.x === 489) { - return null; - } -}; - -var AdsPECreateDialogContainer175 = function(props) { - if (props.x === 490) { - return ; - } -}; - -var FluxContainer_AdsPEModalStatusContainer_176 = function(props) { - if (props.x === 491) { - return null; - } -}; - -var FluxContainer_AdsBrowserExtensionErrorDialogContainer_177 = function(props) { - if (props.x === 492) { - return null; - } -}; - -var FluxContainer_AdsPESortByErrorTipContainer_178 = function(props) { - if (props.x === 493) { - return null; - } -}; - -var LeadDownloadDialogSelector179 = function(props) { - if (props.x === 494) { - return null; - } -}; - -var FluxContainer_AdsPELeadDownloadDialogContainerClass_180 = function(props) { - if (props.x === 495) { - return ; - } -}; - -var AdsPEContainer181 = function(props) { - if (props.x === 496) { - return ( -
- - {null} - - - - - - - - - - - - - - - - - - - -
-
- ); - } -}; - -var Benchmark = function(props) { - if (props.x === undefined) { - return ; - } -}; - -this.Benchmark = Benchmark; - -})(this); - diff --git a/scripts/bench/bench-pe.js b/scripts/bench/bench-pe.js deleted file mode 100644 index 5518abefa5a..00000000000 --- a/scripts/bench/bench-pe.js +++ /dev/null @@ -1,4235 +0,0 @@ -(function() { - -var ReactImage0 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 0) { - return ; - } - if (props.x === 15) { - return ; - } - if (props.x === 22) { - return ; - } - if (props.x === 29) { - return ; - } - if (props.x === 42) { - return ( - - {"Warning"} - - ); - } - if (props.x === 67) { - return ; - } - if (props.x === 70) { - return ; - } - if (props.x === 76) { - return ; - } - if (props.x === 79) { - return ; - } - if (props.x === 88) { - return ; - } - if (props.x === 91) { - return ; - } - if (props.x === 94) { - return ; - } - if (props.x === 98) { - return ; - } - if (props.x === 108) { - return ; - } - if (props.x === 111) { - return ; - } - if (props.x === 126) { - return ; - } - if (props.x === 127) { - return ; - } - if (props.x === 134) { - return ; - } - if (props.x === 135) { - return ; - } - if (props.x === 148) { - return ; - } - if (props.x === 152) { - return ; - } - if (props.x === 153) { - return ; - } - if (props.x === 160) { - return ; - } - if (props.x === 177) { - return ; - } - if (props.x === 186) { - return ; - } - if (props.x === 195) { - return ; - } - if (props.x === 198) { - return ; - } - if (props.x === 237) { - return ; - } - if (props.x === 266) { - return ; - } - if (props.x === 314) { - return ; - } - if (props.x === 345) { - return ; - } - if (props.x === 351) { - return ; - } - }, -}); - -var AbstractLink1 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 1) { - return ( - - {null} - - {null} - - {"Account:"} - {" "} - {"Dick Madanson (10149999073643408)"} - - - - - ); - } - if (props.x === 43) { - return ( - - {undefined} - {"Remove"} - {undefined} - - ); - } - if (props.x === 49) { - return ( - - - - ); - } - if (props.x === 128) { - return ( - - {null} - - - {"Search"} - - - - ); - } - if (props.x === 136) { - return ( - - {null} - - - {"Filters"} - - - - ); - } - if (props.x === 178) { - return ( - - {undefined} - {"Lifetime"} - - - ); - } - if (props.x === 207) { - return {"Create Ad Set"}; - } - if (props.x === 209) { - return {"View Ad Set"}; - } - if (props.x === 241) { - return {"Set a Limit"}; - } - if (props.x === 267) { - return ( - - {null} - - {null} - {"Links"} - - - - ); - } - }, -}); - -var Link2 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 2) { - return ; - } - if (props.x === 44) { - return ; - } - if (props.x === 50) { - return ; - } - if (props.x === 129) { - return ; - } - if (props.x === 137) { - return ; - } - if (props.x === 179) { - return ; - } - if (props.x === 208) { - return ; - } - if (props.x === 210) { - return ; - } - if (props.x === 242) { - return ; - } - if (props.x === 268) { - return ; - } - }, -}); - -var AbstractButton3 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 3) { - return ; - } - if (props.x === 20) { - return ( - - ); - } - if (props.x === 23) { - return ( - - ); - } - if (props.x === 45) { - return ; - } - if (props.x === 68) { - return ( - - ); - } - if (props.x === 71) { - return ( - - ); - } - if (props.x === 77) { - return ( - - ); - } - if (props.x === 80) { - return ( - - ); - } - if (props.x === 89) { - return ( - - ); - } - if (props.x === 92) { - return ( - - ); - } - if (props.x === 95) { - return ( - - ); - } - if (props.x === 99) { - return ( - - ); - } - if (props.x === 109) { - return ( - - ); - } - if (props.x === 112) { - return ( - - ); - } - if (props.x === 130) { - return ; - } - if (props.x === 138) { - return ; - } - if (props.x === 149) { - return ( - - ); - } - if (props.x === 156) { - return ( - - ); - } - if (props.x === 161) { - return ( - - ); - } - if (props.x === 180) { - return ; - } - if (props.x === 187) { - return ( - - ); - } - if (props.x === 269) { - return ; - } - if (props.x === 303) { - return ( - - ); - } - if (props.x === 305) { - return ( - - ); - } - if (props.x === 307) { - return ( - - ); - } - }, -}); - -var XUIButton4 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 4) { - return ; - } - if (props.x === 21) { - return ; - } - if (props.x === 24) { - return ; - } - if (props.x === 69) { - return ; - } - if (props.x === 72) { - return ; - } - if (props.x === 78) { - return ; - } - if (props.x === 81) { - return ; - } - if (props.x === 90) { - return ; - } - if (props.x === 93) { - return ; - } - if (props.x === 96) { - return ; - } - if (props.x === 100) { - return ; - } - if (props.x === 110) { - return ; - } - if (props.x === 113) { - return ; - } - if (props.x === 131) { - return ; - } - if (props.x === 139) { - return ; - } - if (props.x === 157) { - return ; - } - if (props.x === 162) { - return ; - } - if (props.x === 188) { - return ; - } - if (props.x === 270) { - return ; - } - if (props.x === 304) { - return ; - } - if (props.x === 306) { - return ; - } - if (props.x === 308) { - return ; - } - }, -}); - -var AbstractPopoverButton5 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 5) { - return ; - } - if (props.x === 132) { - return ; - } - if (props.x === 140) { - return ; - } - if (props.x === 271) { - return ; - } - }, -}); - -var ReactXUIPopoverButton6 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 6) { - return ; - } - if (props.x === 133) { - return ; - } - if (props.x === 141) { - return ; - } - if (props.x === 272) { - return ; - } - }, -}); - -var BIGAdAccountSelector7 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 7) { - return ( -
- - {null} -
- ); - } - }, -}); - -var FluxContainer_AdsPEBIGAdAccountSelectorContainer_8 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 8) { - return ; - } - }, -}); - -var ErrorBoundary9 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 9) { - return ; - } - if (props.x === 13) { - return ; - } - if (props.x === 27) { - return ; - } - if (props.x === 32) { - return ; - } - if (props.x === 38) { - return ; - } - if (props.x === 57) { - return ; - } - if (props.x === 60) { - return ; - } - if (props.x === 64) { - return ; - } - if (props.x === 124) { - return ; - } - if (props.x === 170) { - return ; - } - if (props.x === 175) { - return ; - } - if (props.x === 193) { - return ; - } - if (props.x === 301) { - return ; - } - if (props.x === 311) { - return ; - } - if (props.x === 471) { - return ; - } - if (props.x === 475) { - return ; - } - }, -}); - -var AdsErrorBoundary10 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 10) { - return ; - } - if (props.x === 14) { - return ; - } - if (props.x === 28) { - return ; - } - if (props.x === 33) { - return ; - } - if (props.x === 39) { - return ; - } - if (props.x === 58) { - return ; - } - if (props.x === 61) { - return ; - } - if (props.x === 65) { - return ; - } - if (props.x === 125) { - return ; - } - if (props.x === 171) { - return ; - } - if (props.x === 176) { - return ; - } - if (props.x === 194) { - return ; - } - if (props.x === 302) { - return ; - } - if (props.x === 312) { - return ; - } - if (props.x === 472) { - return ; - } - if (props.x === 476) { - return ; - } - }, -}); - -var AdsPENavigationBar11 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 11) { - return
; - } - }, -}); - -var FluxContainer_AdsPENavigationBarContainer_12 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 12) { - return ; - } - }, -}); - -var AdsPEDraftSyncStatus13 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 16) { - return ( -
- - - -
- ); - } - }, -}); - -var FluxContainer_AdsPEDraftSyncStatusContainer_14 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 17) { - return ; - } - }, -}); - -var AdsPEDraftErrorsStatus15 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 18) { - return null; - } - }, -}); - -var FluxContainer_viewFn_16 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 19) { - return ; - } - }, -}); - -var AdsPEPublishButton17 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 25) { - return ( -
- - - {null} - - -
- ); - } - }, -}); - -var FluxContainer_AdsPEPublishButtonContainer_18 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 26) { - return ; - } - }, -}); - -var InlineBlock19 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 30) { - return ( -
- -
- ); - } - if (props.x === 73) { - return ( -
- -
- ); - } - if (props.x === 82) { - return ( -
- -
- ); - } - if (props.x === 101) { - return ( -
- -
- ); - } - if (props.x === 273) { - return ( -
- -
- ); - } - }, -}); - -var ReactPopoverMenu20 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 31) { - return ; - } - if (props.x === 74) { - return ; - } - if (props.x === 83) { - return ; - } - if (props.x === 102) { - return ; - } - if (props.x === 274) { - return ; - } - }, -}); - -var LeftRight21 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 34) { - return ( -
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
-
-
- ); - } - if (props.x === 232) { - return ( -
-
- -
-
-
-
{"Clicks to Website"}
-
-
-
- ); - } - if (props.x === 235) { - return ( -
-
- -
-
-
-
{"Auction"}
-
-
-
- ); - } - if (props.x === 245) { - return ( -
-
- -
-
-
- -
-
-
- ); - } - if (props.x === 277) { - return ( -
-
- -
-
- -
-
- ); - } - }, -}); - -var AdsUnifiedNavigationLocalNav22 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 35) { - return ( -
- -
- ); - } - }, -}); - -var XUIDialog23 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 36) { - return null; - } - }, -}); - -var AdsPEResetDialog24 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 37) { - return ( - - - - ); - } - }, -}); - -var AdsPETopNav25 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 40) { - return ( -
- - -
- ); - } - }, -}); - -var FluxContainer_AdsPETopNavContainer_26 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 41) { - return ; - } - }, -}); - -var XUIAbstractGlyphButton27 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 46) { - return ; - } - if (props.x === 150) { - return ; - } - }, -}); - -var XUICloseButton28 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 47) { - return ; - } - if (props.x === 151) { - return ; - } - }, -}); - -var XUIText29 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 48) { - return {"Ads Manager"}; - } - if (props.x === 205) { - return {"Editing Campaign"}; - } - if (props.x === 206) { - return {"Test Campaign"}; - } - }, -}); - -var XUINotice30 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 51) { - return ( -
- - -
- {"Please go to "} - - {" to set up a payment method for this ad account."} -
-
- ); - } - }, -}); - -var ReactCSSTransitionGroupChild31 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 52) { - return ; - } - }, -}); - -var ReactTransitionGroup32 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 53) { - return ( - - - - ); - } - }, -}); - -var ReactCSSTransitionGroup33 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 54) { - return ; - } - }, -}); - -var AdsPETopError34 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 55) { - return ( -
- -
- ); - } - }, -}); - -var FluxContainer_AdsPETopErrorContainer_35 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 56) { - return ; - } - }, -}); - -var FluxContainer_AdsGuidanceChannel_36 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 59) { - return null; - } - }, -}); - -var ResponsiveBlock37 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 62) { - return ( -
- {[ - , - , - ]} -
- -
-
- ); - } - if (props.x === 469) { - return ( -
- -
- -
-
- ); - } - }, -}); - -var FluxContainer_AdsBulkEditDialogContainer_38 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 63) { - return null; - } - }, -}); - -var Column39 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 66) { - return ( -
-
- {null} - {null} -
- {null} -
-
- ); - } - }, -}); - -var XUIButtonGroup40 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 75) { - return ( -
- - -
- ); - } - if (props.x === 84) { - return ( -
- - -
- ); - } - if (props.x === 97) { - return ( -
- - - -
- ); - } - if (props.x === 117) { - return ( -
- - - -
- ); - } - }, -}); - -var AdsPEEditToolbarButton41 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 85) { - return ; - } - }, -}); - -var FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 86) { - return ; - } - }, -}); - -var FluxContainer_AdsPEEditToolbarButtonContainer_43 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 87) { - return ; - } - }, -}); - -var AdsPEExportImportMenu44 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 103) { - return ; - } - }, -}); - -var FluxContainer_AdsPECustomizeExportContainer_45 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 104) { - return null; - } - }, -}); - -var AdsPEExportAsTextDialog46 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 105) { - return null; - } - }, -}); - -var FluxContainer_AdsPEExportAsTextDialogContainer_47 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 106) { - return ; - } - }, -}); - -var AdsPEExportImportMenuContainer48 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 107) { - return ( - - - - - {null} - {null} - - ); - } - }, -}); - -var Constructor49 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 114) { - return null; - } - if (props.x === 142) { - return null; - } - if (props.x === 143) { - return null; - } - if (props.x === 183) { - return null; - } - }, -}); - -var TagSelectorPopover50 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 115) { - return ( - - - - - ); - } - }, -}); - -var AdsPECampaignGroupTagContainer51 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 116) { - return ; - } - }, -}); - -var AdsRuleToolbarMenu52 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 118) { - return null; - } - }, -}); - -var FluxContainer_AdsPERuleToolbarMenuContainer_53 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 119) { - return ; - } - }, -}); - -var FillColumn54 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 120) { - return ( -
- - - - - {null} - - - - - -
- ); - } - }, -}); - -var Layout55 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 121) { - return ( -
- - -
- ); - } - }, -}); - -var AdsPEMainPaneToolbar56 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 122) { - return ( -
- -
- ); - } - }, -}); - -var AdsPECampaignGroupToolbarContainer57 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 123) { - return ; - } - }, -}); - -var AdsPEFiltersPopover58 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 144) { - return ( - - - - {[ - , - , - ]} - - ); - } - }, -}); - -var AbstractCheckboxInput59 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 145) { - return ( - - ); - } - if (props.x === 336) { - return ( - - ); - } - }, -}); - -var XUICheckboxInput60 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 146) { - return ; - } - if (props.x === 337) { - return ; - } - }, -}); - -var InputLabel61 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 147) { - return ( -
- - -
- ); - } - }, -}); - -var AdsPopoverLink62 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 154) { - return ( - - - - - - {null} - - ); - } - if (props.x === 238) { - return ( - - - - - - {null} - - ); - } - }, -}); - -var AdsHelpLink63 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 155) { - return ; - } - if (props.x === 239) { - return ; - } - }, -}); - -var BUIFilterTokenInput64 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 158) { - return ( -
-
- -
- {"Campaigns: (1)"} - -
-
- -
- ); - } - }, -}); - -var BUIFilterToken65 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 159) { - return ( -
-
-
- -
{"Campaigns:"}
-
{"(1)"}
-
- {null} - -
- -
- ); - } - }, -}); - -var BUIFilterTokenCreateButton66 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 163) { - return ( -
- -
- ); - } - }, -}); - -var BUIFilterTokenizer67 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 164) { - return ( -
- {undefined} - {[]} - - - {null} -
-
- ); - } - }, -}); - -var XUIAmbientNUX68 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 165) { - return null; - } - if (props.x === 189) { - return null; - } - if (props.x === 200) { - return null; - } - }, -}); - -var XUIAmbientNUX69 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 166) { - return ; - } - if (props.x === 190) { - return ; - } - if (props.x === 201) { - return ; - } - }, -}); - -var AdsPEAmbientNUXMegaphone70 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 167) { - return ( - - - - - ); - } - }, -}); - -var AdsPEFilters71 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 168) { - return ( -
- -
- -
- - {""} - -
- ); - } - }, -}); - -var AdsPEFilterContainer72 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 169) { - return ; - } - }, -}); - -var AdsPETablePager73 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 172) { - return null; - } - }, -}); - -var AdsPECampaignGroupTablePagerContainer74 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 173) { - return ; - } - }, -}); - -var AdsPETablePagerContainer75 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 174) { - return ; - } - }, -}); - -var ReactXUIError76 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 181) { - return ; - } - if (props.x === 216) { - return ( -
- {null} - {null} -
-
-
- {null} - - {null} -
-
-
-
- {null} -
- ); - } - if (props.x === 221) { - return ; - } - if (props.x === 250) { - return ; - } - if (props.x === 280) { - return ; - } - }, -}); - -var BUIPopoverButton77 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 182) { - return ; - } - }, -}); - -var BUIDateRangePicker78 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 184) { - return ( - - - {[ - , - ]} - - ); - } - }, -}); - -var AdsPEStatsRangePicker79 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 185) { - return ; - } - }, -}); - -var AdsPEStatRange80 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 191) { - return ( -
- {"Stats:"} - - - - - {[ - , - ]} -
- ); - } - }, -}); - -var AdsPEStatRangeContainer81 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 192) { - return ; - } - }, -}); - -var AdsPESideTrayTabButton82 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 196) { - return ( -
- -
-
-
- ); - } - if (props.x === 199) { - return ( -
- -
-
-
- ); - } - if (props.x === 203) { - return null; - } - }, -}); - -var AdsPEEditorTrayTabButton83 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 197) { - return ; - } - }, -}); - -var AdsPEInsightsTrayTabButton84 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 202) { - return ( - - - - - ); - } - }, -}); - -var AdsPENekoDebuggerTrayTabButton85 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 204) { - return ; - } - }, -}); - -var AdsPEEditorChildLink86 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 211) { - return ( -
- - {"|"} - -
- ); - } - }, -}); - -var AdsPEEditorChildLinkContainer87 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 212) { - return ; - } - }, -}); - -var AdsPEHeaderSection88 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 213) { - return ( -
-
- -
-
- -
-
- -
- ); - } - }, -}); - -var AdsPECampaignGroupHeaderSectionContainer89 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 214) { - return ; - } - }, -}); - -var AdsEditorLoadingErrors90 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 215) { - return null; - } - }, -}); - -var AdsTextInput91 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 217) { - return ; - } - }, -}); - -var BUIFormElement92 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 218) { - return ( -
-
- -
-
-
- - - {null} - -
- {null} -
-
- ); - } - }, -}); - -var BUIForm93 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 219) { - return ( -
- -
- ); - } - }, -}); - -var XUICard94 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 220) { - return ( -
- -
- ); - } - if (props.x === 249) { - return ( -
- - -
- ); - } - if (props.x === 279) { - return ( -
- -
- ); - } - }, -}); - -var AdsCard95 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 222) { - return ; - } - if (props.x === 251) { - return ; - } - if (props.x === 281) { - return ; - } - }, -}); - -var AdsEditorNameSection96 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 223) { - return ; - } - }, -}); - -var AdsCampaignGroupNameSectionContainer97 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 224) { - return ; - } - }, -}); - -var _render98 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 225) { - return ; - } - }, -}); - -var AdsPluginWrapper99 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 226) { - return <_render98 x={225} />; - } - if (props.x === 255) { - return <_render111 x={254} />; - } - if (props.x === 258) { - return <_render113 x={257} />; - } - if (props.x === 287) { - return <_render127 x={286} />; - } - if (props.x === 291) { - return <_render130 x={290} />; - } - }, -}); - -var XUICardHeaderTitle100 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 227) { - return ( - - {"Campaign Details"} - {null} - - - ); - } - if (props.x === 265) { - return ( - - {[ - - {"Campaign ID"} - {": "} - {"98010048849317"} - , -
- -
, - ]} - {null} - -
- ); - } - }, -}); - -var XUICardSection101 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 228) { - return ( -
- {[ - , - ]} - {undefined} - {undefined} -
-
- ); - } - if (props.x === 247) { - return ( -
-
- - - - {null} - {null} -
-
- ); - } - }, -}); - -var XUICardHeader102 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 229) { - return ; - } - }, -}); - -var AdsCardHeader103 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 230) { - return ; - } - }, -}); - -var AdsLabeledField104 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 231) { - return ( -
- - {null} -
-
- ); - } - if (props.x === 234) { - return ( -
- - {null} -
-
- ); - } - if (props.x === 240) { - return ( -
- - -
-
- ); - } - }, -}); - -var FlexibleBlock105 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 233) { - return ; - } - if (props.x === 236) { - return ; - } - if (props.x === 246) { - return ; - } - }, -}); - -var AdsBulkCampaignSpendCapField106 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 243) { - return ( -
- {""} - - {" (optional)"} -
- ); - } - }, -}); - -var FluxContainer_AdsCampaignGroupSpendCapContainer_107 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 244) { - return ; - } - }, -}); - -var AdsCardSection108 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 248) { - return ; - } - }, -}); - -var AdsEditorCampaignGroupDetailsSection109 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 252) { - return ; - } - }, -}); - -var AdsEditorCampaignGroupDetailsSectionContainer110 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 253) { - return ; - } - }, -}); - -var _render111 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 254) { - return ; - } - }, -}); - -var FluxContainer_AdsEditorToplineDetailsSectionContainer_112 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 256) { - return null; - } - }, -}); - -var _render113 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 257) { - return ; - } - }, -}); - -var AdsStickyArea114 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 259) { - return ( -
-
-
- ); - } - if (props.x === 292) { - return ( -
-
- {[ -
- -
, - ]} -
-
- ); - } - }, -}); - -var FluxContainer_AdsEditorColumnContainer_115 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 260) { - return ( -
- {[ -
- -
, -
- -
, -
- -
, - ]} - -
- ); - } - if (props.x === 293) { - return ( -
- {[ -
- -
, - ]} - -
- ); - } - }, -}); - -var BUISwitch116 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 261) { - return ( -
-
-
-
- {null} -
- ); - } - }, -}); - -var AdsStatusSwitchInternal117 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 262) { - return ; - } - }, -}); - -var AdsStatusSwitch118 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 263) { - return ; - } - }, -}); - -var FluxContainer_AdsCampaignGroupStatusSwitchContainer_119 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 264) { - return ; - } - }, -}); - -var AdsLinksMenu120 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 275) { - return ; - } - }, -}); - -var FluxContainer_AdsPluginizedLinksMenuContainer_121 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 276) { - return ( -
- {null} - -
- ); - } - }, -}); - -var AdsCardLeftRightHeader122 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 278) { - return ; - } - }, -}); - -var AdsPEIDSection123 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 282) { - return ; - } - }, -}); - -var FluxContainer_AdsPECampaignGroupIDSectionContainer_124 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 283) { - return ; - } - }, -}); - -var DeferredComponent125 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 284) { - return ; - } - }, -}); - -var BootloadedComponent126 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 285) { - return ; - } - }, -}); - -var _render127 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 286) { - return ; - } - }, -}); - -var AdsEditorErrorsCard128 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 288) { - return null; - } - }, -}); - -var FluxContainer_FunctionalContainer_129 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 289) { - return ; - } - }, -}); - -var _render130 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 290) { - return ; - } - }, -}); - -var AdsEditorMultiColumnLayout131 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 294) { - return ( -
-
-
- -
-
- -
-
- -
-
-
-
-
- ); - } - }, -}); - -var AdsPECampaignGroupEditor132 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 295) { - return ( -
- - -
- ); - } - }, -}); - -var AdsPECampaignGroupEditorContainer133 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 296) { - return ; - } - }, -}); - -var AdsPESideTrayTabContent134 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 297) { - return ( -
- -
- ); - } - }, -}); - -var AdsPEEditorTrayTabContentContainer135 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 298) { - return ; - } - }, -}); - -var AdsPEMultiTabDrawer136 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 299) { - return ( -
-
- - - -
-
- - {null} -
-
- ); - } - }, -}); - -var FluxContainer_AdsPEMultiTabDrawerContainer_137 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 300) { - return ; - } - }, -}); - -var AdsPESimpleOrganizer138 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 309) { - return ( -
- - - -
- ); - } - }, -}); - -var AdsPEOrganizerContainer139 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 310) { - return ( -
- -
- ); - } - }, -}); - -var FixedDataTableColumnResizeHandle140 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 313) { - return ( -
-
-
- ); - } - }, -}); - -var AdsPETableHeader141 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 315) { - return ( -
- - {"Campaigns"} -
- ); - } - if (props.x === 320) { - return ( -
- {null} - {"Performance"} -
- ); - } - if (props.x === 323) { - return ( -
- {null} - {"Overview"} -
- ); - } - if (props.x === 326) { - return ( -
- {null} - {"Toplines"} -
- ); - } - if (props.x === 329) { - return
; - } - if (props.x === 340) { - return ( -
- {null} - {"Campaign Name"} -
- ); - } - if (props.x === 346) { - return ( -
- - {null} -
- ); - } - if (props.x === 352) { - return ( -
- - {null} -
- ); - } - if (props.x === 357) { - return ( -
- {null} - {"Status"} -
- ); - } - if (props.x === 362) { - return ( -
- {null} - {"Delivery"} -
- ); - } - if (props.x === 369) { - return ( -
- {null} - {"Results"} -
- ); - } - if (props.x === 374) { - return ( -
- {null} - {"Cost"} -
- ); - } - if (props.x === 379) { - return ( -
- {null} - {"Reach"} -
- ); - } - if (props.x === 384) { - return ( -
- {null} - {"Impressions"} -
- ); - } - if (props.x === 389) { - return ( -
- {null} - {"Clicks"} -
- ); - } - if (props.x === 394) { - return ( -
- {null} - {"Avg. CPM"} -
- ); - } - if (props.x === 399) { - return ( -
- {null} - {"Avg. CPC"} -
- ); - } - if (props.x === 404) { - return ( -
- {null} - {"CTR %"} -
- ); - } - if (props.x === 409) { - return ( -
- {null} - {"Spent"} -
- ); - } - if (props.x === 414) { - return ( -
- {null} - {"Objective"} -
- ); - } - if (props.x === 419) { - return ( -
- {null} - {"Buying Type"} -
- ); - } - if (props.x === 424) { - return ( -
- {null} - {"Campaign ID"} -
- ); - } - if (props.x === 429) { - return ( -
- {null} - {"Start"} -
- ); - } - if (props.x === 434) { - return ( -
- {null} - {"End"} -
- ); - } - if (props.x === 439) { - return ( -
- {null} - {"Date created"} -
- ); - } - if (props.x === 444) { - return ( -
- {null} - {"Date last edited"} -
- ); - } - if (props.x === 449) { - return ( -
- {null} - {"Tags"} -
- ); - } - if (props.x === 452) { - return
; - } - }, -}); - -var TransitionCell142 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 316) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 321) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 324) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 327) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 330) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 338) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 343) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 349) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 355) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 360) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 365) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 372) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 377) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 382) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 387) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 392) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 397) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 402) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 407) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 412) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 417) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 422) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 427) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 432) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 437) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 442) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 447) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 450) { - return ( -
-
-
- -
-
-
- ); - } - if (props.x === 453) { - return ( -
-
-
- -
-
-
- ); - } - }, -}); - -var FixedDataTableCell143 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 317) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 322) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 325) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 328) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 331) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 339) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 344) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 350) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 356) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 361) { - return ( -
- {undefined} - -
- ); - } - if (props.x === 366) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 373) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 378) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 383) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 388) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 393) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 398) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 403) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 408) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 413) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 418) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 423) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 428) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 433) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 438) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 443) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 448) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 451) { - return ( -
-
-
-
- -
- ); - } - if (props.x === 454) { - return ( -
- {undefined} - -
- ); - } - }, -}); - -var FixedDataTableCellGroupImpl144 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 318) { - return ( -
- -
- ); - } - if (props.x === 332) { - return ( -
- - - - -
- ); - } - if (props.x === 367) { - return ( -
- - - - - - -
- ); - } - if (props.x === 455) { - return ( -
- - - - - - - - - - - - - - - - - - -
- ); - } - }, -}); - -var FixedDataTableCellGroup145 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 319) { - return ( -
- -
- ); - } - if (props.x === 333) { - return ( -
- -
- ); - } - if (props.x === 368) { - return ( -
- -
- ); - } - if (props.x === 456) { - return ( -
- -
- ); - } - }, -}); - -var FixedDataTableRowImpl146 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 334) { - return ( -
-
- - -
-
-
- ); - } - if (props.x === 457) { - return ( -
-
- - -
-
-
- ); - } - }, -}); - -var FixedDataTableRow147 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 335) { - return ( -
- -
- ); - } - if (props.x === 458) { - return ( -
- -
- ); - } - }, -}); - -var FixedDataTableAbstractSortableHeader148 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 341) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 347) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 353) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 358) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 363) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 370) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 375) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 380) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 385) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 390) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 395) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 400) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 405) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 410) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 415) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 420) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 425) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 430) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 435) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 440) { - return ( -
-
- {null} - -
-
- ); - } - if (props.x === 445) { - return ( -
-
- {null} - -
-
- ); - } - }, -}); - -var FixedDataTableSortableHeader149 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 342) { - return ; - } - if (props.x === 348) { - return ; - } - if (props.x === 354) { - return ; - } - if (props.x === 359) { - return ; - } - if (props.x === 364) { - return ; - } - if (props.x === 371) { - return ; - } - if (props.x === 376) { - return ; - } - if (props.x === 381) { - return ; - } - if (props.x === 386) { - return ; - } - if (props.x === 391) { - return ; - } - if (props.x === 396) { - return ; - } - if (props.x === 401) { - return ; - } - if (props.x === 406) { - return ; - } - if (props.x === 411) { - return ; - } - if (props.x === 416) { - return ; - } - if (props.x === 421) { - return ; - } - if (props.x === 426) { - return ; - } - if (props.x === 431) { - return ; - } - if (props.x === 436) { - return ; - } - if (props.x === 441) { - return ; - } - if (props.x === 446) { - return ; - } - }, -}); - -var FixedDataTableBufferedRows150 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 459) { - return
; - } - }, -}); - -var Scrollbar151 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 460) { - return null; - } - if (props.x === 461) { - return ( -
-
-
- ); - } - }, -}); - -var HorizontalScrollbar152 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 462) { - return ( -
-
- -
-
- ); - } - }, -}); - -var FixedDataTable153 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 463) { - return ( -
-
- - - - - {null} - {undefined} -
-
- - -
- ); - } - }, -}); - -var TransitionTable154 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 464) { - return ; - } - }, -}); - -var AdsSelectableFixedDataTable155 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 465) { - return ( -
- -
- ); - } - }, -}); - -var AdsDataTableKeyboardSupportDecorator156 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 466) { - return ( -
- -
- ); - } - }, -}); - -var AdsEditableDataTableDecorator157 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 467) { - return ( -
- -
- ); - } - }, -}); - -var AdsPEDataTableContainer158 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 468) { - return ( -
- {null} - {null} - {null} - -
- ); - } - }, -}); - -var AdsPECampaignGroupTableContainer159 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 470) { - return ; - } - }, -}); - -var AdsPEManageAdsPaneContainer160 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 473) { - return ( -
- -
- -
-
- -
- - -
-
-
- -
- -
-
- -
-
-
- ); - } - }, -}); - -var AdsPEContentContainer161 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 474) { - return ; - } - }, -}); - -var FluxContainer_AdsPEWorkspaceContainer_162 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 477) { - return ( -
- - - {null} -
- ); - } - }, -}); - -var FluxContainer_AdsSessionExpiredDialogContainer_163 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 478) { - return null; - } - }, -}); - -var FluxContainer_AdsPEUploadDialogLazyContainer_164 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 479) { - return null; - } - }, -}); - -var FluxContainer_DialogContainer_165 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 480) { - return null; - } - }, -}); - -var AdsBugReportContainer166 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 481) { - return ; - } - }, -}); - -var AdsPEAudienceSplittingDialog167 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 482) { - return null; - } - }, -}); - -var AdsPEAudienceSplittingDialogContainer168 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 483) { - return ( -
- -
- ); - } - }, -}); - -var FluxContainer_AdsRuleDialogBootloadContainer_169 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 484) { - return null; - } - }, -}); - -var FluxContainer_AdsPECFTrayContainer_170 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 485) { - return null; - } - }, -}); - -var FluxContainer_AdsPEDeleteDraftContainer_171 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 486) { - return null; - } - }, -}); - -var FluxContainer_AdsPEInitialDraftPublishDialogContainer_172 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 487) { - return null; - } - }, -}); - -var FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 488) { - return null; - } - }, -}); - -var FluxContainer_AdsPEPurgeArchiveDialogContainer_174 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 489) { - return null; - } - }, -}); - -var AdsPECreateDialogContainer175 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 490) { - return ; - } - }, -}); - -var FluxContainer_AdsPEModalStatusContainer_176 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 491) { - return null; - } - }, -}); - -var FluxContainer_AdsBrowserExtensionErrorDialogContainer_177 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 492) { - return null; - } - }, -}); - -var FluxContainer_AdsPESortByErrorTipContainer_178 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 493) { - return null; - } - }, -}); - -var LeadDownloadDialogSelector179 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 494) { - return null; - } - }, -}); - -var FluxContainer_AdsPELeadDownloadDialogContainerClass_180 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 495) { - return ; - } - }, -}); - -var AdsPEContainer181 = React.createClass({ - render: function() { - var props = this.props; - if (props.x === 496) { - return ( -
- - {null} - - - - - - - - - - - - - - - - - - - -
-
- ); - } - }, -}); - -var Benchmark = React.createClass({ - render: function() { - var props = this.props; - if (props.x === undefined) { - return ; - } - }, -}); - -this.Benchmark = Benchmark; - -})(this); diff --git a/scripts/bench/benchmark.js b/scripts/bench/benchmark.js new file mode 100644 index 00000000000..996f3203c4d --- /dev/null +++ b/scripts/bench/benchmark.js @@ -0,0 +1,130 @@ +'use strict'; + +const Lighthouse = require('lighthouse'); +const chromeLauncher = require('chrome-launcher'); + +const stats = require('stats-analysis'); +const config = require('lighthouse/lighthouse-core/config/perf-config'); +const spawn = require('child_process').spawn; +const os = require('os'); + +const timesToRun = 10; + +function wait(val) { + return new Promise(resolve => setTimeout(resolve, val)); +} + +async function runScenario(benchmark, chrome) { + const port = chrome.port; + const results = await Lighthouse( + `http://localhost:8080/${benchmark}/`, + { + output: 'json', + port, + }, + config + ); + + const perfMarkings = results.lhr.audits['user-timings'].details.items; + const entries = perfMarkings + .filter(({timingType}) => timingType !== 'Mark') + .map(({duration, name}) => ({ + entry: name, + time: duration, + })); + entries.push({ + entry: 'First Meaningful Paint', + time: results.lhr.audits['first-meaningful-paint'].rawValue, + }); + + return entries; +} + +function bootstrap(data) { + const len = data.length; + const arr = Array(len); + for (let j = 0; j < len; j++) { + arr[j] = data[(Math.random() * len) | 0]; + } + return arr; +} + +function calculateStandardErrorOfMean(data) { + const means = []; + for (let i = 0; i < 10000; i++) { + means.push(stats.mean(bootstrap(data))); + } + return stats.stdev(means); +} + +function calculateAverages(runs) { + const data = []; + const averages = []; + + runs.forEach((entries, x) => { + entries.forEach(({entry, time}, i) => { + if (i >= averages.length) { + data.push([time]); + averages.push({ + entry, + mean: 0, + sem: 0, + }); + } else { + data[i].push(time); + if (x === runs.length - 1) { + const dataWithoutOutliers = stats.filterMADoutliers(data[i]); + averages[i].mean = stats.mean(dataWithoutOutliers); + averages[i].sem = calculateStandardErrorOfMean(data[i]); + } + } + }); + }); + + return averages; +} + +async function initChrome() { + const platform = os.platform(); + + if (platform === 'linux') { + process.env.XVFBARGS = '-screen 0, 1024x768x16'; + process.env.LIGHTHOUSE_CHROMIUM_PATH = 'chromium-browser'; + const child = spawn('xvfb start', [{detached: true, stdio: ['ignore']}]); + child.unref(); + // wait for chrome to load then continue + await wait(3000); + return child; + } +} + +async function launchChrome(headless) { + return await chromeLauncher.launch({ + chromeFlags: [headless ? '--headless' : ''], + }); +} + +async function runBenchmark(benchmark, headless) { + const results = { + runs: [], + averages: [], + }; + + await initChrome(); + + for (let i = 0; i < timesToRun; i++) { + let chrome = await launchChrome(headless); + + results.runs.push(await runScenario(benchmark, chrome)); + // add a delay or sometimes it confuses lighthouse and it hangs + await wait(500); + try { + await chrome.kill(); + } catch (e) {} + } + + results.averages = calculateAverages(results.runs); + return results; +} + +module.exports = runBenchmark; diff --git a/scripts/bench/benchmarks/hacker-news/benchmark.js b/scripts/bench/benchmarks/hacker-news/benchmark.js new file mode 100644 index 00000000000..d164c1f8bf3 --- /dev/null +++ b/scripts/bench/benchmarks/hacker-news/benchmark.js @@ -0,0 +1,315 @@ +(function () { + 'use strict'; + + const e = React.createElement; + + function timeAge(time) { + const now = new Date().getTime() / 1000; + const minutes = (now - time) / 60; + + if (minutes < 60) { + return Math.round(minutes) + ' minutes ago'; + } + return Math.round(minutes / 60) + ' hours ago'; + } + + function getHostUrl(url) { + return (url + '') + .replace('https://', '') + .replace('http://', '') + .split('/')[0]; + } + + function HeaderBar() { + return e( + 'tr', + { + style: { + backgroundColor: '#222', + }, + }, + e( + 'table', + { + style: { + padding: 4, + }, + width: '100%', + cellSpacing: 0, + cellPadding: 0, + }, + e( + 'tbody', + null, + e( + 'tr', + null, + e( + 'td', + { + style: { + width: 18, + paddingRight: 4, + }, + }, + e( + 'a', + { + href: '#', + }, + e('img', { + src: 'logo.png', + width: 16, + height: 16, + style: { + border: '1px solid #00d8ff', + }, + }) + ) + ), + e( + 'td', + { + style: { + lineHeight: '12pt', + }, + height: 10, + }, + e( + 'span', + { + className: 'pagetop', + }, + e('b', {className: 'hnname'}, 'React HN Benchmark'), + e('a', {href: '#'}, 'new'), + ' | ', + e('a', {href: '#'}, 'comments'), + ' | ', + e('a', {href: '#'}, 'show'), + ' | ', + e('a', {href: '#'}, 'ask'), + ' | ', + e('a', {href: '#'}, 'jobs'), + ' | ', + e('a', {href: '#'}, 'submit') + ) + ) + ) + ) + ) + ); + } + + function Story({story, rank}) { + return [ + e( + 'tr', + { + className: 'athing', + }, + e( + 'td', + { + style: { + verticalAlign: 'top', + textAlign: 'right', + }, + className: 'title', + }, + e( + 'span', + { + className: 'rank', + }, + `${rank}.` + ) + ), + e( + 'td', + { + className: 'votelinks', + style: { + verticalAlign: 'top', + }, + }, + e( + 'center', + null, + e( + 'a', + { + href: '#', + }, + e('div', { + className: 'votearrow', + title: 'upvote', + }) + ) + ) + ), + e( + 'td', + { + className: 'title', + }, + e( + 'a', + { + href: '#', + className: 'storylink', + }, + story.title + ), + story.url + ? e( + 'span', + { + className: 'sitebit comhead', + }, + ' (', + e( + 'a', + { + href: '#', + }, + getHostUrl(story.url) + ), + ')' + ) + : null + ) + ), + e( + 'tr', + null, + e('td', { + colSpan: 2, + }), + e( + 'td', + { + className: 'subtext', + }, + e( + 'span', + { + className: 'score', + }, + `${story.score} points` + ), + ' by ', + e( + 'a', + { + href: '#', + className: 'hnuser', + }, + story.by + ), + ' ', + e( + 'span', + { + className: 'age', + }, + e( + 'a', + { + href: '#', + }, + timeAge(story.time) + ) + ), + ' | ', + e( + 'a', + { + href: '#', + }, + 'hide' + ), + ' | ', + e( + 'a', + { + href: '#', + }, + `${story.descendants || 0} comments` + ) + ) + ), + e('tr', { + style: { + height: 5, + }, + className: 'spacer', + }), + ]; + } + + function StoryList({stories}) { + return e( + 'tr', + null, + e( + 'td', + null, + e( + 'table', + { + cellPadding: 0, + cellSpacing: 0, + classList: 'itemlist', + }, + e( + 'tbody', + null, + stories.map((story, i) => + e(Story, {story, rank: ++i, key: story.id}) + ) + ) + ) + ) + ); + } + + function App({stories}) { + return e( + 'center', + null, + e( + 'table', + { + id: 'hnmain', + border: 0, + cellPadding: 0, + cellSpacing: 0, + width: '85%', + style: { + 'background-color': '#f6f6ef', + }, + }, + e( + 'tbody', + null, + e(HeaderBar, null), + e('tr', {height: 10}), + e(StoryList, { + stories, + }) + ) + ) + ); + } + + const app = document.getElementById('app'); + + window.render = function render() { + ReactDOM.render( + React.createElement(App, { + stories: window.stories, + }), + app + ); + }; +})(); diff --git a/scripts/bench/benchmarks/hacker-news/build.js b/scripts/bench/benchmarks/hacker-news/build.js new file mode 100644 index 00000000000..ffbd82637d2 --- /dev/null +++ b/scripts/bench/benchmarks/hacker-news/build.js @@ -0,0 +1,17 @@ +'use strict'; + +const {join} = require('path'); + +async function build(reactPath, asyncCopyTo) { + // copy the UMD bundles + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react.production.js'), + join(__dirname, 'react.production.js') + ); + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react-dom.production.js'), + join(__dirname, 'react-dom.production.js') + ); +} + +module.exports = build; diff --git a/scripts/bench/benchmarks/hacker-news/generate.js b/scripts/bench/benchmarks/hacker-news/generate.js new file mode 100644 index 00000000000..eb0cdb03874 --- /dev/null +++ b/scripts/bench/benchmarks/hacker-news/generate.js @@ -0,0 +1,33 @@ +'use strict'; + +const fetch = require('node-fetch'); +const {writeFileSync} = require('fs'); +const stories = 50; + +async function getStory(id) { + const storyRes = await fetch( + `https://hacker-news.firebaseio.com/v0/item/${id}.json` + ); + return await storyRes.json(); +} + +async function getTopStories() { + const topStoriesRes = await fetch( + 'https://hacker-news.firebaseio.com/v0/topstories.js' + ); + const topStoriesIds = await topStoriesRes.json(); + + const topStories = []; + for (let i = 0; i < stories; i++) { + const topStoriesId = topStoriesIds[i]; + + topStories.push(await getStory(topStoriesId)); + } + + writeFileSync( + 'top-stories.json', + `window.stories = ${JSON.stringify(topStories)}` + ); +} + +getTopStories(); diff --git a/scripts/bench/benchmarks/hacker-news/grayarrow.gif b/scripts/bench/benchmarks/hacker-news/grayarrow.gif new file mode 100644 index 00000000000..888485fa5b0 Binary files /dev/null and b/scripts/bench/benchmarks/hacker-news/grayarrow.gif differ diff --git a/scripts/bench/benchmarks/hacker-news/index.html b/scripts/bench/benchmarks/hacker-news/index.html new file mode 100644 index 00000000000..a66e6c6561c --- /dev/null +++ b/scripts/bench/benchmarks/hacker-news/index.html @@ -0,0 +1,37 @@ + + + React Hacker News Benchmark + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/scripts/bench/benchmarks/hacker-news/logo.png b/scripts/bench/benchmarks/hacker-news/logo.png new file mode 100644 index 00000000000..ee4ac0b2dfa Binary files /dev/null and b/scripts/bench/benchmarks/hacker-news/logo.png differ diff --git a/scripts/bench/benchmarks/hacker-news/style.css b/scripts/bench/benchmarks/hacker-news/style.css new file mode 100644 index 00000000000..588bd99ae99 --- /dev/null +++ b/scripts/bench/benchmarks/hacker-news/style.css @@ -0,0 +1,57 @@ +body { + font-family: Verdana, Geneva, sans-serif +} + +.pagetop { + font-family: Verdana, Geneva, sans-serif; + font-size: 10pt; + color: #00d8ff; +} + +.hnname { + margin-right: 10px; + color: #fff; +} + +.pagetop a, .pagetop a:visited { + color: #00d8ff; + text-decoration: none; +} + +.title { + font-family: Verdana, Geneva, sans-serif; + font-size: 10pt; + color: #828282; +} + +.subtext { + font-family: Verdana, Geneva, sans-serif; + font-size: 7pt; + color: #828282; +} + +.comhead a:link, .subtext a, .subtext a:visited { + color: #828282; + text-decoration: none; +} + +.votearrow { + width: 10px; + height: 10px; + border: 0px; + margin: 3px 2px 6px; + background: url(grayarrow.gif) no-repeat; +} + +.title, .title a { + font-family: Verdana, Geneva, sans-serif; + font-size: 10pt; + color: #000; + text-decoration: none; +} + +.comhead, .comhead a { + font-family: Verdana, Geneva, sans-serif; + font-size: 8pt; + color: #828282; +} \ No newline at end of file diff --git a/scripts/bench/benchmarks/hacker-news/top-stories.js b/scripts/bench/benchmarks/hacker-news/top-stories.js new file mode 100644 index 00000000000..8e4a9cafd66 --- /dev/null +++ b/scripts/bench/benchmarks/hacker-news/top-stories.js @@ -0,0 +1,712 @@ +window.stories = [ + { + by: 'rendx', + descendants: 49, + id: 14201562, + kids: [ + 14201704, 14202297, 14202233, 14201771, 14201765, 14201897, 14201750, + 14201913, 14201854, 14201667, 14201759, 14202073, + ], + score: 186, + time: 1493197629, + title: + 'Postal: Open source mail delivery platform, alternative to Mailgun or Sendgrid', + type: 'story', + url: 'https://github.com/atech/postal', + }, + { + by: 'rabyss', + descendants: 4, + id: 14202124, + kids: [14202293, 14202249], + score: 16, + time: 1493205989, + title: + 'Show HN: BreakLock – A hybrid of Mastermind and the Android pattern lock', + type: 'story', + url: 'https://maxwellito.github.io/breaklock/', + }, + { + by: 'morid1n', + descendants: 137, + id: 14200563, + kids: [ + 14201274, 14200711, 14201147, 14201365, 14201499, 14200618, 14201169, + 14200911, 14200734, 14201083, 14200706, 14200785, 14201032, + ], + score: 178, + time: 1493183234, + title: 'My Hackintosh Hardware Spec – clean, based on a 2013 iMac', + type: 'story', + url: 'https://infinitediaries.net/my-exact-hackintosh-spec/', + }, + { + by: 'robertwiblin', + descendants: 203, + id: 14196731, + kids: [ + 14201298, 14201838, 14201381, 14197574, 14201398, 14199764, 14198491, + 14197000, 14198224, 14200614, 14201983, 14200697, 14199252, 14201214, + 14198923, 14200224, 14197509, 14200859, 14200064, 14200114, 14197256, + 14197220, 14200653, 14197186, 14199258, 14197155, 14197344, 14198361, + 14197969, 14199813, 14197259, 14197503, + ], + score: 562, + time: 1493145853, + title: "Evidence-based advice we've found on how to be successful in a job", + type: 'story', + url: 'https://80000hours.org/career-guide/how-to-be-successful/', + }, + { + by: 'ryan_j_naughton', + descendants: 565, + id: 14196812, + kids: [ + 14198306, 14197339, 14200899, 14198165, 14198750, 14202199, 14201432, + 14197619, 14197471, 14201113, 14202214, 14202043, 14197313, 14197751, + 14197332, 14198050, 14201616, 14197404, 14199730, 14198007, 14197358, + 14197283, 14200959, 14197891, 14198203, 14197312, 14200796, 14201528, + 14197249, 14198271, 14197989, 14198842, 14197205, 14199148, 14197458, + 14200457, 14197330, 14199993, 14197855, 14200102, 14197378, 14199315, + 14198240, 14198397, 14199326, 14200159, 14198798, 14201296, 14198173, + 14197323, 14197383, 14197459, 14197275, 14198305, 14198005, 14198015, + 14199380, 14199079, 14198413, 14197334, 14197327, 14197234, + ], + score: 385, + time: 1493146342, + title: 'Is Every Speed Limit Too Low?', + type: 'story', + url: 'https://priceonomics.com/is-every-speed-limit-too-low/', + }, + { + by: 'monort', + descendants: 63, + id: 14196322, + kids: [ + 14197628, 14200026, 14197457, 14197486, 14202126, 14201266, 14197227, + 14199404, 14199338, 14196382, 14200598, 14197377, 14199689, 14198538, + 14196905, 14200404, 14198781, 14197278, 14197888, 14197742, 14197764, + ], + score: 316, + time: 1493143464, + title: 'Experimental Nighttime Photography with Nexus and Pixel', + type: 'story', + url: 'https://research.googleblog.com/2017/04/experimental-nighttime-photography-with.html', + }, + { + by: 'networked', + descendants: 9, + id: 14199028, + kids: [14201588, 14200361, 14200314, 14200338], + score: 121, + time: 1493161601, + title: 'JPEG Huffman Coding Tutorial', + type: 'story', + url: 'https://www.impulseadventure.com/photo/jpeg-huffman-coding.html', + }, + { + by: 'jasontan', + id: 14202227, + score: 1, + time: 1493207865, + title: + 'Are you adept at understanding concurrency problems? Sift Science is hiring', + type: 'job', + url: 'https://boards.greenhouse.io/siftscience/jobs/550699#.WPUZhlMrLfY', + }, + { + by: 'pouwerkerk', + descendants: 80, + id: 14196077, + kids: [ + 14199434, 14196279, 14196604, 14197440, 14201734, 14200922, 14200452, + 14197115, 14199837, 14199894, 14196596, 14198243, 14196565, 14197400, + 14197049, 14197686, 14198545, 14198475, + ], + score: 717, + time: 1493142008, + title: + 'Painting with Code: Introducing our new open source library React Sketch.app', + type: 'story', + url: 'https://airbnb.design/painting-with-code/', + }, + { + by: 'mromnia', + descendants: 16, + id: 14201670, + kids: [ + 14201835, 14202115, 14202176, 14201890, 14202325, 14201859, 14202158, + 14201763, 14201902, + ], + score: 62, + time: 1493198949, + title: 'How to mod a Porsche 911 to run Doom [video]', + type: 'story', + url: 'https://www.youtube.com/watch?v=NRMpNA86e8Q', + }, + { + by: 'rbanffy', + descendants: 16, + id: 14192383, + kids: [14197494, 14201805, 14197484], + score: 194, + time: 1493118160, + title: 'Go programming language secure coding practices guide', + type: 'story', + url: 'https://github.com/Checkmarx/Go-SCP', + }, + { + by: 'intous', + descendants: 0, + id: 14200446, + score: 39, + time: 1493181245, + title: 'Building Functional Chatbot for Messenger with Ruby on Rails', + type: 'story', + url: 'https://tutorials.botsfloor.com/chatbot-development-tutorial-how-to-build-a-fully-functional-weather-bot-on-facebook-messenger-c94ac7c59185', + }, + { + by: 'nanospeck', + descendants: 23, + id: 14201207, + kids: [ + 14202252, 14201646, 14201620, 14202076, 14201511, 14201324, 14201940, + 14201425, 14201505, 14201304, 14201435, 14201287, 14201739, 14202031, + 14202018, + ], + score: 57, + text: 'This question was asked on both 2015 & 2016 in HN. I would like to ask it again today to know what are the newest options for this.

Q: What would you recommend as a reasonably priced (sub 150$) quad-copter/drone, that has a camera, the ability to be programmed (so that I can process video/write my own stability algorithms for it), good range, and reasonable flying time?\nIn the event nothing fits that price point, any pointers on what the state of the art is?

Thanks!', + time: 1493192641, + title: 'Ask HN (again): What is the best affordable programmable drone?', + type: 'story', + }, + { + by: 'geuis', + descendants: 57, + id: 14196708, + kids: [ + 14197480, 14198523, 14198705, 14200969, 14200079, 14197605, 14198979, + 14202203, 14197679, 14198461, 14200389, 14198065, 14197883, 14197908, + ], + score: 123, + time: 1493145655, + title: 'Hackpad shutting down', + type: 'story', + url: 'https://hackpad.com/', + }, + { + by: 'jfoutz', + descendants: 55, + id: 14195956, + kids: [ + 14199594, 14196972, 14202101, 14198197, 14196771, 14197326, 14196956, + 14200842, 14201529, 14198581, 14196777, 14200177, 14200422, 14198571, + ], + score: 167, + time: 1493141367, + title: 'Linkerd 1.0', + type: 'story', + url: 'https://blog.buoyant.io/2017/04/25/announcing-linkerd-1.0/index.html', + }, + { + by: 'DavidBuchanan', + descendants: 19, + id: 14199364, + kids: [ + 14199735, 14200889, 14202245, 14200205, 14200104, 14201697, 14200061, + 14199996, 14199867, + ], + score: 66, + time: 1493164755, + title: + "Show HN: TARDIS – Warp a process's perspective of time by hooking syscalls", + type: 'story', + url: 'https://github.com/DavidBuchanan314/TARDIS', + }, + { + by: 'rchen8', + descendants: 121, + id: 14195664, + kids: [ + 14196654, 14196206, 14196677, 14197035, 14196041, 14196399, 14196200, + 14196140, 14196216, 14196421, 14196370, 14196146, 14197601, 14197107, + 14196866, 14196691, 14197704, 14196772, 14200089, 14198588, 14196937, + 14198530, 14197119, 14197247, 14198632, 14196137, 14200323, 14196346, + ], + score: 486, + time: 1493139957, + title: 'How to Become Well-Connected', + type: 'story', + url: 'https://firstround.com/review/how-to-become-insanely-well-connected/', + }, + { + by: 'dbrgn', + descendants: 89, + id: 14191186, + kids: [ + 14200855, 14200035, 14200110, 14201408, 14202159, 14197876, 14200348, + 14198720, 14198183, 14199824, 14198281, 14201643, 14201591, 14199541, + 14198423, 14201738, 14200037, 14201349, 14200028, 14201206, 14197995, + 14197830, 14199603, + ], + score: 135, + time: 1493100791, + title: 'How to Say (Almost) Everything in a Hundred-Word Language (2015)', + type: 'story', + url: 'https://www.theatlantic.com/technology/archive/2015/07/toki-pona-smallest-language/398363/?single_page=true', + }, + { + by: 'runesoerensen', + descendants: 62, + id: 14198866, + kids: [14199494, 14199495, 14200288, 14201118, 14199599], + score: 155, + time: 1493160263, + title: 'Nginx 1.13 released with TLS 1.3 support', + type: 'story', + url: 'https://mailman.nginx.org/pipermail/nginx-announce/2017/000195.html', + }, + { + by: 'bcherny', + descendants: 20, + id: 14199299, + kids: [ + 14200694, 14201832, 14200517, 14201760, 14200966, 14200558, 14201815, + 14201231, 14201073, 14201124, + ], + score: 54, + time: 1493163960, + title: 'Show HN: JSONSchema to TypeScript compiler', + type: 'story', + url: 'https://github.com/bcherny/json-schema-to-typescript', + }, + { + by: 'tormeh', + descendants: 37, + id: 14198557, + kids: [14201027, 14199082, 14201023, 14201160, 14200367, 14200647], + score: 70, + time: 1493158034, + title: 'A practitioner’s guide to hedonism (2007)', + type: 'story', + url: 'https://www.1843magazine.com/story/a-practitioners-guide-to-hedonism', + }, + { + by: 'nickreiner', + descendants: 33, + id: 14199125, + kids: [ + 14202332, 14201634, 14201200, 14201215, 14201157, 14201898, 14201969, + 14201125, + ], + score: 52, + time: 1493162517, + title: 'Best Linux Distros for Gaming in 2017', + type: 'story', + url: 'https://thishosting.rocks/best-linux-distros-for-gaming/', + }, + { + by: 'BinaryIdiot', + descendants: 170, + id: 14200486, + kids: [ + 14200680, 14200677, 14201515, 14200793, 14200534, 14200908, 14200649, + 14200633, 14200701, 14202295, 14200578, 14200709, 14200580, 14201107, + 14201779, 14200773, 14200804, 14200720, 14202060, 14200948, 14200903, + 14200748, 14200875, 14200750, 14200821, 14200756, 14201707, 14201689, + 14200669, 14200997, 14200818, 14201586, 14200603, 14201054, 14201457, + 14200616, 14201095, 14200915, 14200878, 14200629, 14201523, 14200620, + 14202099, + ], + score: 316, + time: 1493181945, + title: 'Suicide of an Uber engineer: Widow blames job stress', + type: 'story', + url: 'https://www.sfchronicle.com/business/article/Suicide-of-an-Uber-engineer-widow-blames-job-11095807.php?t=7e40d1f554&cmpid=fb-premium&cmpid=twitter-premium', + }, + { + by: 'catc', + descendants: 34, + id: 14195522, + kids: [ + 14202316, 14202278, 14197167, 14199152, 14202077, 14197239, 14197721, + 14197632, 14197219, 14198296, 14197245, 14197201, 14197403, 14198051, + 14196747, + ], + score: 87, + time: 1493139414, + title: + 'Show HN: React Timekeeper – Time picker based on the style of Google Keep', + type: 'story', + url: 'https://catc.github.io/react-timekeeper/', + }, + { + by: 'Integer', + descendants: 152, + id: 14192353, + kids: [ + 14197671, 14197754, 14199091, 14198533, 14201249, 14198626, 14198263, + 14198009, 14195130, 14199551, 14197663, 14198285, 14199611, 14199835, + 14197482, 14198924, 14198943, + ], + score: 273, + time: 1493117771, + title: 'Windows Is Bloated, Thanks to Adobe’s Extensible Metadata Platform', + type: 'story', + url: 'https://www.thurrott.com/windows/109962/windows-bloated-thanks-adobes-extensible-metadata-platform', + }, + { + by: 'craigcannon', + descendants: 23, + id: 14197852, + kids: [ + 14200024, 14199986, 14202106, 14198011, 14199228, 14202138, 14198917, + 14198607, + ], + score: 58, + time: 1493153342, + title: 'New England Lost Ski Areas Project', + type: 'story', + url: 'http://www.nelsap.org/', + }, + { + by: 'golfer', + descendants: 105, + id: 14198229, + kids: [ + 14200202, 14198948, 14199770, 14198634, 14200263, 14198797, 14198919, + 14200447, 14198645, 14199267, 14199124, 14198833, 14199059, + ], + score: 282, + time: 1493155745, + title: + 'Uber must turn over information about its acquisition of Otto to Waymo', + type: 'story', + url: 'https://techcrunch.com/2017/04/25/uber-must-turn-over-information-about-its-acquisition-of-otto-to-waymo-court-rules/', + }, + { + by: 'JoshTriplett', + descendants: 116, + id: 14198403, + kids: [ + 14199771, 14199980, 14198664, 14198764, 14201086, 14200307, 14199294, + 14198860, 14198817, + ], + score: 139, + time: 1493156882, + title: 'Shutting down public FTP services', + type: 'story', + url: 'https://lists.debian.org/debian-announce/2017/msg00001.html', + }, + { + by: 'mabynogy', + descendants: 50, + id: 14191577, + kids: [ + 14194021, 14195402, 14193886, 14193792, 14194355, 14197136, 14200386, + 14194151, 14193989, 14193798, 14194042, 14197100, 14198984, 14193925, + 14194170, + ], + score: 365, + time: 1493107104, + title: 'A Primer on Bézier Curves', + type: 'story', + url: 'https://pomax.github.io/bezierinfo#preface', + }, + { + by: 'robertothais', + descendants: 29, + id: 14192946, + kids: [ + 14202311, 14202299, 14201900, 14200029, 14198260, 14198605, 14201850, + 14199858, 14198223, 14198610, + ], + score: 61, + time: 1493124627, + title: 'Consciousness as a State of Matter (2014)', + type: 'story', + url: 'https://arxiv.org/abs/1401.1219', + }, + { + by: 'leephillips', + descendants: 2, + id: 14202078, + kids: [14202122], + score: 5, + time: 1493205152, + title: + 'The Republican Lawmaker Who Secretly Created Reddit’s Women-Hating ‘Red Pill’', + type: 'story', + url: 'http://www.thedailybeast.com/articles/2017/04/25/the-republican-lawmaker-who-secretly-created-reddit-s-women-hating-red-pill.html', + }, + { + by: 'anguswithgusto', + descendants: 55, + id: 14196325, + kids: [ + 14197131, 14196789, 14197299, 14197466, 14196737, 14199929, 14197550, + 14197511, 14196888, 14200109, 14197101, + ], + score: 80, + time: 1493143475, + title: + 'Gett in advanced talks to buy Juno for $250M as Uber rivals consolidate', + type: 'story', + url: 'https://techcrunch.com/2017/04/25/gett-in-advanced-talks-to-buy-juno-for-250m-as-uber-rivals-consolidate/', + }, + { + by: 'fabuzaid', + descendants: 2, + id: 14196339, + kids: [14201557, 14201170], + score: 46, + time: 1493143560, + title: 'Implementing a Fast Research Compiler in Rust', + type: 'story', + url: 'https://dawn.cs.stanford.edu/blog/weld.html', + }, + { + by: 'bluesilver07', + descendants: 61, + id: 14196154, + kids: [ + 14197614, 14196853, 14197074, 14197050, 14200090, 14197731, 14196352, + 14197442, + ], + score: 72, + time: 1493142448, + title: 'Xenko Game Engine 2.0 released', + type: 'story', + url: 'https://xenko.com/blog/release-xenko-2-0-0/', + }, + { + by: 'molecule', + descendants: 254, + id: 14189392, + kids: [ + 14190198, 14190800, 14193591, 14190274, 14189796, 14190118, 14190405, + 14190006, 14189430, 14190244, 14189877, 14190064, 14190211, 14189918, + 14190071, 14191312, 14195969, 14190542, 14194775, 14189900, 14190032, + 14189847, 14192128, 14191737, 14191047, 14190992, 14192759, 14191405, + 14190815, 14194136, 14190737, 14190552, 14191385, 14189816, 14191316, + 14193780, 14193979, 14190768, 14192973, 14191217, 14190879, 14190780, + 14189914, 14190925, 14192906, 14190528, 14189893, 14190007, 14189929, + 14190049, 14191859, 14191304, 14190177, 14193355, 14193352, 14190324, + 14190846, 14189803, + ], + score: 630, + time: 1493076480, + title: 'Robert M. Pirsig has died', + type: 'story', + url: 'https://www.npr.org/sections/thetwo-way/2017/04/24/525443040/-zen-and-the-art-of-motorcycle-maintenance-author-robert-m-pirsig-dies-at-88', + }, + { + by: 'artsandsci', + descendants: 67, + id: 14194422, + kids: [ + 14199418, 14196266, 14197226, 14196647, 14196324, 14201761, 14196265, + 14195599, 14199054, 14196057, + ], + score: 127, + time: 1493134376, + title: + 'An extra-uterine system to physiologically support the extreme premature lamb', + type: 'story', + url: 'https://www.nature.com/articles/ncomms15112', + }, + { + by: 'miobrien', + descendants: 9, + id: 14198261, + kids: [14199610, 14199447, 14199862, 14201753, 14199068], + score: 30, + time: 1493155969, + title: 'Prior Indigenous Technological Species', + type: 'story', + url: 'https://arxiv.org/abs/1704.07263', + }, + { + by: 'zdw', + descendants: 2, + id: 14199197, + kids: [14200610], + score: 12, + time: 1493163087, + title: 'Should Curve25519 keys be validated?', + type: 'story', + url: 'https://research.kudelskisecurity.com/2017/04/25/should-ecdh-keys-be-validated/', + }, + { + by: 'spearo77', + descendants: 213, + id: 14189688, + kids: [ + 14191654, 14192373, 14190683, 14192095, 14191856, 14190771, 14190570, + 14190599, 14190721, 14192049, 14189694, 14191430, 14193610, 14190543, + 14190372, 14191818, 14192171, 14192177, 14192135, 14191483, 14190560, + 14190341, 14190362, 14190452, 14192563, 14190458, 14195245, 14190809, + 14192706, 14192959, 14190636, 14190634, 14190368, 14191163, 14191379, + 14190668, 14191673, 14190884, 14192565, 14190480, 14190442, + ], + score: 447, + time: 1493079289, + title: 'WikiTribune – Evidence-based journalism', + type: 'story', + url: 'https://www.wikitribune.com', + }, + { + by: 'adbrebs', + descendants: 294, + id: 14182262, + kids: [ + 14183335, 14183715, 14182725, 14183897, 14185812, 14184510, 14182468, + 14183231, 14182580, 14183996, 14182449, 14185671, 14182428, 14182666, + 14186599, 14182519, 14185571, 14185159, 14182636, 14185864, 14188340, + 14183433, 14183146, 14184034, 14184363, 14183368, 14183098, 14182495, + 14182753, 14184720, 14188085, 14187692, 14183633, 14188137, 14182606, + 14186796, 14196166, 14185084, 14185899, 14188219, 14186885, 14183406, + 14185561, 14183388, 14191457, 14183281, 14183399, 14183674, 14183236, + 14183990, 14183760, 14183248, 14184114, 14183318, 14183457, 14186509, + 14186900, 14186695, 14188405, 14184636, 14184630, 14188301, 14184144, + 14183023, 14184555, 14185946, 14184611, 14184490, 14183653, 14183881, + 14182715, 14184440, 14182573, 14183251, 14184962, 14187249, 14182545, + 14192314, + ], + score: 1356, + time: 1493014335, + title: 'Lyrebird – An API to copy the voice of anyone', + type: 'story', + url: 'https://lyrebird.ai/demo', + }, + { + by: 'mathgenius', + descendants: 6, + id: 14192442, + kids: [14197265, 14195645], + score: 43, + time: 1493118936, + title: 'Quantum – Open journal for quantum science', + type: 'story', + url: 'https://quantum-journal.org/papers/', + }, + { + by: 'tjalfi', + descendants: 5, + id: 14190937, + kids: [14199744, 14197114, 14190946], + score: 107, + time: 1493097061, + title: 'A Seven Dimensional Analysis of Hashing Methods [pdf]', + type: 'story', + url: 'https://www.vldb.org/pvldb/vol9/p96-richter.pdf', + }, + { + by: 'mxstbr', + descendants: 0, + id: 14196935, + score: 24, + time: 1493147015, + title: 'One GraphQL Client for JavaScript, iOS, and Android', + type: 'story', + url: 'https://dev-blog.apollodata.com/one-graphql-client-for-javascript-ios-and-android-64993c1b7991', + }, + { + by: 'uptown', + descendants: 166, + id: 14192817, + kids: [ + 14197690, 14195597, 14196750, 14195237, 14196320, 14195150, 14198816, + 14194916, 14197746, 14196332, 14194695, 14196726, 14194947, 14199715, + 14195059, 14195778, 14196204, 14200435, 14194780, 14195030, 14198452, + 14199023, 14194852, 14197577, 14197778, 14195361, 14196368, 14194948, + 14199024, 14195060, 14199498, + ], + score: 226, + time: 1493123621, + title: 'How Yahoo Killed Flickr (2012)', + type: 'story', + url: 'https://gizmodo.com/5910223/how-yahoo-killed-flickr-and-lost-the-internet', + }, + { + by: 'mattklein123', + descendants: 42, + id: 14194026, + kids: [ + 14194573, 14195577, 14194430, 14195407, 14194569, 14195298, 14200054, + 14194456, 14198329, 14199198, + ], + score: 167, + time: 1493131921, + title: 'Envoy: 7 months later', + type: 'story', + url: 'https://eng.lyft.com/envoy-7-months-later-41986c2fd443', + }, + { + by: 'misnamed', + descendants: 2, + id: 14191333, + kids: [14197296], + score: 29, + time: 1493103250, + title: + 'Modern Hieroglyphs: Binary Logic Behind the Universal “Power Symbol”', + type: 'story', + url: 'https://99percentinvisible.org/article/modern-hieroglyphics-binary-logic-behind-universal-power-symbol/', + }, + { + by: 'LaFolle', + descendants: 92, + id: 14191681, + kids: [ + 14192477, 14194490, 14192316, 14193364, 14192065, 14193499, 14194324, + 14192622, 14192020, 14195866, 14192496, 14196391, 14192138, 14192714, + 14195151, 14195094, 14192110, 14192155, + ], + score: 138, + time: 1493108371, + title: 'Feynman Algorithm (2014)', + type: 'story', + url: 'https://wiki.c2.com/?FeynmanAlgorithm', + }, + { + by: 'Thevet', + descendants: 18, + id: 14190736, + kids: [ + 14197744, 14195753, 14197880, 14197735, 14195874, 14197023, 14196660, + ], + score: 81, + time: 1493093860, + title: 'The legend of the Legion', + type: 'story', + url: 'https://aeon.co/essays/why-young-men-queue-up-to-die-in-the-french-foreign-legion', + }, + { + by: 'bufordsharkley', + descendants: 92, + id: 14197013, + kids: [ + 14197983, 14197168, 14197701, 14198239, 14197514, 14198064, 14197476, + 14198489, 14197761, 14197080, 14198905, 14198068, 14198579, + ], + score: 69, + time: 1493147532, + title: "Cracking the Mystery of Labor's Falling Share of GDP", + type: 'story', + url: 'https://www.bloomberg.com/view/articles/2017-04-24/cracking-the-mystery-of-labor-s-falling-share-of-gdp', + }, + { + by: 'rbanffy', + descendants: 27, + id: 14198470, + kids: [ + 14199443, 14201987, 14199461, 14199729, 14201519, 14198762, 14199524, + ], + score: 52, + time: 1493157378, + title: 'How the Internet Gave Mail-Order Brides the Power', + type: 'story', + url: 'https://backchannel.com/how-the-internet-gave-mail-order-brides-the-power-1af8c8a40562', + }, +]; diff --git a/scripts/bench/benchmarks/pe-class-components/benchmark.js b/scripts/bench/benchmarks/pe-class-components/benchmark.js new file mode 100644 index 00000000000..2276e28e2d8 --- /dev/null +++ b/scripts/bench/benchmarks/pe-class-components/benchmark.js @@ -0,0 +1,5585 @@ +(function () { + 'use strict'; + + class ReactImage0 extends React.Component { + render() { + if (this.props.x === 0) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (this.props.x === 15) { + return React.createElement('i', { + className: '_3ut_ img sp_i534r85sjIn sx_e8ac93', + src: null, + alt: '', + }); + } + if (this.props.x === 22) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_7b15bc', + src: null, + }); + } + if (this.props.x === 29) { + return React.createElement('i', { + className: '_1m1s _4540 _p img sp_i534r85sjIn sx_f40b1c', + src: null, + alt: '', + }); + } + if (this.props.x === 42) { + return React.createElement( + 'i', + { + alt: 'Warning', + className: '_585p img sp_i534r85sjIn sx_20273d', + src: null, + }, + React.createElement('u', null, 'Warning') + ); + } + if (this.props.x === 67) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_b5d079', + src: null, + }); + } + if (this.props.x === 70) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_29f8c9', + }); + } + if (this.props.x === 76) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_ef6a9c', + src: null, + }); + } + if (this.props.x === 79) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_6f8c43', + }); + } + if (this.props.x === 88) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_e94a2d', + }); + } + if (this.props.x === 91) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_7ed7d4', + }); + } + if (this.props.x === 94) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_930440', + }); + } + if (this.props.x === 98) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_750c83', + }); + } + if (this.props.x === 108) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_73c1bb', + }); + } + if (this.props.x === 111) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_29f28d', + }); + } + if (this.props.x === 126) { + return React.createElement('i', { + src: null, + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_91c59e', + }); + } + if (this.props.x === 127) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (this.props.x === 134) { + return React.createElement('i', { + src: null, + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_c8eb75', + }); + } + if (this.props.x === 135) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (this.props.x === 148) { + return React.createElement('i', { + className: '_3yz6 _5whs img sp_i534r85sjIn sx_896996', + src: null, + alt: '', + }); + } + if (this.props.x === 152) { + return React.createElement('i', { + className: '_5b5p _4gem img sp_i534r85sjIn sx_896996', + src: null, + alt: '', + }); + } + if (this.props.x === 153) { + return React.createElement('i', { + className: '_541d img sp_i534r85sjIn sx_2f396a', + src: null, + alt: '', + }); + } + if (this.props.x === 160) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_31d9b0', + }); + } + if (this.props.x === 177) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_2c18b7', + src: null, + }); + } + if (this.props.x === 186) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_0a681f', + }); + } + if (this.props.x === 195) { + return React.createElement('i', { + className: '_1-lx img sp_OkER5ktbEyg sx_b369b4', + src: null, + alt: '', + }); + } + if (this.props.x === 198) { + return React.createElement('i', { + className: '_1-lx img sp_i534r85sjIn sx_96948e', + src: null, + alt: '', + }); + } + if (this.props.x === 237) { + return React.createElement('i', { + className: '_541d img sp_i534r85sjIn sx_2f396a', + src: null, + alt: '', + }); + } + if (this.props.x === 266) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (this.props.x === 314) { + return React.createElement('i', { + className: '_1cie _1cif img sp_i534r85sjIn sx_6e6820', + src: null, + alt: '', + }); + } + if (this.props.x === 345) { + return React.createElement('i', { + className: '_1cie img sp_i534r85sjIn sx_e896cf', + src: null, + alt: '', + }); + } + if (this.props.x === 351) { + return React.createElement('i', { + className: '_1cie img sp_i534r85sjIn sx_38fed8', + src: null, + alt: '', + }); + } + } + } + + class AbstractLink1 extends React.Component { + render() { + if (this.props.x === 1) { + return React.createElement( + 'a', + { + className: '_387r _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {width: 250, maxWidth: '250px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '236px'}}, + null, + React.createElement( + 'span', + null, + React.createElement('span', {className: '_48u-'}, 'Account:'), + ' ', + 'Dick Madanson (10149999073643408)' + ) + ), + React.createElement(ReactImage0, {x: 0}) + ); + } + if (this.props.x === 43) { + return React.createElement( + 'a', + { + className: '_585q _50zy _50-0 _50z- _5upp _42ft', + size: 'medium', + type: null, + title: 'Remove', + 'data-hover': undefined, + 'data-tooltip-alignh': undefined, + 'data-tooltip-content': undefined, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + undefined, + 'Remove', + undefined + ); + } + if (this.props.x === 49) { + return React.createElement( + 'a', + { + target: '_blank', + href: '/ads/manage/billing.php?act=10149999073643408', + rel: undefined, + onClick: function () {}, + }, + React.createElement(XUIText29, {x: 48}) + ); + } + if (this.props.x === 128) { + return React.createElement( + 'a', + { + className: ' _5bbf _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + React.createElement(ReactImage0, {x: 126}), + 'Search' + ), + React.createElement(ReactImage0, {x: 127}) + ); + } + if (this.props.x === 136) { + return React.createElement( + 'a', + { + className: ' _5bbf _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + React.createElement(ReactImage0, {x: 134}), + 'Filters' + ), + React.createElement(ReactImage0, {x: 135}) + ); + } + if (this.props.x === 178) { + return React.createElement( + 'a', + { + className: '_1_-t _1_-v _42ft', + disabled: null, + height: 'medium', + role: 'button', + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + undefined, + 'Lifetime', + React.createElement(ReactImage0, {x: 177}) + ); + } + if (this.props.x === 207) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'Create Ad Set' + ); + } + if (this.props.x === 209) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'View Ad Set' + ); + } + if (this.props.x === 241) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'Set a Limit' + ); + } + if (this.props.x === 267) { + return React.createElement( + 'a', + { + className: '_p _55pi _2agf _4jy0 _4jy3 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + null, + 'Links' + ), + React.createElement(ReactImage0, {x: 266}) + ); + } + } + } + + class Link2 extends React.Component { + render() { + if (this.props.x === 2) { + return React.createElement(AbstractLink1, {x: 1}); + } + if (this.props.x === 44) { + return React.createElement(AbstractLink1, {x: 43}); + } + if (this.props.x === 50) { + return React.createElement(AbstractLink1, {x: 49}); + } + if (this.props.x === 129) { + return React.createElement(AbstractLink1, {x: 128}); + } + if (this.props.x === 137) { + return React.createElement(AbstractLink1, {x: 136}); + } + if (this.props.x === 179) { + return React.createElement(AbstractLink1, {x: 178}); + } + if (this.props.x === 208) { + return React.createElement(AbstractLink1, {x: 207}); + } + if (this.props.x === 210) { + return React.createElement(AbstractLink1, {x: 209}); + } + if (this.props.x === 242) { + return React.createElement(AbstractLink1, {x: 241}); + } + if (this.props.x === 268) { + return React.createElement(AbstractLink1, {x: 267}); + } + } + } + + class AbstractButton3 extends React.Component { + render() { + if (this.props.x === 3) { + return React.createElement(Link2, {x: 2}); + } + if (this.props.x === 20) { + return React.createElement( + 'button', + { + className: '_5n7z _4jy0 _4jy4 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + 'Discard Changes', + undefined + ); + } + if (this.props.x === 23) { + return React.createElement( + 'button', + { + className: '_5n7z _2yak _4lj- _4jy0 _4jy4 _517h _51sy _42ft _42fr', + disabled: true, + onClick: function () {}, + 'data-tooltip-content': 'You have no changes to publish', + 'data-hover': 'tooltip', + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 22}), + 'Review Changes', + undefined + ); + } + if (this.props.x === 45) { + return React.createElement(Link2, {x: 44}); + } + if (this.props.x === 68) { + return React.createElement( + 'button', + { + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 67}), + 'Create Campaign', + undefined + ); + } + if (this.props.x === 71) { + return React.createElement( + 'button', + { + className: '_u_k _3qx6 _p _4jy0 _4jy4 _517h _51sy _42ft', + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 70}), + undefined, + undefined + ); + } + if (this.props.x === 77) { + return React.createElement( + 'button', + { + 'aria-label': 'Edit', + 'data-tooltip-content': 'Edit Campaigns (Ctrl+U)', + 'data-hover': 'tooltip', + className: '_d2_ _u_k noMargin _4jy0 _4jy4 _517h _51sy _42ft', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 76}), + 'Edit', + undefined + ); + } + if (this.props.x === 80) { + return React.createElement( + 'button', + { + className: '_u_k _3qx6 _p _4jy0 _4jy4 _517h _51sy _42ft', + disabled: false, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 79}), + undefined, + undefined + ); + } + if (this.props.x === 89) { + return React.createElement( + 'button', + { + 'aria-label': 'Revert', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft _42fr', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Revert', + disabled: true, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 88}), + undefined, + undefined + ); + } + if (this.props.x === 92) { + return React.createElement( + 'button', + { + 'aria-label': 'Delete', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Delete', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 91}), + undefined, + undefined + ); + } + if (this.props.x === 95) { + return React.createElement( + 'button', + { + 'aria-label': 'Duplicate', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Duplicate', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 94}), + undefined, + undefined + ); + } + if (this.props.x === 99) { + return React.createElement( + 'button', + { + 'aria-label': 'Export & Import', + className: '_u_k noMargin _p _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Export & Import', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 98}), + undefined, + undefined + ); + } + if (this.props.x === 109) { + return React.createElement( + 'button', + { + 'aria-label': 'Create Report', + className: '_u_k _5n7z _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Create Report', + disabled: false, + style: {boxSizing: 'border-box', height: '28px', width: '48px'}, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 108}), + undefined, + undefined + ); + } + if (this.props.x === 112) { + return React.createElement( + 'button', + { + 'aria-label': 'Campaign Tags', + className: ' _5uy7 _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Campaign Tags', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 111}), + undefined, + undefined + ); + } + if (this.props.x === 130) { + return React.createElement(Link2, {x: 129}); + } + if (this.props.x === 138) { + return React.createElement(Link2, {x: 137}); + } + if (this.props.x === 149) { + return React.createElement( + 'button', + { + className: '_3yz9 _1t-2 _50z- _50zy _50zz _50z- _5upp _42ft', + size: 'small', + onClick: function () {}, + type: 'button', + title: 'Remove', + 'data-hover': undefined, + 'data-tooltip-alignh': undefined, + 'data-tooltip-content': undefined, + label: null, + }, + undefined, + 'Remove', + undefined + ); + } + if (this.props.x === 156) { + return React.createElement( + 'button', + { + className: '_5b5u _5b5v _4jy0 _4jy3 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + 'Apply', + undefined + ); + } + if (this.props.x === 161) { + return React.createElement( + 'button', + { + className: '_1wdf _4jy0 _517i _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 160}), + undefined, + undefined + ); + } + if (this.props.x === 180) { + return React.createElement(Link2, {x: 179}); + } + if (this.props.x === 187) { + return React.createElement( + 'button', + { + 'aria-label': 'List Settings', + className: '_u_k _3c5o _1-r0 _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'List Settings', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 186}), + undefined, + undefined + ); + } + if (this.props.x === 269) { + return React.createElement(Link2, {x: 268}); + } + if (this.props.x === 303) { + return React.createElement( + 'button', + { + className: '_tm3 _tm6 _tm7 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Campaigns', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + if (this.props.x === 305) { + return React.createElement( + 'button', + { + className: '_tm4 _tm6 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Ad Sets', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + if (this.props.x === 307) { + return React.createElement( + 'button', + { + className: '_tm5 _tm6 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Ads', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + } + } + + class XUIButton4 extends React.Component { + render() { + if (this.props.x === 4) { + return React.createElement(AbstractButton3, {x: 3}); + } + if (this.props.x === 21) { + return React.createElement(AbstractButton3, {x: 20}); + } + if (this.props.x === 24) { + return React.createElement(AbstractButton3, {x: 23}); + } + if (this.props.x === 69) { + return React.createElement(AbstractButton3, {x: 68}); + } + if (this.props.x === 72) { + return React.createElement(AbstractButton3, {x: 71}); + } + if (this.props.x === 78) { + return React.createElement(AbstractButton3, {x: 77}); + } + if (this.props.x === 81) { + return React.createElement(AbstractButton3, {x: 80}); + } + if (this.props.x === 90) { + return React.createElement(AbstractButton3, {x: 89}); + } + if (this.props.x === 93) { + return React.createElement(AbstractButton3, {x: 92}); + } + if (this.props.x === 96) { + return React.createElement(AbstractButton3, {x: 95}); + } + if (this.props.x === 100) { + return React.createElement(AbstractButton3, {x: 99}); + } + if (this.props.x === 110) { + return React.createElement(AbstractButton3, {x: 109}); + } + if (this.props.x === 113) { + return React.createElement(AbstractButton3, {x: 112}); + } + if (this.props.x === 131) { + return React.createElement(AbstractButton3, {x: 130}); + } + if (this.props.x === 139) { + return React.createElement(AbstractButton3, {x: 138}); + } + if (this.props.x === 157) { + return React.createElement(AbstractButton3, {x: 156}); + } + if (this.props.x === 162) { + return React.createElement(AbstractButton3, {x: 161}); + } + if (this.props.x === 188) { + return React.createElement(AbstractButton3, {x: 187}); + } + if (this.props.x === 270) { + return React.createElement(AbstractButton3, {x: 269}); + } + if (this.props.x === 304) { + return React.createElement(AbstractButton3, {x: 303}); + } + if (this.props.x === 306) { + return React.createElement(AbstractButton3, {x: 305}); + } + if (this.props.x === 308) { + return React.createElement(AbstractButton3, {x: 307}); + } + } + } + + class AbstractPopoverButton5 extends React.Component { + render() { + if (this.props.x === 5) { + return React.createElement(XUIButton4, {x: 4}); + } + if (this.props.x === 132) { + return React.createElement(XUIButton4, {x: 131}); + } + if (this.props.x === 140) { + return React.createElement(XUIButton4, {x: 139}); + } + if (this.props.x === 271) { + return React.createElement(XUIButton4, {x: 270}); + } + } + } + + class ReactXUIPopoverButton6 extends React.Component { + render() { + if (this.props.x === 6) { + return React.createElement(AbstractPopoverButton5, {x: 5}); + } + if (this.props.x === 133) { + return React.createElement(AbstractPopoverButton5, {x: 132}); + } + if (this.props.x === 141) { + return React.createElement(AbstractPopoverButton5, {x: 140}); + } + if (this.props.x === 272) { + return React.createElement(AbstractPopoverButton5, {x: 271}); + } + } + } + + class BIGAdAccountSelector7 extends React.Component { + render() { + if (this.props.x === 7) { + return React.createElement( + 'div', + null, + React.createElement(ReactXUIPopoverButton6, {x: 6}), + null + ); + } + } + } + + class FluxContainer_AdsPEBIGAdAccountSelectorContainer_8 extends React.Component { + render() { + if (this.props.x === 8) { + return React.createElement(BIGAdAccountSelector7, {x: 7}); + } + } + } + + class ErrorBoundary9 extends React.Component { + render() { + if (this.props.x === 9) { + return React.createElement( + FluxContainer_AdsPEBIGAdAccountSelectorContainer_8, + {x: 8} + ); + } + if (this.props.x === 13) { + return React.createElement( + FluxContainer_AdsPENavigationBarContainer_12, + {x: 12} + ); + } + if (this.props.x === 27) { + return React.createElement( + FluxContainer_AdsPEPublishButtonContainer_18, + {x: 26} + ); + } + if (this.props.x === 32) { + return React.createElement(ReactPopoverMenu20, {x: 31}); + } + if (this.props.x === 38) { + return React.createElement(AdsPEResetDialog24, {x: 37}); + } + if (this.props.x === 57) { + return React.createElement(FluxContainer_AdsPETopErrorContainer_35, { + x: 56, + }); + } + if (this.props.x === 60) { + return React.createElement(FluxContainer_AdsGuidanceChannel_36, { + x: 59, + }); + } + if (this.props.x === 64) { + return React.createElement( + FluxContainer_AdsBulkEditDialogContainer_38, + {x: 63} + ); + } + if (this.props.x === 124) { + return React.createElement(AdsPECampaignGroupToolbarContainer57, { + x: 123, + }); + } + if (this.props.x === 170) { + return React.createElement(AdsPEFilterContainer72, {x: 169}); + } + if (this.props.x === 175) { + return React.createElement(AdsPETablePagerContainer75, {x: 174}); + } + if (this.props.x === 193) { + return React.createElement(AdsPEStatRangeContainer81, {x: 192}); + } + if (this.props.x === 301) { + return React.createElement( + FluxContainer_AdsPEMultiTabDrawerContainer_137, + {x: 300} + ); + } + if (this.props.x === 311) { + return React.createElement(AdsPEOrganizerContainer139, {x: 310}); + } + if (this.props.x === 471) { + return React.createElement(AdsPECampaignGroupTableContainer159, { + x: 470, + }); + } + if (this.props.x === 475) { + return React.createElement(AdsPEContentContainer161, {x: 474}); + } + } + } + + class AdsErrorBoundary10 extends React.Component { + render() { + if (this.props.x === 10) { + return React.createElement(ErrorBoundary9, {x: 9}); + } + if (this.props.x === 14) { + return React.createElement(ErrorBoundary9, {x: 13}); + } + if (this.props.x === 28) { + return React.createElement(ErrorBoundary9, {x: 27}); + } + if (this.props.x === 33) { + return React.createElement(ErrorBoundary9, {x: 32}); + } + if (this.props.x === 39) { + return React.createElement(ErrorBoundary9, {x: 38}); + } + if (this.props.x === 58) { + return React.createElement(ErrorBoundary9, {x: 57}); + } + if (this.props.x === 61) { + return React.createElement(ErrorBoundary9, {x: 60}); + } + if (this.props.x === 65) { + return React.createElement(ErrorBoundary9, {x: 64}); + } + if (this.props.x === 125) { + return React.createElement(ErrorBoundary9, {x: 124}); + } + if (this.props.x === 171) { + return React.createElement(ErrorBoundary9, {x: 170}); + } + if (this.props.x === 176) { + return React.createElement(ErrorBoundary9, {x: 175}); + } + if (this.props.x === 194) { + return React.createElement(ErrorBoundary9, {x: 193}); + } + if (this.props.x === 302) { + return React.createElement(ErrorBoundary9, {x: 301}); + } + if (this.props.x === 312) { + return React.createElement(ErrorBoundary9, {x: 311}); + } + if (this.props.x === 472) { + return React.createElement(ErrorBoundary9, {x: 471}); + } + if (this.props.x === 476) { + return React.createElement(ErrorBoundary9, {x: 475}); + } + } + } + + class AdsPENavigationBar11 extends React.Component { + render() { + if (this.props.x === 11) { + return React.createElement('div', {className: '_4t_9'}); + } + } + } + + class FluxContainer_AdsPENavigationBarContainer_12 extends React.Component { + render() { + if (this.props.x === 12) { + return React.createElement(AdsPENavigationBar11, {x: 11}); + } + } + } + + class AdsPEDraftSyncStatus13 extends React.Component { + render() { + if (this.props.x === 16) { + return React.createElement( + 'div', + {className: '_3ut-', onClick: function () {}}, + React.createElement( + 'span', + {className: '_3uu0'}, + React.createElement(ReactImage0, {x: 15}) + ) + ); + } + } + } + + class FluxContainer_AdsPEDraftSyncStatusContainer_14 extends React.Component { + render() { + if (this.props.x === 17) { + return React.createElement(AdsPEDraftSyncStatus13, {x: 16}); + } + } + } + + class AdsPEDraftErrorsStatus15 extends React.Component { + render() { + if (this.props.x === 18) { + return null; + } + } + } + + class FluxContainer_viewFn_16 extends React.Component { + render() { + if (this.props.x === 19) { + return React.createElement(AdsPEDraftErrorsStatus15, {x: 18}); + } + } + } + + class AdsPEPublishButton17 extends React.Component { + render() { + if (this.props.x === 25) { + return React.createElement( + 'div', + {className: '_5533'}, + React.createElement(FluxContainer_AdsPEDraftSyncStatusContainer_14, { + x: 17, + }), + React.createElement(FluxContainer_viewFn_16, {x: 19}), + null, + React.createElement(XUIButton4, {x: 21, key: 'discard'}), + React.createElement(XUIButton4, {x: 24}) + ); + } + } + } + + class FluxContainer_AdsPEPublishButtonContainer_18 extends React.Component { + render() { + if (this.props.x === 26) { + return React.createElement(AdsPEPublishButton17, {x: 25}); + } + } + } + + class InlineBlock19 extends React.Component { + render() { + if (this.props.x === 30) { + return React.createElement( + 'div', + {className: 'uiPopover _6a _6b', disabled: null}, + React.createElement(ReactImage0, {x: 29, key: '.0'}) + ); + } + if (this.props.x === 73) { + return React.createElement( + 'div', + {className: 'uiPopover _6a _6b', disabled: null}, + React.createElement(XUIButton4, {x: 72, key: '.0'}) + ); + } + if (this.props.x === 82) { + return React.createElement( + 'div', + {className: '_1nwm uiPopover _6a _6b', disabled: null}, + React.createElement(XUIButton4, {x: 81, key: '.0'}) + ); + } + if (this.props.x === 101) { + return React.createElement( + 'div', + {size: 'large', className: 'uiPopover _6a _6b', disabled: null}, + React.createElement(XUIButton4, {x: 100, key: '.0'}) + ); + } + if (this.props.x === 273) { + return React.createElement( + 'div', + { + className: '_3-90 uiPopover _6a _6b', + style: {marginTop: 2}, + disabled: null, + }, + React.createElement(ReactXUIPopoverButton6, {x: 272, key: '.0'}) + ); + } + } + } + + class ReactPopoverMenu20 extends React.Component { + render() { + if (this.props.x === 31) { + return React.createElement(InlineBlock19, {x: 30}); + } + if (this.props.x === 74) { + return React.createElement(InlineBlock19, {x: 73}); + } + if (this.props.x === 83) { + return React.createElement(InlineBlock19, {x: 82}); + } + if (this.props.x === 102) { + return React.createElement(InlineBlock19, {x: 101}); + } + if (this.props.x === 274) { + return React.createElement(InlineBlock19, {x: 273}); + } + } + } + + class LeftRight21 extends React.Component { + render() { + if (this.props.x === 34) { + return React.createElement( + 'div', + {className: 'clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement( + 'div', + {className: '_34_j'}, + React.createElement( + 'div', + {className: '_34_k'}, + React.createElement(AdsErrorBoundary10, {x: 10}) + ), + React.createElement( + 'div', + {className: '_2u-6'}, + React.createElement(AdsErrorBoundary10, {x: 14}) + ) + ) + ), + React.createElement( + 'div', + {key: 'right', className: '_ohf rfloat'}, + React.createElement( + 'div', + {className: '_34_m'}, + React.createElement( + 'div', + {key: '0', className: '_5ju2'}, + React.createElement(AdsErrorBoundary10, {x: 28}) + ), + React.createElement( + 'div', + {key: '1', className: '_5ju2'}, + React.createElement(AdsErrorBoundary10, {x: 33}) + ) + ) + ) + ); + } + if (this.props.x === 232) { + return React.createElement( + 'div', + {direction: 'left', className: 'clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(AdsLabeledField104, {x: 231}) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement( + 'div', + {className: '_2oc7'}, + 'Clicks to Website' + ) + ) + ) + ); + } + if (this.props.x === 235) { + return React.createElement( + 'div', + {className: '_3-8x clearfix', direction: 'left'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(AdsLabeledField104, {x: 234}) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement('div', {className: '_2oc7'}, 'Auction') + ) + ) + ); + } + if (this.props.x === 245) { + return React.createElement( + 'div', + {className: '_3-8y clearfix', direction: 'left'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(AdsLabeledField104, {x: 240}) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement( + FluxContainer_AdsCampaignGroupSpendCapContainer_107, + {x: 244} + ) + ) + ) + ); + } + if (this.props.x === 277) { + return React.createElement( + 'div', + {className: '_5dw9 _5dwa clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(XUICardHeaderTitle100, {x: 265, key: '.0'}) + ), + React.createElement( + 'div', + {key: 'right', className: '_ohf rfloat'}, + React.createElement( + FluxContainer_AdsPluginizedLinksMenuContainer_121, + {x: 276, key: '.1'} + ) + ) + ); + } + } + } + + class AdsUnifiedNavigationLocalNav22 extends React.Component { + render() { + if (this.props.x === 35) { + return React.createElement( + 'div', + {className: '_34_i'}, + React.createElement(LeftRight21, {x: 34}) + ); + } + } + } + + class XUIDialog23 extends React.Component { + render() { + if (this.props.x === 36) { + return null; + } + } + } + + class AdsPEResetDialog24 extends React.Component { + render() { + if (this.props.x === 37) { + return React.createElement( + 'span', + null, + React.createElement(XUIDialog23, {x: 36, key: 'dialog/.0'}) + ); + } + } + } + + class AdsPETopNav25 extends React.Component { + render() { + if (this.props.x === 40) { + return React.createElement( + 'div', + {style: {width: 1306}}, + React.createElement(AdsUnifiedNavigationLocalNav22, {x: 35}), + React.createElement(AdsErrorBoundary10, {x: 39}) + ); + } + } + } + + class FluxContainer_AdsPETopNavContainer_26 extends React.Component { + render() { + if (this.props.x === 41) { + return React.createElement(AdsPETopNav25, {x: 40}); + } + } + } + + class XUIAbstractGlyphButton27 extends React.Component { + render() { + if (this.props.x === 46) { + return React.createElement(AbstractButton3, {x: 45}); + } + if (this.props.x === 150) { + return React.createElement(AbstractButton3, {x: 149}); + } + } + } + + class XUICloseButton28 extends React.Component { + render() { + if (this.props.x === 47) { + return React.createElement(XUIAbstractGlyphButton27, {x: 46}); + } + if (this.props.x === 151) { + return React.createElement(XUIAbstractGlyphButton27, {x: 150}); + } + } + } + + class XUIText29 extends React.Component { + render() { + if (this.props.x === 48) { + return React.createElement( + 'span', + {display: 'inline', className: ' _50f7'}, + 'Ads Manager' + ); + } + if (this.props.x === 205) { + return React.createElement( + 'span', + {className: '_2x9f _50f5 _50f7', display: 'inline'}, + 'Editing Campaign' + ); + } + if (this.props.x === 206) { + return React.createElement( + 'span', + {display: 'inline', className: ' _50f5 _50f7'}, + 'Test Campaign' + ); + } + } + } + + class XUINotice30 extends React.Component { + render() { + if (this.props.x === 51) { + return React.createElement( + 'div', + {size: 'medium', className: '_585n _585o _2wdd'}, + React.createElement(ReactImage0, {x: 42}), + React.createElement(XUICloseButton28, {x: 47}), + React.createElement( + 'div', + {className: '_585r _2i-a _50f4'}, + 'Please go to ', + React.createElement(Link2, {x: 50}), + ' to set up a payment method for this ad account.' + ) + ); + } + } + } + + class ReactCSSTransitionGroupChild31 extends React.Component { + render() { + if (this.props.x === 52) { + return React.createElement(XUINotice30, {x: 51}); + } + } + } + + class ReactTransitionGroup32 extends React.Component { + render() { + if (this.props.x === 53) { + return React.createElement( + 'span', + null, + React.createElement(ReactCSSTransitionGroupChild31, { + x: 52, + key: '.0', + }) + ); + } + } + } + + class ReactCSSTransitionGroup33 extends React.Component { + render() { + if (this.props.x === 54) { + return React.createElement(ReactTransitionGroup32, {x: 53}); + } + } + } + + class AdsPETopError34 extends React.Component { + render() { + if (this.props.x === 55) { + return React.createElement( + 'div', + {className: '_2wdc'}, + React.createElement(ReactCSSTransitionGroup33, {x: 54}) + ); + } + } + } + + class FluxContainer_AdsPETopErrorContainer_35 extends React.Component { + render() { + if (this.props.x === 56) { + return React.createElement(AdsPETopError34, {x: 55}); + } + } + } + + class FluxContainer_AdsGuidanceChannel_36 extends React.Component { + render() { + if (this.props.x === 59) { + return null; + } + } + } + + class ResponsiveBlock37 extends React.Component { + render() { + if (this.props.x === 62) { + return React.createElement( + 'div', + {className: '_4u-c'}, + [ + React.createElement(AdsErrorBoundary10, {x: 58, key: 1}), + React.createElement(AdsErrorBoundary10, {x: 61, key: 2}), + ], + React.createElement( + 'div', + {key: 'sensor', className: '_4u-f'}, + React.createElement('iframe', { + 'aria-hidden': 'true', + className: '_1_xb', + tabIndex: '-1', + }) + ) + ); + } + if (this.props.x === 469) { + return React.createElement( + 'div', + {className: '_4u-c'}, + React.createElement(AdsPEDataTableContainer158, {x: 468}), + React.createElement( + 'div', + {key: 'sensor', className: '_4u-f'}, + React.createElement('iframe', { + 'aria-hidden': 'true', + className: '_1_xb', + tabIndex: '-1', + }) + ) + ); + } + } + } + + class FluxContainer_AdsBulkEditDialogContainer_38 extends React.Component { + render() { + if (this.props.x === 63) { + return null; + } + } + } + + class Column39 extends React.Component { + render() { + if (this.props.x === 66) { + return React.createElement( + 'div', + {className: '_4bl8 _4bl7'}, + React.createElement( + 'div', + {className: '_3c5f'}, + null, + null, + React.createElement('div', {className: '_3c5i'}), + null + ) + ); + } + } + } + + class XUIButtonGroup40 extends React.Component { + render() { + if (this.props.x === 75) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(XUIButton4, {x: 69}), + React.createElement(ReactPopoverMenu20, {x: 74}) + ); + } + if (this.props.x === 84) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(XUIButton4, {x: 78, key: 'edit'}), + React.createElement(ReactPopoverMenu20, {x: 83, key: 'editMenu'}) + ); + } + if (this.props.x === 97) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(XUIButton4, {x: 90, key: 'revert'}), + React.createElement(XUIButton4, {x: 93, key: 'delete'}), + React.createElement(XUIButton4, {x: 96, key: 'duplicate'}) + ); + } + if (this.props.x === 117) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(AdsPEExportImportMenuContainer48, {x: 107}), + React.createElement(XUIButton4, {x: 110, key: 'createReport'}), + React.createElement(AdsPECampaignGroupTagContainer51, { + x: 116, + key: 'tags', + }) + ); + } + } + } + + class AdsPEEditToolbarButton41 extends React.Component { + render() { + if (this.props.x === 85) { + return React.createElement(XUIButtonGroup40, {x: 84}); + } + } + } + + class FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42 extends React.Component { + render() { + if (this.props.x === 86) { + return React.createElement(AdsPEEditToolbarButton41, {x: 85}); + } + } + } + + class FluxContainer_AdsPEEditToolbarButtonContainer_43 extends React.Component { + render() { + if (this.props.x === 87) { + return React.createElement( + FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42, + {x: 86} + ); + } + } + } + + class AdsPEExportImportMenu44 extends React.Component { + render() { + if (this.props.x === 103) { + return React.createElement(ReactPopoverMenu20, {x: 102, key: 'export'}); + } + } + } + + class FluxContainer_AdsPECustomizeExportContainer_45 extends React.Component { + render() { + if (this.props.x === 104) { + return null; + } + } + } + + class AdsPEExportAsTextDialog46 extends React.Component { + render() { + if (this.props.x === 105) { + return null; + } + } + } + + class FluxContainer_AdsPEExportAsTextDialogContainer_47 extends React.Component { + render() { + if (this.props.x === 106) { + return React.createElement(AdsPEExportAsTextDialog46, {x: 105}); + } + } + } + + class AdsPEExportImportMenuContainer48 extends React.Component { + render() { + if (this.props.x === 107) { + return React.createElement( + 'span', + null, + React.createElement(AdsPEExportImportMenu44, {x: 103}), + React.createElement(FluxContainer_AdsPECustomizeExportContainer_45, { + x: 104, + }), + React.createElement( + FluxContainer_AdsPEExportAsTextDialogContainer_47, + {x: 106} + ), + null, + null + ); + } + } + } + + class Constructor49 extends React.Component { + render() { + if (this.props.x === 114) { + return null; + } + if (this.props.x === 142) { + return null; + } + if (this.props.x === 143) { + return null; + } + if (this.props.x === 183) { + return null; + } + } + } + + class TagSelectorPopover50 extends React.Component { + render() { + if (this.props.x === 115) { + return React.createElement( + 'span', + {className: ' _3d6e'}, + React.createElement(XUIButton4, {x: 113}), + React.createElement(Constructor49, {x: 114, key: 'layer'}) + ); + } + } + } + + class AdsPECampaignGroupTagContainer51 extends React.Component { + render() { + if (this.props.x === 116) { + return React.createElement(TagSelectorPopover50, { + x: 115, + key: '98010048849317', + }); + } + } + } + + class AdsRuleToolbarMenu52 extends React.Component { + render() { + if (this.props.x === 118) { + return null; + } + } + } + + class FluxContainer_AdsPERuleToolbarMenuContainer_53 extends React.Component { + render() { + if (this.props.x === 119) { + return React.createElement(AdsRuleToolbarMenu52, {x: 118}); + } + } + } + + class FillColumn54 extends React.Component { + render() { + if (this.props.x === 120) { + return React.createElement( + 'div', + {className: '_4bl9'}, + React.createElement( + 'span', + {className: '_3c5e'}, + React.createElement( + 'span', + null, + React.createElement(XUIButtonGroup40, {x: 75}), + React.createElement( + FluxContainer_AdsPEEditToolbarButtonContainer_43, + {x: 87} + ), + null, + React.createElement(XUIButtonGroup40, {x: 97}) + ), + React.createElement(XUIButtonGroup40, {x: 117}), + React.createElement( + FluxContainer_AdsPERuleToolbarMenuContainer_53, + {x: 119} + ) + ) + ); + } + } + } + + class Layout55 extends React.Component { + render() { + if (this.props.x === 121) { + return React.createElement( + 'div', + {className: 'clearfix'}, + React.createElement(Column39, {x: 66, key: '1'}), + React.createElement(FillColumn54, {x: 120, key: '0'}) + ); + } + } + } + + class AdsPEMainPaneToolbar56 extends React.Component { + render() { + if (this.props.x === 122) { + return React.createElement( + 'div', + {className: '_3c5b clearfix'}, + React.createElement(Layout55, {x: 121}) + ); + } + } + } + + class AdsPECampaignGroupToolbarContainer57 extends React.Component { + render() { + if (this.props.x === 123) { + return React.createElement(AdsPEMainPaneToolbar56, {x: 122}); + } + } + } + + class AdsPEFiltersPopover58 extends React.Component { + render() { + if (this.props.x === 144) { + return React.createElement( + 'span', + {className: '_5b-l _5bbe'}, + React.createElement(ReactXUIPopoverButton6, {x: 133}), + React.createElement(ReactXUIPopoverButton6, {x: 141}), + [ + React.createElement(Constructor49, {x: 142, key: 'filterMenu/.0'}), + React.createElement(Constructor49, {x: 143, key: 'searchMenu/.0'}), + ] + ); + } + } + } + + class AbstractCheckboxInput59 extends React.Component { + render() { + if (this.props.x === 145) { + return React.createElement( + 'label', + {className: 'uiInputLabelInput _55sg _kv1'}, + React.createElement('input', { + checked: true, + disabled: true, + name: 'filterUnpublished', + value: 'on', + onClick: function () {}, + className: null, + id: 'js_input_label_21', + type: 'checkbox', + }), + React.createElement('span', { + 'data-hover': null, + 'data-tooltip-content': undefined, + }) + ); + } + if (this.props.x === 336) { + return React.createElement( + 'label', + {className: '_4h2r _55sg _kv1'}, + React.createElement('input', { + checked: undefined, + onChange: function () {}, + className: null, + type: 'checkbox', + }), + React.createElement('span', { + 'data-hover': null, + 'data-tooltip-content': undefined, + }) + ); + } + } + } + + class XUICheckboxInput60 extends React.Component { + render() { + if (this.props.x === 146) { + return React.createElement(AbstractCheckboxInput59, {x: 145}); + } + if (this.props.x === 337) { + return React.createElement(AbstractCheckboxInput59, {x: 336}); + } + } + } + + class InputLabel61 extends React.Component { + render() { + if (this.props.x === 147) { + return React.createElement( + 'div', + {display: 'block', className: 'uiInputLabel clearfix'}, + React.createElement(XUICheckboxInput60, {x: 146}), + React.createElement( + 'label', + {className: 'uiInputLabelLabel', htmlFor: 'js_input_label_21'}, + 'Always show new items' + ) + ); + } + } + } + + class AdsPopoverLink62 extends React.Component { + render() { + if (this.props.x === 154) { + return React.createElement( + 'span', + null, + React.createElement( + 'span', + { + onMouseEnter: function () {}, + onMouseLeave: function () {}, + onMouseUp: undefined, + }, + React.createElement('span', {className: '_3o_j'}), + React.createElement(ReactImage0, {x: 153}) + ), + null + ); + } + if (this.props.x === 238) { + return React.createElement( + 'span', + null, + React.createElement( + 'span', + { + onMouseEnter: function () {}, + onMouseLeave: function () {}, + onMouseUp: undefined, + }, + React.createElement('span', {className: '_3o_j'}), + React.createElement(ReactImage0, {x: 237}) + ), + null + ); + } + } + } + + class AdsHelpLink63 extends React.Component { + render() { + if (this.props.x === 155) { + return React.createElement(AdsPopoverLink62, {x: 154}); + } + if (this.props.x === 239) { + return React.createElement(AdsPopoverLink62, {x: 238}); + } + } + } + + class BUIFilterTokenInput64 extends React.Component { + render() { + if (this.props.x === 158) { + return React.createElement( + 'div', + {className: '_5b5o _3yz3 _4cld'}, + React.createElement( + 'div', + {className: '_5b5t _2d2k'}, + React.createElement(ReactImage0, {x: 152}), + React.createElement( + 'div', + {className: '_5b5r'}, + 'Campaigns: (1)', + React.createElement(AdsHelpLink63, {x: 155}) + ) + ), + React.createElement(XUIButton4, {x: 157}) + ); + } + } + } + + class BUIFilterToken65 extends React.Component { + render() { + if (this.props.x === 159) { + return React.createElement( + 'div', + {className: '_3yz1 _3yz2 _3dad'}, + React.createElement( + 'div', + {className: '_3yz4', 'aria-hidden': false}, + React.createElement( + 'div', + {onClick: function () {}, className: '_3yz5'}, + React.createElement(ReactImage0, {x: 148}), + React.createElement('div', {className: '_3yz7'}, 'Campaigns:'), + React.createElement( + 'div', + { + className: 'ellipsis _3yz8', + 'data-hover': 'tooltip', + 'data-tooltip-display': 'overflow', + }, + '(1)' + ) + ), + null, + React.createElement(XUICloseButton28, {x: 151}) + ), + React.createElement(BUIFilterTokenInput64, {x: 158}) + ); + } + } + } + + class BUIFilterTokenCreateButton66 extends React.Component { + render() { + if (this.props.x === 163) { + return React.createElement( + 'div', + {className: '_1tc'}, + React.createElement(XUIButton4, {x: 162}) + ); + } + } + } + + class BUIFilterTokenizer67 extends React.Component { + render() { + if (this.props.x === 164) { + return React.createElement( + 'div', + {className: '_5b-m clearfix'}, + undefined, + [], + React.createElement(BUIFilterToken65, {x: 159, key: 'token0'}), + React.createElement(BUIFilterTokenCreateButton66, {x: 163}), + null, + React.createElement('div', {className: '_49u3'}) + ); + } + } + } + + class XUIAmbientNUX68 extends React.Component { + render() { + if (this.props.x === 165) { + return null; + } + if (this.props.x === 189) { + return null; + } + if (this.props.x === 200) { + return null; + } + } + } + + class XUIAmbientNUX69 extends React.Component { + render() { + if (this.props.x === 166) { + return React.createElement(XUIAmbientNUX68, {x: 165}); + } + if (this.props.x === 190) { + return React.createElement(XUIAmbientNUX68, {x: 189}); + } + if (this.props.x === 201) { + return React.createElement(XUIAmbientNUX68, {x: 200}); + } + } + } + + class AdsPEAmbientNUXMegaphone70 extends React.Component { + render() { + if (this.props.x === 167) { + return React.createElement( + 'span', + null, + React.createElement('span', {}), + React.createElement(XUIAmbientNUX69, {x: 166, key: 'nux'}) + ); + } + } + } + + class AdsPEFilters71 extends React.Component { + render() { + if (this.props.x === 168) { + return React.createElement( + 'div', + {className: '_4rw_'}, + React.createElement(AdsPEFiltersPopover58, {x: 144}), + React.createElement( + 'div', + {className: '_1eo'}, + React.createElement(InputLabel61, {x: 147}) + ), + React.createElement(BUIFilterTokenizer67, {x: 164}), + '', + React.createElement(AdsPEAmbientNUXMegaphone70, {x: 167}) + ); + } + } + } + + class AdsPEFilterContainer72 extends React.Component { + render() { + if (this.props.x === 169) { + return React.createElement(AdsPEFilters71, {x: 168}); + } + } + } + + class AdsPETablePager73 extends React.Component { + render() { + if (this.props.x === 172) { + return null; + } + } + } + + class AdsPECampaignGroupTablePagerContainer74 extends React.Component { + render() { + if (this.props.x === 173) { + return React.createElement(AdsPETablePager73, {x: 172}); + } + } + } + + class AdsPETablePagerContainer75 extends React.Component { + render() { + if (this.props.x === 174) { + return React.createElement(AdsPECampaignGroupTablePagerContainer74, { + x: 173, + }); + } + } + } + + class ReactXUIError76 extends React.Component { + render() { + if (this.props.x === 181) { + return React.createElement(AbstractButton3, {x: 180}); + } + if (this.props.x === 216) { + return React.createElement( + 'div', + {className: '_40bf _2vl4 _1h18'}, + null, + null, + React.createElement( + 'div', + {className: '_2vl9 _1h1f', style: {backgroundColor: '#fff'}}, + React.createElement( + 'div', + {className: '_2vla _1h1g'}, + React.createElement( + 'div', + null, + null, + React.createElement('textarea', { + className: '_2vli _2vlj _1h26 _1h27', + dir: 'auto', + disabled: undefined, + id: undefined, + maxLength: null, + value: 'Test Campaign', + onBlur: function () {}, + onChange: function () {}, + onFocus: function () {}, + onKeyDown: function () {}, + }), + null + ), + React.createElement('div', { + 'aria-hidden': 'true', + className: '_2vlk', + }) + ) + ), + null + ); + } + if (this.props.x === 221) { + return React.createElement(XUICard94, {x: 220}); + } + if (this.props.x === 250) { + return React.createElement(XUICard94, {x: 249}); + } + if (this.props.x === 280) { + return React.createElement(XUICard94, {x: 279}); + } + } + } + + class BUIPopoverButton77 extends React.Component { + render() { + if (this.props.x === 182) { + return React.createElement(ReactXUIError76, {x: 181}); + } + } + } + + class BUIDateRangePicker78 extends React.Component { + render() { + if (this.props.x === 184) { + return React.createElement( + 'span', + null, + React.createElement(BUIPopoverButton77, {x: 182}), + [React.createElement(Constructor49, {x: 183, key: 'layer/.0'})] + ); + } + } + } + + class AdsPEStatsRangePicker79 extends React.Component { + render() { + if (this.props.x === 185) { + return React.createElement(BUIDateRangePicker78, {x: 184}); + } + } + } + + class AdsPEStatRange80 extends React.Component { + render() { + if (this.props.x === 191) { + return React.createElement( + 'div', + {className: '_3c5k'}, + React.createElement('span', {className: '_3c5j'}, 'Stats:'), + React.createElement( + 'span', + {className: '_3c5l'}, + React.createElement(AdsPEStatsRangePicker79, {x: 185}), + React.createElement(XUIButton4, {x: 188, key: 'settings'}) + ), + [React.createElement(XUIAmbientNUX69, {x: 190, key: 'roasNUX/.0'})] + ); + } + } + } + + class AdsPEStatRangeContainer81 extends React.Component { + render() { + if (this.props.x === 192) { + return React.createElement(AdsPEStatRange80, {x: 191}); + } + } + } + + class AdsPESideTrayTabButton82 extends React.Component { + render() { + if (this.props.x === 196) { + return React.createElement( + 'div', + {className: '_1-ly _59j9 _d9a', onClick: function () {}}, + React.createElement(ReactImage0, {x: 195}), + React.createElement('div', {className: '_vf7'}), + React.createElement('div', {className: '_vf8'}) + ); + } + if (this.props.x === 199) { + return React.createElement( + 'div', + {className: ' _1-lz _d9a', onClick: function () {}}, + React.createElement(ReactImage0, {x: 198}), + React.createElement('div', {className: '_vf7'}), + React.createElement('div', {className: '_vf8'}) + ); + } + if (this.props.x === 203) { + return null; + } + } + } + + class AdsPEEditorTrayTabButton83 extends React.Component { + render() { + if (this.props.x === 197) { + return React.createElement(AdsPESideTrayTabButton82, {x: 196}); + } + } + } + + class AdsPEInsightsTrayTabButton84 extends React.Component { + render() { + if (this.props.x === 202) { + return React.createElement( + 'span', + null, + React.createElement(AdsPESideTrayTabButton82, {x: 199}), + React.createElement(XUIAmbientNUX69, {x: 201, key: 'roasNUX'}) + ); + } + } + } + + class AdsPENekoDebuggerTrayTabButton85 extends React.Component { + render() { + if (this.props.x === 204) { + return React.createElement(AdsPESideTrayTabButton82, {x: 203}); + } + } + } + + class AdsPEEditorChildLink86 extends React.Component { + render() { + if (this.props.x === 211) { + return React.createElement( + 'div', + {className: '_3ywr'}, + React.createElement(Link2, {x: 208}), + React.createElement('span', {className: '_3ywq'}, '|'), + React.createElement(Link2, {x: 210}) + ); + } + } + } + + class AdsPEEditorChildLinkContainer87 extends React.Component { + render() { + if (this.props.x === 212) { + return React.createElement(AdsPEEditorChildLink86, {x: 211}); + } + } + } + + class AdsPEHeaderSection88 extends React.Component { + render() { + if (this.props.x === 213) { + return React.createElement( + 'div', + {className: '_yke'}, + React.createElement('div', {className: '_2x9d _pr-'}), + React.createElement(XUIText29, {x: 205}), + React.createElement( + 'div', + {className: '_3a-a'}, + React.createElement( + 'div', + {className: '_3a-b'}, + React.createElement(XUIText29, {x: 206}) + ) + ), + React.createElement(AdsPEEditorChildLinkContainer87, {x: 212}) + ); + } + } + } + + class AdsPECampaignGroupHeaderSectionContainer89 extends React.Component { + render() { + if (this.props.x === 214) { + return React.createElement(AdsPEHeaderSection88, {x: 213}); + } + } + } + + class AdsEditorLoadingErrors90 extends React.Component { + render() { + if (this.props.x === 215) { + return null; + } + } + } + + class AdsTextInput91 extends React.Component { + render() { + if (this.props.x === 217) { + return React.createElement(ReactXUIError76, {x: 216}); + } + } + } + + class BUIFormElement92 extends React.Component { + render() { + if (this.props.x === 218) { + return React.createElement( + 'div', + {className: '_5521 clearfix'}, + React.createElement( + 'div', + {className: '_5522 _3w5q'}, + React.createElement( + 'label', + { + onClick: undefined, + htmlFor: '1467872040612:1961945894', + className: '_5523 _3w5r', + }, + 'Campaign Name', + null + ) + ), + React.createElement( + 'div', + {className: '_5527'}, + React.createElement( + 'div', + {className: '_5528'}, + React.createElement( + 'span', + {key: '.0', className: '_40bg', id: '1467872040612:1961945894'}, + React.createElement(AdsTextInput91, { + x: 217, + key: 'nameEditor98010048849317', + }), + null + ) + ), + null + ) + ); + } + } + } + + class BUIForm93 extends React.Component { + render() { + if (this.props.x === 219) { + return React.createElement( + 'div', + {className: '_5ks1 _550r _550t _550y _3w5n'}, + React.createElement(BUIFormElement92, {x: 218, key: '.0'}) + ); + } + } + } + + class XUICard94 extends React.Component { + render() { + if (this.props.x === 220) { + return React.createElement( + 'div', + {className: '_40bc _12k2 _4-u2 _4-u8'}, + React.createElement(BUIForm93, {x: 219}) + ); + } + if (this.props.x === 249) { + return React.createElement( + 'div', + {className: '_12k2 _4-u2 _4-u8'}, + React.createElement(AdsCardHeader103, {x: 230}), + React.createElement(AdsCardSection108, {x: 248}) + ); + } + if (this.props.x === 279) { + return React.createElement( + 'div', + {className: '_12k2 _4-u2 _4-u8'}, + React.createElement(AdsCardLeftRightHeader122, {x: 278}) + ); + } + } + } + + class AdsCard95 extends React.Component { + render() { + if (this.props.x === 222) { + return React.createElement(ReactXUIError76, {x: 221}); + } + if (this.props.x === 251) { + return React.createElement(ReactXUIError76, {x: 250}); + } + if (this.props.x === 281) { + return React.createElement(ReactXUIError76, {x: 280}); + } + } + } + + class AdsEditorNameSection96 extends React.Component { + render() { + if (this.props.x === 223) { + return React.createElement(AdsCard95, {x: 222}); + } + } + } + + class AdsCampaignGroupNameSectionContainer97 extends React.Component { + render() { + if (this.props.x === 224) { + return React.createElement(AdsEditorNameSection96, { + x: 223, + key: 'nameSection98010048849317', + }); + } + } + } + + class _render98 extends React.Component { + render() { + if (this.props.x === 225) { + return React.createElement(AdsCampaignGroupNameSectionContainer97, { + x: 224, + }); + } + } + } + + class AdsPluginWrapper99 extends React.Component { + render() { + if (this.props.x === 226) { + return React.createElement(_render98, {x: 225}); + } + if (this.props.x === 255) { + return React.createElement(_render111, {x: 254}); + } + if (this.props.x === 258) { + return React.createElement(_render113, {x: 257}); + } + if (this.props.x === 287) { + return React.createElement(_render127, {x: 286}); + } + if (this.props.x === 291) { + return React.createElement(_render130, {x: 290}); + } + } + } + + class XUICardHeaderTitle100 extends React.Component { + render() { + if (this.props.x === 227) { + return React.createElement( + 'span', + {className: '_38my'}, + 'Campaign Details', + null, + React.createElement('span', {className: '_c1c'}) + ); + } + if (this.props.x === 265) { + return React.createElement( + 'span', + {className: '_38my'}, + [ + React.createElement( + 'span', + {key: 1}, + 'Campaign ID', + ': ', + '98010048849317' + ), + React.createElement( + 'div', + {className: '_5lh9', key: 2}, + React.createElement( + FluxContainer_AdsCampaignGroupStatusSwitchContainer_119, + {x: 264} + ) + ), + ], + null, + React.createElement('span', {className: '_c1c'}) + ); + } + } + } + + class XUICardSection101 extends React.Component { + render() { + if (this.props.x === 228) { + return React.createElement( + 'div', + {className: '_5dw9 _5dwa _4-u3'}, + [React.createElement(XUICardHeaderTitle100, {x: 227, key: '.0'})], + undefined, + undefined, + React.createElement('div', {className: '_3s3-'}) + ); + } + if (this.props.x === 247) { + return React.createElement( + 'div', + {className: '_12jy _4-u3'}, + React.createElement( + 'div', + {className: '_3-8j'}, + React.createElement(FlexibleBlock105, {x: 233}), + React.createElement(FlexibleBlock105, {x: 236}), + React.createElement(FlexibleBlock105, {x: 246}), + null, + null + ) + ); + } + } + } + + class XUICardHeader102 extends React.Component { + render() { + if (this.props.x === 229) { + return React.createElement(XUICardSection101, {x: 228}); + } + } + } + + class AdsCardHeader103 extends React.Component { + render() { + if (this.props.x === 230) { + return React.createElement(XUICardHeader102, {x: 229}); + } + } + } + + class AdsLabeledField104 extends React.Component { + render() { + if (this.props.x === 231) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz', label: 'Objective'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Objective ' + ), + null, + React.createElement('div', {className: '_3bv-'}) + ); + } + if (this.props.x === 234) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz', label: 'Buying Type'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Buying Type ' + ), + null, + React.createElement('div', {className: '_3bv-'}) + ); + } + if (this.props.x === 240) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Campaign Spending Limit ' + ), + React.createElement(AdsHelpLink63, {x: 239}), + React.createElement('div', {className: '_3bv-'}) + ); + } + } + } + + class FlexibleBlock105 extends React.Component { + render() { + if (this.props.x === 233) { + return React.createElement(LeftRight21, {x: 232}); + } + if (this.props.x === 236) { + return React.createElement(LeftRight21, {x: 235}); + } + if (this.props.x === 246) { + return React.createElement(LeftRight21, {x: 245}); + } + } + } + + class AdsBulkCampaignSpendCapField106 extends React.Component { + render() { + if (this.props.x === 243) { + return React.createElement( + 'div', + {className: '_33dv'}, + '', + React.createElement(Link2, {x: 242}), + ' (optional)' + ); + } + } + } + + class FluxContainer_AdsCampaignGroupSpendCapContainer_107 extends React.Component { + render() { + if (this.props.x === 244) { + return React.createElement(AdsBulkCampaignSpendCapField106, {x: 243}); + } + } + } + + class AdsCardSection108 extends React.Component { + render() { + if (this.props.x === 248) { + return React.createElement(XUICardSection101, {x: 247}); + } + } + } + + class AdsEditorCampaignGroupDetailsSection109 extends React.Component { + render() { + if (this.props.x === 252) { + return React.createElement(AdsCard95, {x: 251}); + } + } + } + + class AdsEditorCampaignGroupDetailsSectionContainer110 extends React.Component { + render() { + if (this.props.x === 253) { + return React.createElement(AdsEditorCampaignGroupDetailsSection109, { + x: 252, + key: 'campaignGroupDetailsSection98010048849317', + }); + } + } + } + + class _render111 extends React.Component { + render() { + if (this.props.x === 254) { + return React.createElement( + AdsEditorCampaignGroupDetailsSectionContainer110, + {x: 253} + ); + } + } + } + + class FluxContainer_AdsEditorToplineDetailsSectionContainer_112 extends React.Component { + render() { + if (this.props.x === 256) { + return null; + } + } + } + + class _render113 extends React.Component { + render() { + if (this.props.x === 257) { + return React.createElement( + FluxContainer_AdsEditorToplineDetailsSectionContainer_112, + {x: 256} + ); + } + } + } + + class AdsStickyArea114 extends React.Component { + render() { + if (this.props.x === 259) { + return React.createElement( + 'div', + {}, + React.createElement('div', {onWheel: function () {}}) + ); + } + if (this.props.x === 292) { + return React.createElement( + 'div', + {}, + React.createElement('div', {onWheel: function () {}}, [ + React.createElement( + 'div', + {key: 'campaign_group_errors_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 291}) + ), + ]) + ); + } + } + } + + class FluxContainer_AdsEditorColumnContainer_115 extends React.Component { + render() { + if (this.props.x === 260) { + return React.createElement( + 'div', + null, + [ + React.createElement( + 'div', + {key: 'campaign_group_name_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 226}) + ), + React.createElement( + 'div', + {key: 'campaign_group_basic_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 255}) + ), + React.createElement( + 'div', + {key: 'campaign_group_topline_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 258}) + ), + ], + React.createElement(AdsStickyArea114, {x: 259}) + ); + } + if (this.props.x === 293) { + return React.createElement( + 'div', + null, + [ + React.createElement( + 'div', + {key: 'campaign_group_navigation_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 287}) + ), + ], + React.createElement(AdsStickyArea114, {x: 292}) + ); + } + } + } + + class BUISwitch116 extends React.Component { + render() { + if (this.props.x === 261) { + return React.createElement( + 'div', + { + 'data-hover': 'tooltip', + 'data-tooltip-content': + 'Currently active. Click this switch to deactivate it.', + 'data-tooltip-position': 'below', + disabled: false, + value: true, + onToggle: function () {}, + className: '_128j _128k _128n', + role: 'checkbox', + 'aria-checked': 'true', + }, + React.createElement( + 'div', + { + className: '_128o', + onClick: function () {}, + onKeyDown: function () {}, + onMouseDown: function () {}, + tabIndex: '0', + }, + React.createElement('div', {className: '_128p'}) + ), + null + ); + } + } + } + + class AdsStatusSwitchInternal117 extends React.Component { + render() { + if (this.props.x === 262) { + return React.createElement(BUISwitch116, {x: 261}); + } + } + } + + class AdsStatusSwitch118 extends React.Component { + render() { + if (this.props.x === 263) { + return React.createElement(AdsStatusSwitchInternal117, {x: 262}); + } + } + } + + class FluxContainer_AdsCampaignGroupStatusSwitchContainer_119 extends React.Component { + render() { + if (this.props.x === 264) { + return React.createElement(AdsStatusSwitch118, { + x: 263, + key: 'status98010048849317', + }); + } + } + } + + class AdsLinksMenu120 extends React.Component { + render() { + if (this.props.x === 275) { + return React.createElement(ReactPopoverMenu20, {x: 274}); + } + } + } + + class FluxContainer_AdsPluginizedLinksMenuContainer_121 extends React.Component { + render() { + if (this.props.x === 276) { + return React.createElement( + 'div', + null, + null, + React.createElement(AdsLinksMenu120, {x: 275}) + ); + } + } + } + + class AdsCardLeftRightHeader122 extends React.Component { + render() { + if (this.props.x === 278) { + return React.createElement(LeftRight21, {x: 277}); + } + } + } + + class AdsPEIDSection123 extends React.Component { + render() { + if (this.props.x === 282) { + return React.createElement(AdsCard95, {x: 281}); + } + } + } + + class FluxContainer_AdsPECampaignGroupIDSectionContainer_124 extends React.Component { + render() { + if (this.props.x === 283) { + return React.createElement(AdsPEIDSection123, {x: 282}); + } + } + } + + class DeferredComponent125 extends React.Component { + render() { + if (this.props.x === 284) { + return React.createElement( + FluxContainer_AdsPECampaignGroupIDSectionContainer_124, + {x: 283} + ); + } + } + } + + class BootloadedComponent126 extends React.Component { + render() { + if (this.props.x === 285) { + return React.createElement(DeferredComponent125, {x: 284}); + } + } + } + + class _render127 extends React.Component { + render() { + if (this.props.x === 286) { + return React.createElement(BootloadedComponent126, {x: 285}); + } + } + } + + class AdsEditorErrorsCard128 extends React.Component { + render() { + if (this.props.x === 288) { + return null; + } + } + } + + class FluxContainer_FunctionalContainer_129 extends React.Component { + render() { + if (this.props.x === 289) { + return React.createElement(AdsEditorErrorsCard128, {x: 288}); + } + } + } + + class _render130 extends React.Component { + render() { + if (this.props.x === 290) { + return React.createElement(FluxContainer_FunctionalContainer_129, { + x: 289, + }); + } + } + } + + class AdsEditorMultiColumnLayout131 extends React.Component { + render() { + if (this.props.x === 294) { + return React.createElement( + 'div', + {className: '_psh'}, + React.createElement( + 'div', + {className: '_3cc0'}, + React.createElement( + 'div', + null, + React.createElement(AdsEditorLoadingErrors90, { + x: 215, + key: '.0', + }), + React.createElement( + 'div', + {className: '_3ms3'}, + React.createElement( + 'div', + {className: '_3ms4'}, + React.createElement( + FluxContainer_AdsEditorColumnContainer_115, + {x: 260, key: '.1'} + ) + ), + React.createElement( + 'div', + {className: '_3pvg'}, + React.createElement( + FluxContainer_AdsEditorColumnContainer_115, + {x: 293, key: '.2'} + ) + ) + ) + ) + ) + ); + } + } + } + + class AdsPECampaignGroupEditor132 extends React.Component { + render() { + if (this.props.x === 295) { + return React.createElement( + 'div', + null, + React.createElement(AdsPECampaignGroupHeaderSectionContainer89, { + x: 214, + }), + React.createElement(AdsEditorMultiColumnLayout131, {x: 294}) + ); + } + } + } + + class AdsPECampaignGroupEditorContainer133 extends React.Component { + render() { + if (this.props.x === 296) { + return React.createElement(AdsPECampaignGroupEditor132, {x: 295}); + } + } + } + + class AdsPESideTrayTabContent134 extends React.Component { + render() { + if (this.props.x === 297) { + return React.createElement( + 'div', + {className: '_1o_8 _44ra _5cyn'}, + React.createElement(AdsPECampaignGroupEditorContainer133, {x: 296}) + ); + } + } + } + + class AdsPEEditorTrayTabContentContainer135 extends React.Component { + render() { + if (this.props.x === 298) { + return React.createElement(AdsPESideTrayTabContent134, {x: 297}); + } + } + } + + class AdsPEMultiTabDrawer136 extends React.Component { + render() { + if (this.props.x === 299) { + return React.createElement( + 'div', + {className: '_2kev _2kex'}, + React.createElement( + 'div', + {className: '_5yno'}, + React.createElement(AdsPEEditorTrayTabButton83, { + x: 197, + key: 'editor_tray_button', + }), + React.createElement(AdsPEInsightsTrayTabButton84, { + x: 202, + key: 'insights_tray_button', + }), + React.createElement(AdsPENekoDebuggerTrayTabButton85, { + x: 204, + key: 'neko_debugger_tray_button', + }) + ), + React.createElement( + 'div', + {className: '_5ynn'}, + React.createElement(AdsPEEditorTrayTabContentContainer135, { + x: 298, + key: 'EDITOR_DRAWER', + }), + null + ) + ); + } + } + } + + class FluxContainer_AdsPEMultiTabDrawerContainer_137 extends React.Component { + render() { + if (this.props.x === 300) { + return React.createElement(AdsPEMultiTabDrawer136, {x: 299}); + } + } + } + + class AdsPESimpleOrganizer138 extends React.Component { + render() { + if (this.props.x === 309) { + return React.createElement( + 'div', + {className: '_tm2'}, + React.createElement(XUIButton4, {x: 304}), + React.createElement(XUIButton4, {x: 306}), + React.createElement(XUIButton4, {x: 308}) + ); + } + } + } + + class AdsPEOrganizerContainer139 extends React.Component { + render() { + if (this.props.x === 310) { + return React.createElement( + 'div', + null, + React.createElement(AdsPESimpleOrganizer138, {x: 309}) + ); + } + } + } + + class FixedDataTableColumnResizeHandle140 extends React.Component { + render() { + if (this.props.x === 313) { + return React.createElement( + 'div', + { + className: '_3487 _3488 _3489', + style: {width: 0, height: 25, left: 0}, + }, + React.createElement('div', {className: '_348a', style: {height: 25}}) + ); + } + } + } + + class AdsPETableHeader141 extends React.Component { + render() { + if (this.props.x === 315) { + return React.createElement( + 'div', + {className: '_1cig _1ksv _1vd7 _4h2r', id: undefined}, + React.createElement(ReactImage0, {x: 314}), + React.createElement('span', {className: '_1cid'}, 'Campaigns') + ); + } + if (this.props.x === 320) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Performance') + ); + } + if (this.props.x === 323) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Overview') + ); + } + if (this.props.x === 326) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Toplines') + ); + } + if (this.props.x === 329) { + return React.createElement('div', { + className: '_1cig _1vd7 _4h2r', + id: undefined, + }); + } + if (this.props.x === 340) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Campaign Name') + ); + } + if (this.props.x === 346) { + return React.createElement( + 'div', + { + className: '_1cig _25fg', + id: undefined, + 'data-tooltip-content': 'Changed', + 'data-hover': 'tooltip', + }, + React.createElement(ReactImage0, {x: 345}), + null + ); + } + if (this.props.x === 352) { + return React.createElement( + 'div', + { + className: '_1cig _25fg', + id: 'ads_pe_table_error_header', + 'data-tooltip-content': 'Errors', + 'data-hover': 'tooltip', + }, + React.createElement(ReactImage0, {x: 351}), + null + ); + } + if (this.props.x === 357) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Status') + ); + } + if (this.props.x === 362) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Delivery') + ); + } + if (this.props.x === 369) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Results') + ); + } + if (this.props.x === 374) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Cost') + ); + } + if (this.props.x === 379) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Reach') + ); + } + if (this.props.x === 384) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Impressions') + ); + } + if (this.props.x === 389) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Clicks') + ); + } + if (this.props.x === 394) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Avg. CPM') + ); + } + if (this.props.x === 399) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Avg. CPC') + ); + } + if (this.props.x === 404) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'CTR %') + ); + } + if (this.props.x === 409) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Spent') + ); + } + if (this.props.x === 414) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Objective') + ); + } + if (this.props.x === 419) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Buying Type') + ); + } + if (this.props.x === 424) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Campaign ID') + ); + } + if (this.props.x === 429) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Start') + ); + } + if (this.props.x === 434) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'End') + ); + } + if (this.props.x === 439) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Date created') + ); + } + if (this.props.x === 444) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Date last edited') + ); + } + if (this.props.x === 449) { + return React.createElement( + 'div', + {className: '_1cig _25fg _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Tags') + ); + } + if (this.props.x === 452) { + return React.createElement('div', { + className: '_1cig _25fg _4h2r', + id: undefined, + }); + } + } + } + + class TransitionCell142 extends React.Component { + render() { + if (this.props.x === 316) { + return React.createElement( + 'div', + { + label: 'Campaigns', + height: 40, + width: 721, + className: '_4lgc _4h2u', + style: {height: 40, width: 721}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 315}) + ) + ) + ); + } + if (this.props.x === 321) { + return React.createElement( + 'div', + { + label: 'Performance', + height: 40, + width: 798, + className: '_4lgc _4h2u', + style: {height: 40, width: 798}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 320}) + ) + ) + ); + } + if (this.props.x === 324) { + return React.createElement( + 'div', + { + label: 'Overview', + height: 40, + width: 1022, + className: '_4lgc _4h2u', + style: {height: 40, width: 1022}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 323}) + ) + ) + ); + } + if (this.props.x === 327) { + return React.createElement( + 'div', + { + label: 'Toplines', + height: 40, + width: 0, + className: '_4lgc _4h2u', + style: {height: 40, width: 0}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 326}) + ) + ) + ); + } + if (this.props.x === 330) { + return React.createElement( + 'div', + { + label: '', + height: 40, + width: 25, + className: '_4lgc _4h2u', + style: {height: 40, width: 25}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 329}) + ) + ) + ); + } + if (this.props.x === 338) { + return React.createElement( + 'div', + { + label: undefined, + width: 42, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 42}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(XUICheckboxInput60, {x: 337}) + ) + ) + ); + } + if (this.props.x === 343) { + return React.createElement( + 'div', + { + label: 'Campaign Name', + width: 400, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 400}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 342}) + ) + ) + ); + } + if (this.props.x === 349) { + return React.createElement( + 'div', + { + label: undefined, + width: 33, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 33}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 348}) + ) + ) + ); + } + if (this.props.x === 355) { + return React.createElement( + 'div', + { + label: undefined, + width: 36, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 36}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 354}) + ) + ) + ); + } + if (this.props.x === 360) { + return React.createElement( + 'div', + { + label: 'Status', + width: 60, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 60}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 359}) + ) + ) + ); + } + if (this.props.x === 365) { + return React.createElement( + 'div', + { + label: 'Delivery', + width: 150, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 150}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 364}) + ) + ) + ); + } + if (this.props.x === 372) { + return React.createElement( + 'div', + { + label: 'Results', + width: 140, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 140}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 371}) + ) + ) + ); + } + if (this.props.x === 377) { + return React.createElement( + 'div', + { + label: 'Cost', + width: 140, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 140}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 376}) + ) + ) + ); + } + if (this.props.x === 382) { + return React.createElement( + 'div', + { + label: 'Reach', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 381}) + ) + ) + ); + } + if (this.props.x === 387) { + return React.createElement( + 'div', + { + label: 'Impressions', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 386}) + ) + ) + ); + } + if (this.props.x === 392) { + return React.createElement( + 'div', + { + label: 'Clicks', + width: 60, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 60}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 391}) + ) + ) + ); + } + if (this.props.x === 397) { + return React.createElement( + 'div', + { + label: 'Avg. CPM', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 396}) + ) + ) + ); + } + if (this.props.x === 402) { + return React.createElement( + 'div', + { + label: 'Avg. CPC', + width: 78, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 78}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 401}) + ) + ) + ); + } + if (this.props.x === 407) { + return React.createElement( + 'div', + { + label: 'CTR %', + width: 70, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 70}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 406}) + ) + ) + ); + } + if (this.props.x === 412) { + return React.createElement( + 'div', + { + label: 'Spent', + width: 70, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 70}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 411}) + ) + ) + ); + } + if (this.props.x === 417) { + return React.createElement( + 'div', + { + label: 'Objective', + width: 200, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 200}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 416}) + ) + ) + ); + } + if (this.props.x === 422) { + return React.createElement( + 'div', + { + label: 'Buying Type', + width: 100, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 100}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 421}) + ) + ) + ); + } + if (this.props.x === 427) { + return React.createElement( + 'div', + { + label: 'Campaign ID', + width: 120, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 120}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 426}) + ) + ) + ); + } + if (this.props.x === 432) { + return React.createElement( + 'div', + { + label: 'Start', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 431}) + ) + ) + ); + } + if (this.props.x === 437) { + return React.createElement( + 'div', + { + label: 'End', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 436}) + ) + ) + ); + } + if (this.props.x === 442) { + return React.createElement( + 'div', + { + label: 'Date created', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 441}) + ) + ) + ); + } + if (this.props.x === 447) { + return React.createElement( + 'div', + { + label: 'Date last edited', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 446}) + ) + ) + ); + } + if (this.props.x === 450) { + return React.createElement( + 'div', + { + label: 'Tags', + width: 150, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 150}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 449}) + ) + ) + ); + } + if (this.props.x === 453) { + return React.createElement( + 'div', + { + label: '', + width: 25, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 25}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 452}) + ) + ) + ); + } + } + } + + class FixedDataTableCell143 extends React.Component { + render() { + if (this.props.x === 317) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 721, left: 0}}, + undefined, + React.createElement(TransitionCell142, {x: 316}) + ); + } + if (this.props.x === 322) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 798, left: 0}}, + undefined, + React.createElement(TransitionCell142, {x: 321}) + ); + } + if (this.props.x === 325) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 40, width: 1022, left: 798}, + }, + undefined, + React.createElement(TransitionCell142, {x: 324}) + ); + } + if (this.props.x === 328) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 0, left: 1820}}, + undefined, + React.createElement(TransitionCell142, {x: 327}) + ); + } + if (this.props.x === 331) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 40, width: 25, left: 1820}, + }, + undefined, + React.createElement(TransitionCell142, {x: 330}) + ); + } + if (this.props.x === 339) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg6 _4h2m', + style: {height: 25, width: 42, left: 0}, + }, + undefined, + React.createElement(TransitionCell142, {x: 338}) + ); + } + if (this.props.x === 344) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 400, left: 42}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 343}) + ); + } + if (this.props.x === 350) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 33, left: 442}}, + undefined, + React.createElement(TransitionCell142, {x: 349}) + ); + } + if (this.props.x === 356) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 36, left: 475}}, + undefined, + React.createElement(TransitionCell142, {x: 355}) + ); + } + if (this.props.x === 361) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 60, left: 511}}, + undefined, + React.createElement(TransitionCell142, {x: 360}) + ); + } + if (this.props.x === 366) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 150, left: 571}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 365}) + ); + } + if (this.props.x === 373) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 140, left: 0}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 372}) + ); + } + if (this.props.x === 378) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 140, left: 140}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 377}) + ); + } + if (this.props.x === 383) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 280}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 382}) + ); + } + if (this.props.x === 388) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 360}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 387}) + ); + } + if (this.props.x === 393) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 60, left: 440}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 392}) + ); + } + if (this.props.x === 398) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 500}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 397}) + ); + } + if (this.props.x === 403) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 78, left: 580}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 402}) + ); + } + if (this.props.x === 408) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 70, left: 658}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 407}) + ); + } + if (this.props.x === 413) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 70, left: 728}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 412}) + ); + } + if (this.props.x === 418) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 200, left: 798}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 417}) + ); + } + if (this.props.x === 423) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 100, left: 998}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 422}) + ); + } + if (this.props.x === 428) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 120, left: 1098}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 427}) + ); + } + if (this.props.x === 433) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 113, left: 1218}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 432}) + ); + } + if (this.props.x === 438) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 113, left: 1331}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 437}) + ); + } + if (this.props.x === 443) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 113, left: 1444}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 442}) + ); + } + if (this.props.x === 448) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 113, left: 1557}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 447}) + ); + } + if (this.props.x === 451) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 150, left: 1670}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 450}) + ); + } + if (this.props.x === 454) { + return React.createElement( + 'div', + { + className: '_4lg0 _4h2m', + style: {height: 25, width: 25, left: 1820}, + }, + undefined, + React.createElement(TransitionCell142, {x: 453}) + ); + } + } + } + + class FixedDataTableCellGroupImpl144 extends React.Component { + render() { + if (this.props.x === 318) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 40, + position: 'absolute', + width: 721, + zIndex: 2, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 317, key: 'cell_0'}) + ); + } + if (this.props.x === 332) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 40, + position: 'absolute', + width: 1845, + zIndex: 0, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 322, key: 'cell_0'}), + React.createElement(FixedDataTableCell143, {x: 325, key: 'cell_1'}), + React.createElement(FixedDataTableCell143, {x: 328, key: 'cell_2'}), + React.createElement(FixedDataTableCell143, {x: 331, key: 'cell_3'}) + ); + } + if (this.props.x === 367) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 25, + position: 'absolute', + width: 721, + zIndex: 2, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 339, key: 'cell_0'}), + React.createElement(FixedDataTableCell143, {x: 344, key: 'cell_1'}), + React.createElement(FixedDataTableCell143, {x: 350, key: 'cell_2'}), + React.createElement(FixedDataTableCell143, {x: 356, key: 'cell_3'}), + React.createElement(FixedDataTableCell143, {x: 361, key: 'cell_4'}), + React.createElement(FixedDataTableCell143, {x: 366, key: 'cell_5'}) + ); + } + if (this.props.x === 455) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 25, + position: 'absolute', + width: 1845, + zIndex: 0, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 373, key: 'cell_0'}), + React.createElement(FixedDataTableCell143, {x: 378, key: 'cell_1'}), + React.createElement(FixedDataTableCell143, {x: 383, key: 'cell_2'}), + React.createElement(FixedDataTableCell143, {x: 388, key: 'cell_3'}), + React.createElement(FixedDataTableCell143, {x: 393, key: 'cell_4'}), + React.createElement(FixedDataTableCell143, {x: 398, key: 'cell_5'}), + React.createElement(FixedDataTableCell143, {x: 403, key: 'cell_6'}), + React.createElement(FixedDataTableCell143, {x: 408, key: 'cell_7'}), + React.createElement(FixedDataTableCell143, {x: 413, key: 'cell_8'}), + React.createElement(FixedDataTableCell143, {x: 418, key: 'cell_9'}), + React.createElement(FixedDataTableCell143, {x: 423, key: 'cell_10'}), + React.createElement(FixedDataTableCell143, {x: 428, key: 'cell_11'}), + React.createElement(FixedDataTableCell143, {x: 433, key: 'cell_12'}), + React.createElement(FixedDataTableCell143, {x: 438, key: 'cell_13'}), + React.createElement(FixedDataTableCell143, {x: 443, key: 'cell_14'}), + React.createElement(FixedDataTableCell143, {x: 448, key: 'cell_15'}), + React.createElement(FixedDataTableCell143, {x: 451, key: 'cell_16'}), + React.createElement(FixedDataTableCell143, {x: 454, key: 'cell_17'}) + ); + } + } + } + + class FixedDataTableCellGroup145 extends React.Component { + render() { + if (this.props.x === 319) { + return React.createElement( + 'div', + {style: {height: 40, left: 0}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 318}) + ); + } + if (this.props.x === 333) { + return React.createElement( + 'div', + {style: {height: 40, left: 721}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 332}) + ); + } + if (this.props.x === 368) { + return React.createElement( + 'div', + {style: {height: 25, left: 0}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 367}) + ); + } + if (this.props.x === 456) { + return React.createElement( + 'div', + {style: {height: 25, left: 721}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 455}) + ); + } + } + } + + class FixedDataTableRowImpl146 extends React.Component { + render() { + if (this.props.x === 334) { + return React.createElement( + 'div', + { + className: '_1gd4 _4li _52no _3h1a _1mib', + onClick: null, + onDoubleClick: null, + onMouseDown: null, + onMouseEnter: null, + onMouseLeave: null, + style: {width: 1209, height: 40}, + }, + React.createElement( + 'div', + {className: '_1gd5'}, + React.createElement(FixedDataTableCellGroup145, { + x: 319, + key: 'fixed_cells', + }), + React.createElement(FixedDataTableCellGroup145, { + x: 333, + key: 'scrollable_cells', + }), + React.createElement('div', { + className: '_1gd6 _1gd8', + style: {left: 721, height: 40}, + }) + ) + ); + } + if (this.props.x === 457) { + return React.createElement( + 'div', + { + className: '_1gd4 _4li _3h1a _1mib', + onClick: null, + onDoubleClick: null, + onMouseDown: null, + onMouseEnter: null, + onMouseLeave: null, + style: {width: 1209, height: 25}, + }, + React.createElement( + 'div', + {className: '_1gd5'}, + React.createElement(FixedDataTableCellGroup145, { + x: 368, + key: 'fixed_cells', + }), + React.createElement(FixedDataTableCellGroup145, { + x: 456, + key: 'scrollable_cells', + }), + React.createElement('div', { + className: '_1gd6 _1gd8', + style: {left: 721, height: 25}, + }) + ) + ); + } + } + } + + class FixedDataTableRow147 extends React.Component { + render() { + if (this.props.x === 335) { + return React.createElement( + 'div', + { + style: { + width: 1209, + height: 40, + zIndex: 1, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + className: '_1gda', + }, + React.createElement(FixedDataTableRowImpl146, {x: 334}) + ); + } + if (this.props.x === 458) { + return React.createElement( + 'div', + { + style: { + width: 1209, + height: 25, + zIndex: 1, + transform: 'translate3d(0px,40px,0)', + backfaceVisibility: 'hidden', + }, + className: '_1gda', + }, + React.createElement(FixedDataTableRowImpl146, {x: 457}) + ); + } + } + } + + class FixedDataTableAbstractSortableHeader148 extends React.Component { + render() { + if (this.props.x === 341) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 340}) + ) + ); + } + if (this.props.x === 347) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _1kst _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 346}) + ) + ); + } + if (this.props.x === 353) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _1kst _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 352}) + ) + ); + } + if (this.props.x === 358) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 357}) + ) + ); + } + if (this.props.x === 363) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _54_9 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 362}) + ) + ); + } + if (this.props.x === 370) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 369}) + ) + ); + } + if (this.props.x === 375) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 374}) + ) + ); + } + if (this.props.x === 380) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 379}) + ) + ); + } + if (this.props.x === 385) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 384}) + ) + ); + } + if (this.props.x === 390) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 389}) + ) + ); + } + if (this.props.x === 395) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 394}) + ) + ); + } + if (this.props.x === 400) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 399}) + ) + ); + } + if (this.props.x === 405) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 404}) + ) + ); + } + if (this.props.x === 410) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 409}) + ) + ); + } + if (this.props.x === 415) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 414}) + ) + ); + } + if (this.props.x === 420) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 419}) + ) + ); + } + if (this.props.x === 425) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 424}) + ) + ); + } + if (this.props.x === 430) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 429}) + ) + ); + } + if (this.props.x === 435) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 434}) + ) + ); + } + if (this.props.x === 440) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 439}) + ) + ); + } + if (this.props.x === 445) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 444}) + ) + ); + } + } + } + + class FixedDataTableSortableHeader149 extends React.Component { + render() { + if (this.props.x === 342) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 341, + }); + } + if (this.props.x === 348) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 347, + }); + } + if (this.props.x === 354) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 353, + }); + } + if (this.props.x === 359) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 358, + }); + } + if (this.props.x === 364) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 363, + }); + } + if (this.props.x === 371) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 370, + }); + } + if (this.props.x === 376) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 375, + }); + } + if (this.props.x === 381) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 380, + }); + } + if (this.props.x === 386) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 385, + }); + } + if (this.props.x === 391) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 390, + }); + } + if (this.props.x === 396) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 395, + }); + } + if (this.props.x === 401) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 400, + }); + } + if (this.props.x === 406) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 405, + }); + } + if (this.props.x === 411) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 410, + }); + } + if (this.props.x === 416) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 415, + }); + } + if (this.props.x === 421) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 420, + }); + } + if (this.props.x === 426) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 425, + }); + } + if (this.props.x === 431) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 430, + }); + } + if (this.props.x === 436) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 435, + }); + } + if (this.props.x === 441) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 440, + }); + } + if (this.props.x === 446) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 445, + }); + } + } + } + + class FixedDataTableBufferedRows150 extends React.Component { + render() { + if (this.props.x === 459) { + return React.createElement('div', { + style: { + position: 'absolute', + pointerEvents: 'auto', + transform: 'translate3d(0px,65px,0)', + backfaceVisibility: 'hidden', + }, + }); + } + } + } + + class Scrollbar151 extends React.Component { + render() { + if (this.props.x === 460) { + return null; + } + if (this.props.x === 461) { + return React.createElement( + 'div', + { + onFocus: function () {}, + onBlur: function () {}, + onKeyDown: function () {}, + onMouseDown: function () {}, + onWheel: function () {}, + className: '_1t0r _1t0t _4jdr _1t0u', + style: {width: 1209, zIndex: 99}, + tabIndex: 0, + }, + React.createElement('div', { + className: '_1t0w _1t0y _1t0_', + style: { + width: 561.6340607950117, + transform: 'translate3d(4px,0px,0)', + backfaceVisibility: 'hidden', + }, + }) + ); + } + } + } + + class HorizontalScrollbar152 extends React.Component { + render() { + if (this.props.x === 462) { + return React.createElement( + 'div', + {className: '_3h1k _3h1m', style: {height: 15, width: 1209}}, + React.createElement( + 'div', + { + style: { + height: 15, + position: 'absolute', + overflow: 'hidden', + width: 1209, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(Scrollbar151, {x: 461}) + ) + ); + } + } + } + + class FixedDataTable153 extends React.Component { + render() { + if (this.props.x === 463) { + return React.createElement( + 'div', + { + className: '_3h1i _1mie', + onWheel: function () {}, + style: {height: 25, width: 1209}, + }, + React.createElement( + 'div', + {className: '_3h1j', style: {height: 8, width: 1209}}, + React.createElement(FixedDataTableColumnResizeHandle140, {x: 313}), + React.createElement(FixedDataTableRow147, { + x: 335, + key: 'group_header', + }), + React.createElement(FixedDataTableRow147, {x: 458, key: 'header'}), + React.createElement(FixedDataTableBufferedRows150, {x: 459}), + null, + undefined, + React.createElement('div', { + className: '_3h1e _3h1h', + style: {top: 8}, + }) + ), + React.createElement(Scrollbar151, {x: 460}), + React.createElement(HorizontalScrollbar152, {x: 462}) + ); + } + } + } + + class TransitionTable154 extends React.Component { + render() { + if (this.props.x === 464) { + return React.createElement(FixedDataTable153, {x: 463}); + } + } + } + + class AdsSelectableFixedDataTable155 extends React.Component { + render() { + if (this.props.x === 465) { + return React.createElement( + 'div', + {className: '_5hht'}, + React.createElement(TransitionTable154, {x: 464}) + ); + } + } + } + + class AdsDataTableKeyboardSupportDecorator156 extends React.Component { + render() { + if (this.props.x === 466) { + return React.createElement( + 'div', + {className: '_5d6f', tabIndex: '0', onKeyDown: function () {}}, + React.createElement(AdsSelectableFixedDataTable155, {x: 465}) + ); + } + } + } + + class AdsEditableDataTableDecorator157 extends React.Component { + render() { + if (this.props.x === 467) { + return React.createElement( + 'div', + {onCopy: function () {}}, + React.createElement(AdsDataTableKeyboardSupportDecorator156, {x: 466}) + ); + } + } + } + + class AdsPEDataTableContainer158 extends React.Component { + render() { + if (this.props.x === 468) { + return React.createElement( + 'div', + {className: '_35l_ _1hr clearfix'}, + null, + null, + null, + React.createElement(AdsEditableDataTableDecorator157, {x: 467}) + ); + } + } + } + + class AdsPECampaignGroupTableContainer159 extends React.Component { + render() { + if (this.props.x === 470) { + return React.createElement(ResponsiveBlock37, {x: 469}); + } + } + } + + class AdsPEManageAdsPaneContainer160 extends React.Component { + render() { + if (this.props.x === 473) { + return React.createElement( + 'div', + null, + React.createElement(AdsErrorBoundary10, {x: 65}), + React.createElement( + 'div', + {className: '_2uty'}, + React.createElement(AdsErrorBoundary10, {x: 125}) + ), + React.createElement( + 'div', + {className: '_2utx _21oc'}, + React.createElement(AdsErrorBoundary10, {x: 171}), + React.createElement( + 'div', + {className: '_41tu'}, + React.createElement(AdsErrorBoundary10, {x: 176}), + React.createElement(AdsErrorBoundary10, {x: 194}) + ) + ), + React.createElement( + 'div', + {className: '_2utz', style: {height: 25}}, + React.createElement(AdsErrorBoundary10, {x: 302}), + React.createElement( + 'div', + {className: '_2ut-'}, + React.createElement(AdsErrorBoundary10, {x: 312}) + ), + React.createElement( + 'div', + {className: '_2ut_'}, + React.createElement(AdsErrorBoundary10, {x: 472}) + ) + ) + ); + } + } + } + + class AdsPEContentContainer161 extends React.Component { + render() { + if (this.props.x === 474) { + return React.createElement(AdsPEManageAdsPaneContainer160, {x: 473}); + } + } + } + + class FluxContainer_AdsPEWorkspaceContainer_162 extends React.Component { + render() { + if (this.props.x === 477) { + return React.createElement( + 'div', + {className: '_49wu', style: {height: 177, top: 43, width: 1306}}, + React.createElement(ResponsiveBlock37, {x: 62, key: '0'}), + React.createElement(AdsErrorBoundary10, {x: 476, key: '1'}), + null + ); + } + } + } + + class FluxContainer_AdsSessionExpiredDialogContainer_163 extends React.Component { + render() { + if (this.props.x === 478) { + return null; + } + } + } + + class FluxContainer_AdsPEUploadDialogLazyContainer_164 extends React.Component { + render() { + if (this.props.x === 479) { + return null; + } + } + } + + class FluxContainer_DialogContainer_165 extends React.Component { + render() { + if (this.props.x === 480) { + return null; + } + } + } + + class AdsBugReportContainer166 extends React.Component { + render() { + if (this.props.x === 481) { + return React.createElement('span', null); + } + } + } + + class AdsPEAudienceSplittingDialog167 extends React.Component { + render() { + if (this.props.x === 482) { + return null; + } + } + } + + class AdsPEAudienceSplittingDialogContainer168 extends React.Component { + render() { + if (this.props.x === 483) { + return React.createElement( + 'div', + null, + React.createElement(AdsPEAudienceSplittingDialog167, {x: 482}) + ); + } + } + } + + class FluxContainer_AdsRuleDialogBootloadContainer_169 extends React.Component { + render() { + if (this.props.x === 484) { + return null; + } + } + } + + class FluxContainer_AdsPECFTrayContainer_170 extends React.Component { + render() { + if (this.props.x === 485) { + return null; + } + } + } + + class FluxContainer_AdsPEDeleteDraftContainer_171 extends React.Component { + render() { + if (this.props.x === 486) { + return null; + } + } + } + + class FluxContainer_AdsPEInitialDraftPublishDialogContainer_172 extends React.Component { + render() { + if (this.props.x === 487) { + return null; + } + } + } + + class FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173 extends React.Component { + render() { + if (this.props.x === 488) { + return null; + } + } + } + + class FluxContainer_AdsPEPurgeArchiveDialogContainer_174 extends React.Component { + render() { + if (this.props.x === 489) { + return null; + } + } + } + + class AdsPECreateDialogContainer175 extends React.Component { + render() { + if (this.props.x === 490) { + return React.createElement('span', null); + } + } + } + + class FluxContainer_AdsPEModalStatusContainer_176 extends React.Component { + render() { + if (this.props.x === 491) { + return null; + } + } + } + + class FluxContainer_AdsBrowserExtensionErrorDialogContainer_177 extends React.Component { + render() { + if (this.props.x === 492) { + return null; + } + } + } + + class FluxContainer_AdsPESortByErrorTipContainer_178 extends React.Component { + render() { + if (this.props.x === 493) { + return null; + } + } + } + + class LeadDownloadDialogSelector179 extends React.Component { + render() { + if (this.props.x === 494) { + return null; + } + } + } + + class FluxContainer_AdsPELeadDownloadDialogContainerClass_180 extends React.Component { + render() { + if (this.props.x === 495) { + return React.createElement(LeadDownloadDialogSelector179, {x: 494}); + } + } + } + + class AdsPEContainer181 extends React.Component { + render() { + if (this.props.x === 496) { + return React.createElement( + 'div', + {id: 'ads_pe_container'}, + React.createElement(FluxContainer_AdsPETopNavContainer_26, {x: 41}), + null, + React.createElement(FluxContainer_AdsPEWorkspaceContainer_162, { + x: 477, + }), + React.createElement( + FluxContainer_AdsSessionExpiredDialogContainer_163, + {x: 478} + ), + React.createElement( + FluxContainer_AdsPEUploadDialogLazyContainer_164, + {x: 479} + ), + React.createElement(FluxContainer_DialogContainer_165, {x: 480}), + React.createElement(AdsBugReportContainer166, {x: 481}), + React.createElement(AdsPEAudienceSplittingDialogContainer168, { + x: 483, + }), + React.createElement( + FluxContainer_AdsRuleDialogBootloadContainer_169, + {x: 484} + ), + React.createElement(FluxContainer_AdsPECFTrayContainer_170, {x: 485}), + React.createElement( + 'span', + null, + React.createElement(FluxContainer_AdsPEDeleteDraftContainer_171, { + x: 486, + }), + React.createElement( + FluxContainer_AdsPEInitialDraftPublishDialogContainer_172, + {x: 487} + ), + React.createElement( + FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173, + {x: 488} + ) + ), + React.createElement( + FluxContainer_AdsPEPurgeArchiveDialogContainer_174, + {x: 489} + ), + React.createElement(AdsPECreateDialogContainer175, {x: 490}), + React.createElement(FluxContainer_AdsPEModalStatusContainer_176, { + x: 491, + }), + React.createElement( + FluxContainer_AdsBrowserExtensionErrorDialogContainer_177, + {x: 492} + ), + React.createElement(FluxContainer_AdsPESortByErrorTipContainer_178, { + x: 493, + }), + React.createElement( + FluxContainer_AdsPELeadDownloadDialogContainerClass_180, + {x: 495} + ), + React.createElement('div', {id: 'web_ads_guidance_tips'}) + ); + } + } + } + + class Benchmark extends React.Component { + render() { + if (this.props.x === undefined) { + return React.createElement(AdsPEContainer181, {x: 496}); + } + } + } + + var app = document.getElementById('app'); + + window.render = function render() { + ReactDOM.render(React.createElement(Benchmark, null), app); + }; +})(); diff --git a/scripts/bench/benchmarks/pe-class-components/build.js b/scripts/bench/benchmarks/pe-class-components/build.js new file mode 100644 index 00000000000..ffbd82637d2 --- /dev/null +++ b/scripts/bench/benchmarks/pe-class-components/build.js @@ -0,0 +1,17 @@ +'use strict'; + +const {join} = require('path'); + +async function build(reactPath, asyncCopyTo) { + // copy the UMD bundles + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react.production.js'), + join(__dirname, 'react.production.js') + ); + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react-dom.production.js'), + join(__dirname, 'react-dom.production.js') + ); +} + +module.exports = build; diff --git a/scripts/bench/benchmarks/pe-class-components/index.html b/scripts/bench/benchmarks/pe-class-components/index.html new file mode 100644 index 00000000000..c2d44dcd00b --- /dev/null +++ b/scripts/bench/benchmarks/pe-class-components/index.html @@ -0,0 +1,32 @@ + + +

+ + + + + + + + + + \ No newline at end of file diff --git a/scripts/bench/benchmarks/pe-functional-components/benchmark.js b/scripts/bench/benchmarks/pe-functional-components/benchmark.js new file mode 100644 index 00000000000..7365caefe73 --- /dev/null +++ b/scripts/bench/benchmarks/pe-functional-components/benchmark.js @@ -0,0 +1,5179 @@ +(function () { + 'use strict'; + + var ReactImage0 = function (props) { + if (props.x === 0) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (props.x === 15) { + return React.createElement('i', { + className: '_3ut_ img sp_i534r85sjIn sx_e8ac93', + src: null, + alt: '', + }); + } + if (props.x === 22) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_7b15bc', + src: null, + }); + } + if (props.x === 29) { + return React.createElement('i', { + className: '_1m1s _4540 _p img sp_i534r85sjIn sx_f40b1c', + src: null, + alt: '', + }); + } + if (props.x === 42) { + return React.createElement( + 'i', + { + alt: 'Warning', + className: '_585p img sp_i534r85sjIn sx_20273d', + src: null, + }, + React.createElement('u', null, 'Warning') + ); + } + if (props.x === 67) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_b5d079', + src: null, + }); + } + if (props.x === 70) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_29f8c9', + }); + } + if (props.x === 76) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_ef6a9c', + src: null, + }); + } + if (props.x === 79) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_6f8c43', + }); + } + if (props.x === 88) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_e94a2d', + }); + } + if (props.x === 91) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_7ed7d4', + }); + } + if (props.x === 94) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_930440', + }); + } + if (props.x === 98) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_750c83', + }); + } + if (props.x === 108) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_73c1bb', + }); + } + if (props.x === 111) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_29f28d', + }); + } + if (props.x === 126) { + return React.createElement('i', { + src: null, + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_91c59e', + }); + } + if (props.x === 127) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (props.x === 134) { + return React.createElement('i', { + src: null, + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_c8eb75', + }); + } + if (props.x === 135) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (props.x === 148) { + return React.createElement('i', { + className: '_3yz6 _5whs img sp_i534r85sjIn sx_896996', + src: null, + alt: '', + }); + } + if (props.x === 152) { + return React.createElement('i', { + className: '_5b5p _4gem img sp_i534r85sjIn sx_896996', + src: null, + alt: '', + }); + } + if (props.x === 153) { + return React.createElement('i', { + className: '_541d img sp_i534r85sjIn sx_2f396a', + src: null, + alt: '', + }); + } + if (props.x === 160) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_31d9b0', + }); + } + if (props.x === 177) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_2c18b7', + src: null, + }); + } + if (props.x === 186) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_0a681f', + }); + } + if (props.x === 195) { + return React.createElement('i', { + className: '_1-lx img sp_OkER5ktbEyg sx_b369b4', + src: null, + alt: '', + }); + } + if (props.x === 198) { + return React.createElement('i', { + className: '_1-lx img sp_i534r85sjIn sx_96948e', + src: null, + alt: '', + }); + } + if (props.x === 237) { + return React.createElement('i', { + className: '_541d img sp_i534r85sjIn sx_2f396a', + src: null, + alt: '', + }); + } + if (props.x === 266) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (props.x === 314) { + return React.createElement('i', { + className: '_1cie _1cif img sp_i534r85sjIn sx_6e6820', + src: null, + alt: '', + }); + } + if (props.x === 345) { + return React.createElement('i', { + className: '_1cie img sp_i534r85sjIn sx_e896cf', + src: null, + alt: '', + }); + } + if (props.x === 351) { + return React.createElement('i', { + className: '_1cie img sp_i534r85sjIn sx_38fed8', + src: null, + alt: '', + }); + } + }; + + var AbstractLink1 = function (props) { + if (props.x === 1) { + return React.createElement( + 'a', + { + className: '_387r _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {width: 250, maxWidth: '250px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '236px'}}, + null, + React.createElement( + 'span', + null, + React.createElement('span', {className: '_48u-'}, 'Account:'), + ' ', + 'Dick Madanson (10149999073643408)' + ) + ), + React.createElement(ReactImage0, {x: 0}) + ); + } + if (props.x === 43) { + return React.createElement( + 'a', + { + className: '_585q _50zy _50-0 _50z- _5upp _42ft', + size: 'medium', + type: null, + title: 'Remove', + 'data-hover': undefined, + 'data-tooltip-alignh': undefined, + 'data-tooltip-content': undefined, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + undefined, + 'Remove', + undefined + ); + } + if (props.x === 49) { + return React.createElement( + 'a', + { + target: '_blank', + href: '/ads/manage/billing.php?act=10149999073643408', + rel: undefined, + onClick: function () {}, + }, + React.createElement(XUIText29, {x: 48}) + ); + } + if (props.x === 128) { + return React.createElement( + 'a', + { + className: ' _5bbf _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + React.createElement(ReactImage0, {x: 126}), + 'Search' + ), + React.createElement(ReactImage0, {x: 127}) + ); + } + if (props.x === 136) { + return React.createElement( + 'a', + { + className: ' _5bbf _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + React.createElement(ReactImage0, {x: 134}), + 'Filters' + ), + React.createElement(ReactImage0, {x: 135}) + ); + } + if (props.x === 178) { + return React.createElement( + 'a', + { + className: '_1_-t _1_-v _42ft', + disabled: null, + height: 'medium', + role: 'button', + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + undefined, + 'Lifetime', + React.createElement(ReactImage0, {x: 177}) + ); + } + if (props.x === 207) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'Create Ad Set' + ); + } + if (props.x === 209) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'View Ad Set' + ); + } + if (props.x === 241) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'Set a Limit' + ); + } + if (props.x === 267) { + return React.createElement( + 'a', + { + className: '_p _55pi _2agf _4jy0 _4jy3 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + null, + 'Links' + ), + React.createElement(ReactImage0, {x: 266}) + ); + } + }; + + var Link2 = function (props) { + if (props.x === 2) { + return React.createElement(AbstractLink1, {x: 1}); + } + if (props.x === 44) { + return React.createElement(AbstractLink1, {x: 43}); + } + if (props.x === 50) { + return React.createElement(AbstractLink1, {x: 49}); + } + if (props.x === 129) { + return React.createElement(AbstractLink1, {x: 128}); + } + if (props.x === 137) { + return React.createElement(AbstractLink1, {x: 136}); + } + if (props.x === 179) { + return React.createElement(AbstractLink1, {x: 178}); + } + if (props.x === 208) { + return React.createElement(AbstractLink1, {x: 207}); + } + if (props.x === 210) { + return React.createElement(AbstractLink1, {x: 209}); + } + if (props.x === 242) { + return React.createElement(AbstractLink1, {x: 241}); + } + if (props.x === 268) { + return React.createElement(AbstractLink1, {x: 267}); + } + }; + + var AbstractButton3 = function (props) { + if (props.x === 3) { + return React.createElement(Link2, {x: 2}); + } + if (props.x === 20) { + return React.createElement( + 'button', + { + className: '_5n7z _4jy0 _4jy4 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + 'Discard Changes', + undefined + ); + } + if (props.x === 23) { + return React.createElement( + 'button', + { + className: '_5n7z _2yak _4lj- _4jy0 _4jy4 _517h _51sy _42ft _42fr', + disabled: true, + onClick: function () {}, + 'data-tooltip-content': 'You have no changes to publish', + 'data-hover': 'tooltip', + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 22}), + 'Review Changes', + undefined + ); + } + if (props.x === 45) { + return React.createElement(Link2, {x: 44}); + } + if (props.x === 68) { + return React.createElement( + 'button', + { + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 67}), + 'Create Campaign', + undefined + ); + } + if (props.x === 71) { + return React.createElement( + 'button', + { + className: '_u_k _3qx6 _p _4jy0 _4jy4 _517h _51sy _42ft', + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 70}), + undefined, + undefined + ); + } + if (props.x === 77) { + return React.createElement( + 'button', + { + 'aria-label': 'Edit', + 'data-tooltip-content': 'Edit Campaigns (Ctrl+U)', + 'data-hover': 'tooltip', + className: '_d2_ _u_k noMargin _4jy0 _4jy4 _517h _51sy _42ft', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 76}), + 'Edit', + undefined + ); + } + if (props.x === 80) { + return React.createElement( + 'button', + { + className: '_u_k _3qx6 _p _4jy0 _4jy4 _517h _51sy _42ft', + disabled: false, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 79}), + undefined, + undefined + ); + } + if (props.x === 89) { + return React.createElement( + 'button', + { + 'aria-label': 'Revert', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft _42fr', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Revert', + disabled: true, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 88}), + undefined, + undefined + ); + } + if (props.x === 92) { + return React.createElement( + 'button', + { + 'aria-label': 'Delete', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Delete', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 91}), + undefined, + undefined + ); + } + if (props.x === 95) { + return React.createElement( + 'button', + { + 'aria-label': 'Duplicate', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Duplicate', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 94}), + undefined, + undefined + ); + } + if (props.x === 99) { + return React.createElement( + 'button', + { + 'aria-label': 'Export & Import', + className: '_u_k noMargin _p _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Export & Import', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 98}), + undefined, + undefined + ); + } + if (props.x === 109) { + return React.createElement( + 'button', + { + 'aria-label': 'Create Report', + className: '_u_k _5n7z _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Create Report', + disabled: false, + style: {boxSizing: 'border-box', height: '28px', width: '48px'}, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 108}), + undefined, + undefined + ); + } + if (props.x === 112) { + return React.createElement( + 'button', + { + 'aria-label': 'Campaign Tags', + className: ' _5uy7 _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Campaign Tags', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 111}), + undefined, + undefined + ); + } + if (props.x === 130) { + return React.createElement(Link2, {x: 129}); + } + if (props.x === 138) { + return React.createElement(Link2, {x: 137}); + } + if (props.x === 149) { + return React.createElement( + 'button', + { + className: '_3yz9 _1t-2 _50z- _50zy _50zz _50z- _5upp _42ft', + size: 'small', + onClick: function () {}, + type: 'button', + title: 'Remove', + 'data-hover': undefined, + 'data-tooltip-alignh': undefined, + 'data-tooltip-content': undefined, + label: null, + }, + undefined, + 'Remove', + undefined + ); + } + if (props.x === 156) { + return React.createElement( + 'button', + { + className: '_5b5u _5b5v _4jy0 _4jy3 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + 'Apply', + undefined + ); + } + if (props.x === 161) { + return React.createElement( + 'button', + { + className: '_1wdf _4jy0 _517i _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 160}), + undefined, + undefined + ); + } + if (props.x === 180) { + return React.createElement(Link2, {x: 179}); + } + if (props.x === 187) { + return React.createElement( + 'button', + { + 'aria-label': 'List Settings', + className: '_u_k _3c5o _1-r0 _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'List Settings', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + React.createElement(ReactImage0, {x: 186}), + undefined, + undefined + ); + } + if (props.x === 269) { + return React.createElement(Link2, {x: 268}); + } + if (props.x === 303) { + return React.createElement( + 'button', + { + className: '_tm3 _tm6 _tm7 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Campaigns', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + if (props.x === 305) { + return React.createElement( + 'button', + { + className: '_tm4 _tm6 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Ad Sets', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + if (props.x === 307) { + return React.createElement( + 'button', + { + className: '_tm5 _tm6 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Ads', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + }; + + var XUIButton4 = function (props) { + if (props.x === 4) { + return React.createElement(AbstractButton3, {x: 3}); + } + if (props.x === 21) { + return React.createElement(AbstractButton3, {x: 20}); + } + if (props.x === 24) { + return React.createElement(AbstractButton3, {x: 23}); + } + if (props.x === 69) { + return React.createElement(AbstractButton3, {x: 68}); + } + if (props.x === 72) { + return React.createElement(AbstractButton3, {x: 71}); + } + if (props.x === 78) { + return React.createElement(AbstractButton3, {x: 77}); + } + if (props.x === 81) { + return React.createElement(AbstractButton3, {x: 80}); + } + if (props.x === 90) { + return React.createElement(AbstractButton3, {x: 89}); + } + if (props.x === 93) { + return React.createElement(AbstractButton3, {x: 92}); + } + if (props.x === 96) { + return React.createElement(AbstractButton3, {x: 95}); + } + if (props.x === 100) { + return React.createElement(AbstractButton3, {x: 99}); + } + if (props.x === 110) { + return React.createElement(AbstractButton3, {x: 109}); + } + if (props.x === 113) { + return React.createElement(AbstractButton3, {x: 112}); + } + if (props.x === 131) { + return React.createElement(AbstractButton3, {x: 130}); + } + if (props.x === 139) { + return React.createElement(AbstractButton3, {x: 138}); + } + if (props.x === 157) { + return React.createElement(AbstractButton3, {x: 156}); + } + if (props.x === 162) { + return React.createElement(AbstractButton3, {x: 161}); + } + if (props.x === 188) { + return React.createElement(AbstractButton3, {x: 187}); + } + if (props.x === 270) { + return React.createElement(AbstractButton3, {x: 269}); + } + if (props.x === 304) { + return React.createElement(AbstractButton3, {x: 303}); + } + if (props.x === 306) { + return React.createElement(AbstractButton3, {x: 305}); + } + if (props.x === 308) { + return React.createElement(AbstractButton3, {x: 307}); + } + }; + + var AbstractPopoverButton5 = function (props) { + if (props.x === 5) { + return React.createElement(XUIButton4, {x: 4}); + } + if (props.x === 132) { + return React.createElement(XUIButton4, {x: 131}); + } + if (props.x === 140) { + return React.createElement(XUIButton4, {x: 139}); + } + if (props.x === 271) { + return React.createElement(XUIButton4, {x: 270}); + } + }; + + var ReactXUIPopoverButton6 = function (props) { + if (props.x === 6) { + return React.createElement(AbstractPopoverButton5, {x: 5}); + } + if (props.x === 133) { + return React.createElement(AbstractPopoverButton5, {x: 132}); + } + if (props.x === 141) { + return React.createElement(AbstractPopoverButton5, {x: 140}); + } + if (props.x === 272) { + return React.createElement(AbstractPopoverButton5, {x: 271}); + } + }; + + var BIGAdAccountSelector7 = function (props) { + if (props.x === 7) { + return React.createElement( + 'div', + null, + React.createElement(ReactXUIPopoverButton6, {x: 6}), + null + ); + } + }; + + var FluxContainer_AdsPEBIGAdAccountSelectorContainer_8 = function (props) { + if (props.x === 8) { + return React.createElement(BIGAdAccountSelector7, {x: 7}); + } + }; + + var ErrorBoundary9 = function (props) { + if (props.x === 9) { + return React.createElement( + FluxContainer_AdsPEBIGAdAccountSelectorContainer_8, + {x: 8} + ); + } + if (props.x === 13) { + return React.createElement(FluxContainer_AdsPENavigationBarContainer_12, { + x: 12, + }); + } + if (props.x === 27) { + return React.createElement(FluxContainer_AdsPEPublishButtonContainer_18, { + x: 26, + }); + } + if (props.x === 32) { + return React.createElement(ReactPopoverMenu20, {x: 31}); + } + if (props.x === 38) { + return React.createElement(AdsPEResetDialog24, {x: 37}); + } + if (props.x === 57) { + return React.createElement(FluxContainer_AdsPETopErrorContainer_35, { + x: 56, + }); + } + if (props.x === 60) { + return React.createElement(FluxContainer_AdsGuidanceChannel_36, {x: 59}); + } + if (props.x === 64) { + return React.createElement(FluxContainer_AdsBulkEditDialogContainer_38, { + x: 63, + }); + } + if (props.x === 124) { + return React.createElement(AdsPECampaignGroupToolbarContainer57, { + x: 123, + }); + } + if (props.x === 170) { + return React.createElement(AdsPEFilterContainer72, {x: 169}); + } + if (props.x === 175) { + return React.createElement(AdsPETablePagerContainer75, {x: 174}); + } + if (props.x === 193) { + return React.createElement(AdsPEStatRangeContainer81, {x: 192}); + } + if (props.x === 301) { + return React.createElement( + FluxContainer_AdsPEMultiTabDrawerContainer_137, + {x: 300} + ); + } + if (props.x === 311) { + return React.createElement(AdsPEOrganizerContainer139, {x: 310}); + } + if (props.x === 471) { + return React.createElement(AdsPECampaignGroupTableContainer159, {x: 470}); + } + if (props.x === 475) { + return React.createElement(AdsPEContentContainer161, {x: 474}); + } + }; + + var AdsErrorBoundary10 = function (props) { + if (props.x === 10) { + return React.createElement(ErrorBoundary9, {x: 9}); + } + if (props.x === 14) { + return React.createElement(ErrorBoundary9, {x: 13}); + } + if (props.x === 28) { + return React.createElement(ErrorBoundary9, {x: 27}); + } + if (props.x === 33) { + return React.createElement(ErrorBoundary9, {x: 32}); + } + if (props.x === 39) { + return React.createElement(ErrorBoundary9, {x: 38}); + } + if (props.x === 58) { + return React.createElement(ErrorBoundary9, {x: 57}); + } + if (props.x === 61) { + return React.createElement(ErrorBoundary9, {x: 60}); + } + if (props.x === 65) { + return React.createElement(ErrorBoundary9, {x: 64}); + } + if (props.x === 125) { + return React.createElement(ErrorBoundary9, {x: 124}); + } + if (props.x === 171) { + return React.createElement(ErrorBoundary9, {x: 170}); + } + if (props.x === 176) { + return React.createElement(ErrorBoundary9, {x: 175}); + } + if (props.x === 194) { + return React.createElement(ErrorBoundary9, {x: 193}); + } + if (props.x === 302) { + return React.createElement(ErrorBoundary9, {x: 301}); + } + if (props.x === 312) { + return React.createElement(ErrorBoundary9, {x: 311}); + } + if (props.x === 472) { + return React.createElement(ErrorBoundary9, {x: 471}); + } + if (props.x === 476) { + return React.createElement(ErrorBoundary9, {x: 475}); + } + }; + + var AdsPENavigationBar11 = function (props) { + if (props.x === 11) { + return React.createElement('div', {className: '_4t_9'}); + } + }; + + var FluxContainer_AdsPENavigationBarContainer_12 = function (props) { + if (props.x === 12) { + return React.createElement(AdsPENavigationBar11, {x: 11}); + } + }; + + var AdsPEDraftSyncStatus13 = function (props) { + if (props.x === 16) { + return React.createElement( + 'div', + {className: '_3ut-', onClick: function () {}}, + React.createElement( + 'span', + {className: '_3uu0'}, + React.createElement(ReactImage0, {x: 15}) + ) + ); + } + }; + + var FluxContainer_AdsPEDraftSyncStatusContainer_14 = function (props) { + if (props.x === 17) { + return React.createElement(AdsPEDraftSyncStatus13, {x: 16}); + } + }; + + var AdsPEDraftErrorsStatus15 = function (props) { + if (props.x === 18) { + return null; + } + }; + + var FluxContainer_viewFn_16 = function (props) { + if (props.x === 19) { + return React.createElement(AdsPEDraftErrorsStatus15, {x: 18}); + } + }; + + var AdsPEPublishButton17 = function (props) { + if (props.x === 25) { + return React.createElement( + 'div', + {className: '_5533'}, + React.createElement(FluxContainer_AdsPEDraftSyncStatusContainer_14, { + x: 17, + }), + React.createElement(FluxContainer_viewFn_16, {x: 19}), + null, + React.createElement(XUIButton4, {x: 21, key: 'discard'}), + React.createElement(XUIButton4, {x: 24}) + ); + } + }; + + var FluxContainer_AdsPEPublishButtonContainer_18 = function (props) { + if (props.x === 26) { + return React.createElement(AdsPEPublishButton17, {x: 25}); + } + }; + + var InlineBlock19 = function (props) { + if (props.x === 30) { + return React.createElement( + 'div', + {className: 'uiPopover _6a _6b', disabled: null}, + React.createElement(ReactImage0, {x: 29, key: '.0'}) + ); + } + if (props.x === 73) { + return React.createElement( + 'div', + {className: 'uiPopover _6a _6b', disabled: null}, + React.createElement(XUIButton4, {x: 72, key: '.0'}) + ); + } + if (props.x === 82) { + return React.createElement( + 'div', + {className: '_1nwm uiPopover _6a _6b', disabled: null}, + React.createElement(XUIButton4, {x: 81, key: '.0'}) + ); + } + if (props.x === 101) { + return React.createElement( + 'div', + {size: 'large', className: 'uiPopover _6a _6b', disabled: null}, + React.createElement(XUIButton4, {x: 100, key: '.0'}) + ); + } + if (props.x === 273) { + return React.createElement( + 'div', + { + className: '_3-90 uiPopover _6a _6b', + style: {marginTop: 2}, + disabled: null, + }, + React.createElement(ReactXUIPopoverButton6, {x: 272, key: '.0'}) + ); + } + }; + + var ReactPopoverMenu20 = function (props) { + if (props.x === 31) { + return React.createElement(InlineBlock19, {x: 30}); + } + if (props.x === 74) { + return React.createElement(InlineBlock19, {x: 73}); + } + if (props.x === 83) { + return React.createElement(InlineBlock19, {x: 82}); + } + if (props.x === 102) { + return React.createElement(InlineBlock19, {x: 101}); + } + if (props.x === 274) { + return React.createElement(InlineBlock19, {x: 273}); + } + }; + + var LeftRight21 = function (props) { + if (props.x === 34) { + return React.createElement( + 'div', + {className: 'clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement( + 'div', + {className: '_34_j'}, + React.createElement( + 'div', + {className: '_34_k'}, + React.createElement(AdsErrorBoundary10, {x: 10}) + ), + React.createElement( + 'div', + {className: '_2u-6'}, + React.createElement(AdsErrorBoundary10, {x: 14}) + ) + ) + ), + React.createElement( + 'div', + {key: 'right', className: '_ohf rfloat'}, + React.createElement( + 'div', + {className: '_34_m'}, + React.createElement( + 'div', + {key: '0', className: '_5ju2'}, + React.createElement(AdsErrorBoundary10, {x: 28}) + ), + React.createElement( + 'div', + {key: '1', className: '_5ju2'}, + React.createElement(AdsErrorBoundary10, {x: 33}) + ) + ) + ) + ); + } + if (props.x === 232) { + return React.createElement( + 'div', + {direction: 'left', className: 'clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(AdsLabeledField104, {x: 231}) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement( + 'div', + {className: '_2oc7'}, + 'Clicks to Website' + ) + ) + ) + ); + } + if (props.x === 235) { + return React.createElement( + 'div', + {className: '_3-8x clearfix', direction: 'left'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(AdsLabeledField104, {x: 234}) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement('div', {className: '_2oc7'}, 'Auction') + ) + ) + ); + } + if (props.x === 245) { + return React.createElement( + 'div', + {className: '_3-8y clearfix', direction: 'left'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(AdsLabeledField104, {x: 240}) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement( + FluxContainer_AdsCampaignGroupSpendCapContainer_107, + {x: 244} + ) + ) + ) + ); + } + if (props.x === 277) { + return React.createElement( + 'div', + {className: '_5dw9 _5dwa clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement(XUICardHeaderTitle100, {x: 265, key: '.0'}) + ), + React.createElement( + 'div', + {key: 'right', className: '_ohf rfloat'}, + React.createElement( + FluxContainer_AdsPluginizedLinksMenuContainer_121, + {x: 276, key: '.1'} + ) + ) + ); + } + }; + + var AdsUnifiedNavigationLocalNav22 = function (props) { + if (props.x === 35) { + return React.createElement( + 'div', + {className: '_34_i'}, + React.createElement(LeftRight21, {x: 34}) + ); + } + }; + + var XUIDialog23 = function (props) { + if (props.x === 36) { + return null; + } + }; + + var AdsPEResetDialog24 = function (props) { + if (props.x === 37) { + return React.createElement( + 'span', + null, + React.createElement(XUIDialog23, {x: 36, key: 'dialog/.0'}) + ); + } + }; + + var AdsPETopNav25 = function (props) { + if (props.x === 40) { + return React.createElement( + 'div', + {style: {width: 1306}}, + React.createElement(AdsUnifiedNavigationLocalNav22, {x: 35}), + React.createElement(AdsErrorBoundary10, {x: 39}) + ); + } + }; + + var FluxContainer_AdsPETopNavContainer_26 = function (props) { + if (props.x === 41) { + return React.createElement(AdsPETopNav25, {x: 40}); + } + }; + + var XUIAbstractGlyphButton27 = function (props) { + if (props.x === 46) { + return React.createElement(AbstractButton3, {x: 45}); + } + if (props.x === 150) { + return React.createElement(AbstractButton3, {x: 149}); + } + }; + + var XUICloseButton28 = function (props) { + if (props.x === 47) { + return React.createElement(XUIAbstractGlyphButton27, {x: 46}); + } + if (props.x === 151) { + return React.createElement(XUIAbstractGlyphButton27, {x: 150}); + } + }; + + var XUIText29 = function (props) { + if (props.x === 48) { + return React.createElement( + 'span', + {display: 'inline', className: ' _50f7'}, + 'Ads Manager' + ); + } + if (props.x === 205) { + return React.createElement( + 'span', + {className: '_2x9f _50f5 _50f7', display: 'inline'}, + 'Editing Campaign' + ); + } + if (props.x === 206) { + return React.createElement( + 'span', + {display: 'inline', className: ' _50f5 _50f7'}, + 'Test Campaign' + ); + } + }; + + var XUINotice30 = function (props) { + if (props.x === 51) { + return React.createElement( + 'div', + {size: 'medium', className: '_585n _585o _2wdd'}, + React.createElement(ReactImage0, {x: 42}), + React.createElement(XUICloseButton28, {x: 47}), + React.createElement( + 'div', + {className: '_585r _2i-a _50f4'}, + 'Please go to ', + React.createElement(Link2, {x: 50}), + ' to set up a payment method for this ad account.' + ) + ); + } + }; + + var ReactCSSTransitionGroupChild31 = function (props) { + if (props.x === 52) { + return React.createElement(XUINotice30, {x: 51}); + } + }; + + var ReactTransitionGroup32 = function (props) { + if (props.x === 53) { + return React.createElement( + 'span', + null, + React.createElement(ReactCSSTransitionGroupChild31, {x: 52, key: '.0'}) + ); + } + }; + + var ReactCSSTransitionGroup33 = function (props) { + if (props.x === 54) { + return React.createElement(ReactTransitionGroup32, {x: 53}); + } + }; + + var AdsPETopError34 = function (props) { + if (props.x === 55) { + return React.createElement( + 'div', + {className: '_2wdc'}, + React.createElement(ReactCSSTransitionGroup33, {x: 54}) + ); + } + }; + + var FluxContainer_AdsPETopErrorContainer_35 = function (props) { + if (props.x === 56) { + return React.createElement(AdsPETopError34, {x: 55}); + } + }; + + var FluxContainer_AdsGuidanceChannel_36 = function (props) { + if (props.x === 59) { + return null; + } + }; + + var ResponsiveBlock37 = function (props) { + if (props.x === 62) { + return React.createElement( + 'div', + {className: '_4u-c'}, + [ + React.createElement(AdsErrorBoundary10, {x: 58, key: 1}), + React.createElement(AdsErrorBoundary10, {x: 61, key: 2}), + ], + React.createElement( + 'div', + {key: 'sensor', className: '_4u-f'}, + React.createElement('iframe', { + 'aria-hidden': 'true', + className: '_1_xb', + tabIndex: '-1', + }) + ) + ); + } + if (props.x === 469) { + return React.createElement( + 'div', + {className: '_4u-c'}, + React.createElement(AdsPEDataTableContainer158, {x: 468}), + React.createElement( + 'div', + {key: 'sensor', className: '_4u-f'}, + React.createElement('iframe', { + 'aria-hidden': 'true', + className: '_1_xb', + tabIndex: '-1', + }) + ) + ); + } + }; + + var FluxContainer_AdsBulkEditDialogContainer_38 = function (props) { + if (props.x === 63) { + return null; + } + }; + + var Column39 = function (props) { + if (props.x === 66) { + return React.createElement( + 'div', + {className: '_4bl8 _4bl7'}, + React.createElement( + 'div', + {className: '_3c5f'}, + null, + null, + React.createElement('div', {className: '_3c5i'}), + null + ) + ); + } + }; + + var XUIButtonGroup40 = function (props) { + if (props.x === 75) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(XUIButton4, {x: 69}), + React.createElement(ReactPopoverMenu20, {x: 74}) + ); + } + if (props.x === 84) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(XUIButton4, {x: 78, key: 'edit'}), + React.createElement(ReactPopoverMenu20, {x: 83, key: 'editMenu'}) + ); + } + if (props.x === 97) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(XUIButton4, {x: 90, key: 'revert'}), + React.createElement(XUIButton4, {x: 93, key: 'delete'}), + React.createElement(XUIButton4, {x: 96, key: 'duplicate'}) + ); + } + if (props.x === 117) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + React.createElement(AdsPEExportImportMenuContainer48, {x: 107}), + React.createElement(XUIButton4, {x: 110, key: 'createReport'}), + React.createElement(AdsPECampaignGroupTagContainer51, { + x: 116, + key: 'tags', + }) + ); + } + }; + + var AdsPEEditToolbarButton41 = function (props) { + if (props.x === 85) { + return React.createElement(XUIButtonGroup40, {x: 84}); + } + }; + + var FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42 = function ( + props + ) { + if (props.x === 86) { + return React.createElement(AdsPEEditToolbarButton41, {x: 85}); + } + }; + + var FluxContainer_AdsPEEditToolbarButtonContainer_43 = function (props) { + if (props.x === 87) { + return React.createElement( + FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42, + {x: 86} + ); + } + }; + + var AdsPEExportImportMenu44 = function (props) { + if (props.x === 103) { + return React.createElement(ReactPopoverMenu20, {x: 102, key: 'export'}); + } + }; + + var FluxContainer_AdsPECustomizeExportContainer_45 = function (props) { + if (props.x === 104) { + return null; + } + }; + + var AdsPEExportAsTextDialog46 = function (props) { + if (props.x === 105) { + return null; + } + }; + + var FluxContainer_AdsPEExportAsTextDialogContainer_47 = function (props) { + if (props.x === 106) { + return React.createElement(AdsPEExportAsTextDialog46, {x: 105}); + } + }; + + var AdsPEExportImportMenuContainer48 = function (props) { + if (props.x === 107) { + return React.createElement( + 'span', + null, + React.createElement(AdsPEExportImportMenu44, {x: 103}), + React.createElement(FluxContainer_AdsPECustomizeExportContainer_45, { + x: 104, + }), + React.createElement(FluxContainer_AdsPEExportAsTextDialogContainer_47, { + x: 106, + }), + null, + null + ); + } + }; + + var Constructor49 = function (props) { + if (props.x === 114) { + return null; + } + if (props.x === 142) { + return null; + } + if (props.x === 143) { + return null; + } + if (props.x === 183) { + return null; + } + }; + + var TagSelectorPopover50 = function (props) { + if (props.x === 115) { + return React.createElement( + 'span', + {className: ' _3d6e'}, + React.createElement(XUIButton4, {x: 113}), + React.createElement(Constructor49, {x: 114, key: 'layer'}) + ); + } + }; + + var AdsPECampaignGroupTagContainer51 = function (props) { + if (props.x === 116) { + return React.createElement(TagSelectorPopover50, { + x: 115, + key: '98010048849317', + }); + } + }; + + var AdsRuleToolbarMenu52 = function (props) { + if (props.x === 118) { + return null; + } + }; + + var FluxContainer_AdsPERuleToolbarMenuContainer_53 = function (props) { + if (props.x === 119) { + return React.createElement(AdsRuleToolbarMenu52, {x: 118}); + } + }; + + var FillColumn54 = function (props) { + if (props.x === 120) { + return React.createElement( + 'div', + {className: '_4bl9'}, + React.createElement( + 'span', + {className: '_3c5e'}, + React.createElement( + 'span', + null, + React.createElement(XUIButtonGroup40, {x: 75}), + React.createElement( + FluxContainer_AdsPEEditToolbarButtonContainer_43, + {x: 87} + ), + null, + React.createElement(XUIButtonGroup40, {x: 97}) + ), + React.createElement(XUIButtonGroup40, {x: 117}), + React.createElement(FluxContainer_AdsPERuleToolbarMenuContainer_53, { + x: 119, + }) + ) + ); + } + }; + + var Layout55 = function (props) { + if (props.x === 121) { + return React.createElement( + 'div', + {className: 'clearfix'}, + React.createElement(Column39, {x: 66, key: '1'}), + React.createElement(FillColumn54, {x: 120, key: '0'}) + ); + } + }; + + var AdsPEMainPaneToolbar56 = function (props) { + if (props.x === 122) { + return React.createElement( + 'div', + {className: '_3c5b clearfix'}, + React.createElement(Layout55, {x: 121}) + ); + } + }; + + var AdsPECampaignGroupToolbarContainer57 = function (props) { + if (props.x === 123) { + return React.createElement(AdsPEMainPaneToolbar56, {x: 122}); + } + }; + + var AdsPEFiltersPopover58 = function (props) { + if (props.x === 144) { + return React.createElement( + 'span', + {className: '_5b-l _5bbe'}, + React.createElement(ReactXUIPopoverButton6, {x: 133}), + React.createElement(ReactXUIPopoverButton6, {x: 141}), + [ + React.createElement(Constructor49, {x: 142, key: 'filterMenu/.0'}), + React.createElement(Constructor49, {x: 143, key: 'searchMenu/.0'}), + ] + ); + } + }; + + var AbstractCheckboxInput59 = function (props) { + if (props.x === 145) { + return React.createElement( + 'label', + {className: 'uiInputLabelInput _55sg _kv1'}, + React.createElement('input', { + checked: true, + disabled: true, + name: 'filterUnpublished', + value: 'on', + onClick: function () {}, + className: null, + id: 'js_input_label_21', + type: 'checkbox', + }), + React.createElement('span', { + 'data-hover': null, + 'data-tooltip-content': undefined, + }) + ); + } + if (props.x === 336) { + return React.createElement( + 'label', + {className: '_4h2r _55sg _kv1'}, + React.createElement('input', { + checked: undefined, + onChange: function () {}, + className: null, + type: 'checkbox', + }), + React.createElement('span', { + 'data-hover': null, + 'data-tooltip-content': undefined, + }) + ); + } + }; + + var XUICheckboxInput60 = function (props) { + if (props.x === 146) { + return React.createElement(AbstractCheckboxInput59, {x: 145}); + } + if (props.x === 337) { + return React.createElement(AbstractCheckboxInput59, {x: 336}); + } + }; + + var InputLabel61 = function (props) { + if (props.x === 147) { + return React.createElement( + 'div', + {display: 'block', className: 'uiInputLabel clearfix'}, + React.createElement(XUICheckboxInput60, {x: 146}), + React.createElement( + 'label', + {className: 'uiInputLabelLabel', htmlFor: 'js_input_label_21'}, + 'Always show new items' + ) + ); + } + }; + + var AdsPopoverLink62 = function (props) { + if (props.x === 154) { + return React.createElement( + 'span', + null, + React.createElement( + 'span', + { + onMouseEnter: function () {}, + onMouseLeave: function () {}, + onMouseUp: undefined, + }, + React.createElement('span', {className: '_3o_j'}), + React.createElement(ReactImage0, {x: 153}) + ), + null + ); + } + if (props.x === 238) { + return React.createElement( + 'span', + null, + React.createElement( + 'span', + { + onMouseEnter: function () {}, + onMouseLeave: function () {}, + onMouseUp: undefined, + }, + React.createElement('span', {className: '_3o_j'}), + React.createElement(ReactImage0, {x: 237}) + ), + null + ); + } + }; + + var AdsHelpLink63 = function (props) { + if (props.x === 155) { + return React.createElement(AdsPopoverLink62, {x: 154}); + } + if (props.x === 239) { + return React.createElement(AdsPopoverLink62, {x: 238}); + } + }; + + var BUIFilterTokenInput64 = function (props) { + if (props.x === 158) { + return React.createElement( + 'div', + {className: '_5b5o _3yz3 _4cld'}, + React.createElement( + 'div', + {className: '_5b5t _2d2k'}, + React.createElement(ReactImage0, {x: 152}), + React.createElement( + 'div', + {className: '_5b5r'}, + 'Campaigns: (1)', + React.createElement(AdsHelpLink63, {x: 155}) + ) + ), + React.createElement(XUIButton4, {x: 157}) + ); + } + }; + + var BUIFilterToken65 = function (props) { + if (props.x === 159) { + return React.createElement( + 'div', + {className: '_3yz1 _3yz2 _3dad'}, + React.createElement( + 'div', + {className: '_3yz4', 'aria-hidden': false}, + React.createElement( + 'div', + {onClick: function () {}, className: '_3yz5'}, + React.createElement(ReactImage0, {x: 148}), + React.createElement('div', {className: '_3yz7'}, 'Campaigns:'), + React.createElement( + 'div', + { + className: 'ellipsis _3yz8', + 'data-hover': 'tooltip', + 'data-tooltip-display': 'overflow', + }, + '(1)' + ) + ), + null, + React.createElement(XUICloseButton28, {x: 151}) + ), + React.createElement(BUIFilterTokenInput64, {x: 158}) + ); + } + }; + + var BUIFilterTokenCreateButton66 = function (props) { + if (props.x === 163) { + return React.createElement( + 'div', + {className: '_1tc'}, + React.createElement(XUIButton4, {x: 162}) + ); + } + }; + + var BUIFilterTokenizer67 = function (props) { + if (props.x === 164) { + return React.createElement( + 'div', + {className: '_5b-m clearfix'}, + undefined, + [], + React.createElement(BUIFilterToken65, {x: 159, key: 'token0'}), + React.createElement(BUIFilterTokenCreateButton66, {x: 163}), + null, + React.createElement('div', {className: '_49u3'}) + ); + } + }; + + var XUIAmbientNUX68 = function (props) { + if (props.x === 165) { + return null; + } + if (props.x === 189) { + return null; + } + if (props.x === 200) { + return null; + } + }; + + var XUIAmbientNUX69 = function (props) { + if (props.x === 166) { + return React.createElement(XUIAmbientNUX68, {x: 165}); + } + if (props.x === 190) { + return React.createElement(XUIAmbientNUX68, {x: 189}); + } + if (props.x === 201) { + return React.createElement(XUIAmbientNUX68, {x: 200}); + } + }; + + var AdsPEAmbientNUXMegaphone70 = function (props) { + if (props.x === 167) { + return React.createElement( + 'span', + null, + React.createElement('span', {}), + React.createElement(XUIAmbientNUX69, {x: 166, key: 'nux'}) + ); + } + }; + + var AdsPEFilters71 = function (props) { + if (props.x === 168) { + return React.createElement( + 'div', + {className: '_4rw_'}, + React.createElement(AdsPEFiltersPopover58, {x: 144}), + React.createElement( + 'div', + {className: '_1eo'}, + React.createElement(InputLabel61, {x: 147}) + ), + React.createElement(BUIFilterTokenizer67, {x: 164}), + '', + React.createElement(AdsPEAmbientNUXMegaphone70, {x: 167}) + ); + } + }; + + var AdsPEFilterContainer72 = function (props) { + if (props.x === 169) { + return React.createElement(AdsPEFilters71, {x: 168}); + } + }; + + var AdsPETablePager73 = function (props) { + if (props.x === 172) { + return null; + } + }; + + var AdsPECampaignGroupTablePagerContainer74 = function (props) { + if (props.x === 173) { + return React.createElement(AdsPETablePager73, {x: 172}); + } + }; + + var AdsPETablePagerContainer75 = function (props) { + if (props.x === 174) { + return React.createElement(AdsPECampaignGroupTablePagerContainer74, { + x: 173, + }); + } + }; + + var ReactXUIError76 = function (props) { + if (props.x === 181) { + return React.createElement(AbstractButton3, {x: 180}); + } + if (props.x === 216) { + return React.createElement( + 'div', + {className: '_40bf _2vl4 _1h18'}, + null, + null, + React.createElement( + 'div', + {className: '_2vl9 _1h1f', style: {backgroundColor: '#fff'}}, + React.createElement( + 'div', + {className: '_2vla _1h1g'}, + React.createElement( + 'div', + null, + null, + React.createElement('textarea', { + className: '_2vli _2vlj _1h26 _1h27', + dir: 'auto', + disabled: undefined, + id: undefined, + maxLength: null, + value: 'Test Campaign', + onBlur: function () {}, + onChange: function () {}, + onFocus: function () {}, + onKeyDown: function () {}, + }), + null + ), + React.createElement('div', { + 'aria-hidden': 'true', + className: '_2vlk', + }) + ) + ), + null + ); + } + if (props.x === 221) { + return React.createElement(XUICard94, {x: 220}); + } + if (props.x === 250) { + return React.createElement(XUICard94, {x: 249}); + } + if (props.x === 280) { + return React.createElement(XUICard94, {x: 279}); + } + }; + + var BUIPopoverButton77 = function (props) { + if (props.x === 182) { + return React.createElement(ReactXUIError76, {x: 181}); + } + }; + + var BUIDateRangePicker78 = function (props) { + if (props.x === 184) { + return React.createElement( + 'span', + null, + React.createElement(BUIPopoverButton77, {x: 182}), + [React.createElement(Constructor49, {x: 183, key: 'layer/.0'})] + ); + } + }; + + var AdsPEStatsRangePicker79 = function (props) { + if (props.x === 185) { + return React.createElement(BUIDateRangePicker78, {x: 184}); + } + }; + + var AdsPEStatRange80 = function (props) { + if (props.x === 191) { + return React.createElement( + 'div', + {className: '_3c5k'}, + React.createElement('span', {className: '_3c5j'}, 'Stats:'), + React.createElement( + 'span', + {className: '_3c5l'}, + React.createElement(AdsPEStatsRangePicker79, {x: 185}), + React.createElement(XUIButton4, {x: 188, key: 'settings'}) + ), + [React.createElement(XUIAmbientNUX69, {x: 190, key: 'roasNUX/.0'})] + ); + } + }; + + var AdsPEStatRangeContainer81 = function (props) { + if (props.x === 192) { + return React.createElement(AdsPEStatRange80, {x: 191}); + } + }; + + var AdsPESideTrayTabButton82 = function (props) { + if (props.x === 196) { + return React.createElement( + 'div', + {className: '_1-ly _59j9 _d9a', onClick: function () {}}, + React.createElement(ReactImage0, {x: 195}), + React.createElement('div', {className: '_vf7'}), + React.createElement('div', {className: '_vf8'}) + ); + } + if (props.x === 199) { + return React.createElement( + 'div', + {className: ' _1-lz _d9a', onClick: function () {}}, + React.createElement(ReactImage0, {x: 198}), + React.createElement('div', {className: '_vf7'}), + React.createElement('div', {className: '_vf8'}) + ); + } + if (props.x === 203) { + return null; + } + }; + + var AdsPEEditorTrayTabButton83 = function (props) { + if (props.x === 197) { + return React.createElement(AdsPESideTrayTabButton82, {x: 196}); + } + }; + + var AdsPEInsightsTrayTabButton84 = function (props) { + if (props.x === 202) { + return React.createElement( + 'span', + null, + React.createElement(AdsPESideTrayTabButton82, {x: 199}), + React.createElement(XUIAmbientNUX69, {x: 201, key: 'roasNUX'}) + ); + } + }; + + var AdsPENekoDebuggerTrayTabButton85 = function (props) { + if (props.x === 204) { + return React.createElement(AdsPESideTrayTabButton82, {x: 203}); + } + }; + + var AdsPEEditorChildLink86 = function (props) { + if (props.x === 211) { + return React.createElement( + 'div', + {className: '_3ywr'}, + React.createElement(Link2, {x: 208}), + React.createElement('span', {className: '_3ywq'}, '|'), + React.createElement(Link2, {x: 210}) + ); + } + }; + + var AdsPEEditorChildLinkContainer87 = function (props) { + if (props.x === 212) { + return React.createElement(AdsPEEditorChildLink86, {x: 211}); + } + }; + + var AdsPEHeaderSection88 = function (props) { + if (props.x === 213) { + return React.createElement( + 'div', + {className: '_yke'}, + React.createElement('div', {className: '_2x9d _pr-'}), + React.createElement(XUIText29, {x: 205}), + React.createElement( + 'div', + {className: '_3a-a'}, + React.createElement( + 'div', + {className: '_3a-b'}, + React.createElement(XUIText29, {x: 206}) + ) + ), + React.createElement(AdsPEEditorChildLinkContainer87, {x: 212}) + ); + } + }; + + var AdsPECampaignGroupHeaderSectionContainer89 = function (props) { + if (props.x === 214) { + return React.createElement(AdsPEHeaderSection88, {x: 213}); + } + }; + + var AdsEditorLoadingErrors90 = function (props) { + if (props.x === 215) { + return null; + } + }; + + var AdsTextInput91 = function (props) { + if (props.x === 217) { + return React.createElement(ReactXUIError76, {x: 216}); + } + }; + + var BUIFormElement92 = function (props) { + if (props.x === 218) { + return React.createElement( + 'div', + {className: '_5521 clearfix'}, + React.createElement( + 'div', + {className: '_5522 _3w5q'}, + React.createElement( + 'label', + { + onClick: undefined, + htmlFor: '1467872040612:1961945894', + className: '_5523 _3w5r', + }, + 'Campaign Name', + null + ) + ), + React.createElement( + 'div', + {className: '_5527'}, + React.createElement( + 'div', + {className: '_5528'}, + React.createElement( + 'span', + {key: '.0', className: '_40bg', id: '1467872040612:1961945894'}, + React.createElement(AdsTextInput91, { + x: 217, + key: 'nameEditor98010048849317', + }), + null + ) + ), + null + ) + ); + } + }; + + var BUIForm93 = function (props) { + if (props.x === 219) { + return React.createElement( + 'div', + {className: '_5ks1 _550r _550t _550y _3w5n'}, + React.createElement(BUIFormElement92, {x: 218, key: '.0'}) + ); + } + }; + + var XUICard94 = function (props) { + if (props.x === 220) { + return React.createElement( + 'div', + {className: '_40bc _12k2 _4-u2 _4-u8'}, + React.createElement(BUIForm93, {x: 219}) + ); + } + if (props.x === 249) { + return React.createElement( + 'div', + {className: '_12k2 _4-u2 _4-u8'}, + React.createElement(AdsCardHeader103, {x: 230}), + React.createElement(AdsCardSection108, {x: 248}) + ); + } + if (props.x === 279) { + return React.createElement( + 'div', + {className: '_12k2 _4-u2 _4-u8'}, + React.createElement(AdsCardLeftRightHeader122, {x: 278}) + ); + } + }; + + var AdsCard95 = function (props) { + if (props.x === 222) { + return React.createElement(ReactXUIError76, {x: 221}); + } + if (props.x === 251) { + return React.createElement(ReactXUIError76, {x: 250}); + } + if (props.x === 281) { + return React.createElement(ReactXUIError76, {x: 280}); + } + }; + + var AdsEditorNameSection96 = function (props) { + if (props.x === 223) { + return React.createElement(AdsCard95, {x: 222}); + } + }; + + var AdsCampaignGroupNameSectionContainer97 = function (props) { + if (props.x === 224) { + return React.createElement(AdsEditorNameSection96, { + x: 223, + key: 'nameSection98010048849317', + }); + } + }; + + var _render98 = function (props) { + if (props.x === 225) { + return React.createElement(AdsCampaignGroupNameSectionContainer97, { + x: 224, + }); + } + }; + + var AdsPluginWrapper99 = function (props) { + if (props.x === 226) { + return React.createElement(_render98, {x: 225}); + } + if (props.x === 255) { + return React.createElement(_render111, {x: 254}); + } + if (props.x === 258) { + return React.createElement(_render113, {x: 257}); + } + if (props.x === 287) { + return React.createElement(_render127, {x: 286}); + } + if (props.x === 291) { + return React.createElement(_render130, {x: 290}); + } + }; + + var XUICardHeaderTitle100 = function (props) { + if (props.x === 227) { + return React.createElement( + 'span', + {className: '_38my'}, + 'Campaign Details', + null, + React.createElement('span', {className: '_c1c'}) + ); + } + if (props.x === 265) { + return React.createElement( + 'span', + {className: '_38my'}, + [ + React.createElement( + 'span', + {key: 1}, + 'Campaign ID', + ': ', + '98010048849317' + ), + React.createElement( + 'div', + {className: '_5lh9', key: 2}, + React.createElement( + FluxContainer_AdsCampaignGroupStatusSwitchContainer_119, + {x: 264} + ) + ), + ], + null, + React.createElement('span', {className: '_c1c'}) + ); + } + }; + + var XUICardSection101 = function (props) { + if (props.x === 228) { + return React.createElement( + 'div', + {className: '_5dw9 _5dwa _4-u3'}, + [React.createElement(XUICardHeaderTitle100, {x: 227, key: '.0'})], + undefined, + undefined, + React.createElement('div', {className: '_3s3-'}) + ); + } + if (props.x === 247) { + return React.createElement( + 'div', + {className: '_12jy _4-u3'}, + React.createElement( + 'div', + {className: '_3-8j'}, + React.createElement(FlexibleBlock105, {x: 233}), + React.createElement(FlexibleBlock105, {x: 236}), + React.createElement(FlexibleBlock105, {x: 246}), + null, + null + ) + ); + } + }; + + var XUICardHeader102 = function (props) { + if (props.x === 229) { + return React.createElement(XUICardSection101, {x: 228}); + } + }; + + var AdsCardHeader103 = function (props) { + if (props.x === 230) { + return React.createElement(XUICardHeader102, {x: 229}); + } + }; + + var AdsLabeledField104 = function (props) { + if (props.x === 231) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz', label: 'Objective'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Objective ' + ), + null, + React.createElement('div', {className: '_3bv-'}) + ); + } + if (props.x === 234) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz', label: 'Buying Type'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Buying Type ' + ), + null, + React.createElement('div', {className: '_3bv-'}) + ); + } + if (props.x === 240) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Campaign Spending Limit ' + ), + React.createElement(AdsHelpLink63, {x: 239}), + React.createElement('div', {className: '_3bv-'}) + ); + } + }; + + var FlexibleBlock105 = function (props) { + if (props.x === 233) { + return React.createElement(LeftRight21, {x: 232}); + } + if (props.x === 236) { + return React.createElement(LeftRight21, {x: 235}); + } + if (props.x === 246) { + return React.createElement(LeftRight21, {x: 245}); + } + }; + + var AdsBulkCampaignSpendCapField106 = function (props) { + if (props.x === 243) { + return React.createElement( + 'div', + {className: '_33dv'}, + '', + React.createElement(Link2, {x: 242}), + ' (optional)' + ); + } + }; + + var FluxContainer_AdsCampaignGroupSpendCapContainer_107 = function (props) { + if (props.x === 244) { + return React.createElement(AdsBulkCampaignSpendCapField106, {x: 243}); + } + }; + + var AdsCardSection108 = function (props) { + if (props.x === 248) { + return React.createElement(XUICardSection101, {x: 247}); + } + }; + + var AdsEditorCampaignGroupDetailsSection109 = function (props) { + if (props.x === 252) { + return React.createElement(AdsCard95, {x: 251}); + } + }; + + var AdsEditorCampaignGroupDetailsSectionContainer110 = function (props) { + if (props.x === 253) { + return React.createElement(AdsEditorCampaignGroupDetailsSection109, { + x: 252, + key: 'campaignGroupDetailsSection98010048849317', + }); + } + }; + + var _render111 = function (props) { + if (props.x === 254) { + return React.createElement( + AdsEditorCampaignGroupDetailsSectionContainer110, + {x: 253} + ); + } + }; + + var FluxContainer_AdsEditorToplineDetailsSectionContainer_112 = function ( + props + ) { + if (props.x === 256) { + return null; + } + }; + + var _render113 = function (props) { + if (props.x === 257) { + return React.createElement( + FluxContainer_AdsEditorToplineDetailsSectionContainer_112, + {x: 256} + ); + } + }; + + var AdsStickyArea114 = function (props) { + if (props.x === 259) { + return React.createElement( + 'div', + {}, + React.createElement('div', {onWheel: function () {}}) + ); + } + if (props.x === 292) { + return React.createElement( + 'div', + {}, + React.createElement('div', {onWheel: function () {}}, [ + React.createElement( + 'div', + {key: 'campaign_group_errors_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 291}) + ), + ]) + ); + } + }; + + var FluxContainer_AdsEditorColumnContainer_115 = function (props) { + if (props.x === 260) { + return React.createElement( + 'div', + null, + [ + React.createElement( + 'div', + {key: 'campaign_group_name_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 226}) + ), + React.createElement( + 'div', + {key: 'campaign_group_basic_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 255}) + ), + React.createElement( + 'div', + {key: 'campaign_group_topline_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 258}) + ), + ], + React.createElement(AdsStickyArea114, {x: 259}) + ); + } + if (props.x === 293) { + return React.createElement( + 'div', + null, + [ + React.createElement( + 'div', + {key: 'campaign_group_navigation_section98010048849317'}, + React.createElement(AdsPluginWrapper99, {x: 287}) + ), + ], + React.createElement(AdsStickyArea114, {x: 292}) + ); + } + }; + + var BUISwitch116 = function (props) { + if (props.x === 261) { + return React.createElement( + 'div', + { + 'data-hover': 'tooltip', + 'data-tooltip-content': + 'Currently active. Click this switch to deactivate it.', + 'data-tooltip-position': 'below', + disabled: false, + value: true, + onToggle: function () {}, + className: '_128j _128k _128n', + role: 'checkbox', + 'aria-checked': 'true', + }, + React.createElement( + 'div', + { + className: '_128o', + onClick: function () {}, + onKeyDown: function () {}, + onMouseDown: function () {}, + tabIndex: '0', + }, + React.createElement('div', {className: '_128p'}) + ), + null + ); + } + }; + + var AdsStatusSwitchInternal117 = function (props) { + if (props.x === 262) { + return React.createElement(BUISwitch116, {x: 261}); + } + }; + + var AdsStatusSwitch118 = function (props) { + if (props.x === 263) { + return React.createElement(AdsStatusSwitchInternal117, {x: 262}); + } + }; + + var FluxContainer_AdsCampaignGroupStatusSwitchContainer_119 = function ( + props + ) { + if (props.x === 264) { + return React.createElement(AdsStatusSwitch118, { + x: 263, + key: 'status98010048849317', + }); + } + }; + + var AdsLinksMenu120 = function (props) { + if (props.x === 275) { + return React.createElement(ReactPopoverMenu20, {x: 274}); + } + }; + + var FluxContainer_AdsPluginizedLinksMenuContainer_121 = function (props) { + if (props.x === 276) { + return React.createElement( + 'div', + null, + null, + React.createElement(AdsLinksMenu120, {x: 275}) + ); + } + }; + + var AdsCardLeftRightHeader122 = function (props) { + if (props.x === 278) { + return React.createElement(LeftRight21, {x: 277}); + } + }; + + var AdsPEIDSection123 = function (props) { + if (props.x === 282) { + return React.createElement(AdsCard95, {x: 281}); + } + }; + + var FluxContainer_AdsPECampaignGroupIDSectionContainer_124 = function ( + props + ) { + if (props.x === 283) { + return React.createElement(AdsPEIDSection123, {x: 282}); + } + }; + + var DeferredComponent125 = function (props) { + if (props.x === 284) { + return React.createElement( + FluxContainer_AdsPECampaignGroupIDSectionContainer_124, + {x: 283} + ); + } + }; + + var BootloadedComponent126 = function (props) { + if (props.x === 285) { + return React.createElement(DeferredComponent125, {x: 284}); + } + }; + + var _render127 = function (props) { + if (props.x === 286) { + return React.createElement(BootloadedComponent126, {x: 285}); + } + }; + + var AdsEditorErrorsCard128 = function (props) { + if (props.x === 288) { + return null; + } + }; + + var FluxContainer_FunctionalContainer_129 = function (props) { + if (props.x === 289) { + return React.createElement(AdsEditorErrorsCard128, {x: 288}); + } + }; + + var _render130 = function (props) { + if (props.x === 290) { + return React.createElement(FluxContainer_FunctionalContainer_129, { + x: 289, + }); + } + }; + + var AdsEditorMultiColumnLayout131 = function (props) { + if (props.x === 294) { + return React.createElement( + 'div', + {className: '_psh'}, + React.createElement( + 'div', + {className: '_3cc0'}, + React.createElement( + 'div', + null, + React.createElement(AdsEditorLoadingErrors90, {x: 215, key: '.0'}), + React.createElement( + 'div', + {className: '_3ms3'}, + React.createElement( + 'div', + {className: '_3ms4'}, + React.createElement( + FluxContainer_AdsEditorColumnContainer_115, + {x: 260, key: '.1'} + ) + ), + React.createElement( + 'div', + {className: '_3pvg'}, + React.createElement( + FluxContainer_AdsEditorColumnContainer_115, + {x: 293, key: '.2'} + ) + ) + ) + ) + ) + ); + } + }; + + var AdsPECampaignGroupEditor132 = function (props) { + if (props.x === 295) { + return React.createElement( + 'div', + null, + React.createElement(AdsPECampaignGroupHeaderSectionContainer89, { + x: 214, + }), + React.createElement(AdsEditorMultiColumnLayout131, {x: 294}) + ); + } + }; + + var AdsPECampaignGroupEditorContainer133 = function (props) { + if (props.x === 296) { + return React.createElement(AdsPECampaignGroupEditor132, {x: 295}); + } + }; + + var AdsPESideTrayTabContent134 = function (props) { + if (props.x === 297) { + return React.createElement( + 'div', + {className: '_1o_8 _44ra _5cyn'}, + React.createElement(AdsPECampaignGroupEditorContainer133, {x: 296}) + ); + } + }; + + var AdsPEEditorTrayTabContentContainer135 = function (props) { + if (props.x === 298) { + return React.createElement(AdsPESideTrayTabContent134, {x: 297}); + } + }; + + var AdsPEMultiTabDrawer136 = function (props) { + if (props.x === 299) { + return React.createElement( + 'div', + {className: '_2kev _2kex'}, + React.createElement( + 'div', + {className: '_5yno'}, + React.createElement(AdsPEEditorTrayTabButton83, { + x: 197, + key: 'editor_tray_button', + }), + React.createElement(AdsPEInsightsTrayTabButton84, { + x: 202, + key: 'insights_tray_button', + }), + React.createElement(AdsPENekoDebuggerTrayTabButton85, { + x: 204, + key: 'neko_debugger_tray_button', + }) + ), + React.createElement( + 'div', + {className: '_5ynn'}, + React.createElement(AdsPEEditorTrayTabContentContainer135, { + x: 298, + key: 'EDITOR_DRAWER', + }), + null + ) + ); + } + }; + + var FluxContainer_AdsPEMultiTabDrawerContainer_137 = function (props) { + if (props.x === 300) { + return React.createElement(AdsPEMultiTabDrawer136, {x: 299}); + } + }; + + var AdsPESimpleOrganizer138 = function (props) { + if (props.x === 309) { + return React.createElement( + 'div', + {className: '_tm2'}, + React.createElement(XUIButton4, {x: 304}), + React.createElement(XUIButton4, {x: 306}), + React.createElement(XUIButton4, {x: 308}) + ); + } + }; + + var AdsPEOrganizerContainer139 = function (props) { + if (props.x === 310) { + return React.createElement( + 'div', + null, + React.createElement(AdsPESimpleOrganizer138, {x: 309}) + ); + } + }; + + var FixedDataTableColumnResizeHandle140 = function (props) { + if (props.x === 313) { + return React.createElement( + 'div', + { + className: '_3487 _3488 _3489', + style: {width: 0, height: 25, left: 0}, + }, + React.createElement('div', {className: '_348a', style: {height: 25}}) + ); + } + }; + + var AdsPETableHeader141 = function (props) { + if (props.x === 315) { + return React.createElement( + 'div', + {className: '_1cig _1ksv _1vd7 _4h2r', id: undefined}, + React.createElement(ReactImage0, {x: 314}), + React.createElement('span', {className: '_1cid'}, 'Campaigns') + ); + } + if (props.x === 320) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Performance') + ); + } + if (props.x === 323) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Overview') + ); + } + if (props.x === 326) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Toplines') + ); + } + if (props.x === 329) { + return React.createElement('div', { + className: '_1cig _1vd7 _4h2r', + id: undefined, + }); + } + if (props.x === 340) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Campaign Name') + ); + } + if (props.x === 346) { + return React.createElement( + 'div', + { + className: '_1cig _25fg', + id: undefined, + 'data-tooltip-content': 'Changed', + 'data-hover': 'tooltip', + }, + React.createElement(ReactImage0, {x: 345}), + null + ); + } + if (props.x === 352) { + return React.createElement( + 'div', + { + className: '_1cig _25fg', + id: 'ads_pe_table_error_header', + 'data-tooltip-content': 'Errors', + 'data-hover': 'tooltip', + }, + React.createElement(ReactImage0, {x: 351}), + null + ); + } + if (props.x === 357) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Status') + ); + } + if (props.x === 362) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Delivery') + ); + } + if (props.x === 369) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Results') + ); + } + if (props.x === 374) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Cost') + ); + } + if (props.x === 379) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Reach') + ); + } + if (props.x === 384) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Impressions') + ); + } + if (props.x === 389) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Clicks') + ); + } + if (props.x === 394) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Avg. CPM') + ); + } + if (props.x === 399) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Avg. CPC') + ); + } + if (props.x === 404) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'CTR %') + ); + } + if (props.x === 409) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Spent') + ); + } + if (props.x === 414) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Objective') + ); + } + if (props.x === 419) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Buying Type') + ); + } + if (props.x === 424) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Campaign ID') + ); + } + if (props.x === 429) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Start') + ); + } + if (props.x === 434) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'End') + ); + } + if (props.x === 439) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Date created') + ); + } + if (props.x === 444) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Date last edited') + ); + } + if (props.x === 449) { + return React.createElement( + 'div', + {className: '_1cig _25fg _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Tags') + ); + } + if (props.x === 452) { + return React.createElement('div', { + className: '_1cig _25fg _4h2r', + id: undefined, + }); + } + }; + + var TransitionCell142 = function (props) { + if (props.x === 316) { + return React.createElement( + 'div', + { + label: 'Campaigns', + height: 40, + width: 721, + className: '_4lgc _4h2u', + style: {height: 40, width: 721}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 315}) + ) + ) + ); + } + if (props.x === 321) { + return React.createElement( + 'div', + { + label: 'Performance', + height: 40, + width: 798, + className: '_4lgc _4h2u', + style: {height: 40, width: 798}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 320}) + ) + ) + ); + } + if (props.x === 324) { + return React.createElement( + 'div', + { + label: 'Overview', + height: 40, + width: 1022, + className: '_4lgc _4h2u', + style: {height: 40, width: 1022}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 323}) + ) + ) + ); + } + if (props.x === 327) { + return React.createElement( + 'div', + { + label: 'Toplines', + height: 40, + width: 0, + className: '_4lgc _4h2u', + style: {height: 40, width: 0}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 326}) + ) + ) + ); + } + if (props.x === 330) { + return React.createElement( + 'div', + { + label: '', + height: 40, + width: 25, + className: '_4lgc _4h2u', + style: {height: 40, width: 25}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 329}) + ) + ) + ); + } + if (props.x === 338) { + return React.createElement( + 'div', + { + label: undefined, + width: 42, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 42}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(XUICheckboxInput60, {x: 337}) + ) + ) + ); + } + if (props.x === 343) { + return React.createElement( + 'div', + { + label: 'Campaign Name', + width: 400, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 400}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 342}) + ) + ) + ); + } + if (props.x === 349) { + return React.createElement( + 'div', + { + label: undefined, + width: 33, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 33}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 348}) + ) + ) + ); + } + if (props.x === 355) { + return React.createElement( + 'div', + { + label: undefined, + width: 36, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 36}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 354}) + ) + ) + ); + } + if (props.x === 360) { + return React.createElement( + 'div', + { + label: 'Status', + width: 60, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 60}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 359}) + ) + ) + ); + } + if (props.x === 365) { + return React.createElement( + 'div', + { + label: 'Delivery', + width: 150, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 150}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 364}) + ) + ) + ); + } + if (props.x === 372) { + return React.createElement( + 'div', + { + label: 'Results', + width: 140, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 140}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 371}) + ) + ) + ); + } + if (props.x === 377) { + return React.createElement( + 'div', + { + label: 'Cost', + width: 140, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 140}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 376}) + ) + ) + ); + } + if (props.x === 382) { + return React.createElement( + 'div', + { + label: 'Reach', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 381}) + ) + ) + ); + } + if (props.x === 387) { + return React.createElement( + 'div', + { + label: 'Impressions', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 386}) + ) + ) + ); + } + if (props.x === 392) { + return React.createElement( + 'div', + { + label: 'Clicks', + width: 60, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 60}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 391}) + ) + ) + ); + } + if (props.x === 397) { + return React.createElement( + 'div', + { + label: 'Avg. CPM', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 396}) + ) + ) + ); + } + if (props.x === 402) { + return React.createElement( + 'div', + { + label: 'Avg. CPC', + width: 78, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 78}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 401}) + ) + ) + ); + } + if (props.x === 407) { + return React.createElement( + 'div', + { + label: 'CTR %', + width: 70, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 70}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 406}) + ) + ) + ); + } + if (props.x === 412) { + return React.createElement( + 'div', + { + label: 'Spent', + width: 70, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 70}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 411}) + ) + ) + ); + } + if (props.x === 417) { + return React.createElement( + 'div', + { + label: 'Objective', + width: 200, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 200}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 416}) + ) + ) + ); + } + if (props.x === 422) { + return React.createElement( + 'div', + { + label: 'Buying Type', + width: 100, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 100}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 421}) + ) + ) + ); + } + if (props.x === 427) { + return React.createElement( + 'div', + { + label: 'Campaign ID', + width: 120, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 120}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 426}) + ) + ) + ); + } + if (props.x === 432) { + return React.createElement( + 'div', + { + label: 'Start', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 431}) + ) + ) + ); + } + if (props.x === 437) { + return React.createElement( + 'div', + { + label: 'End', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 436}) + ) + ) + ); + } + if (props.x === 442) { + return React.createElement( + 'div', + { + label: 'Date created', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 441}) + ) + ) + ); + } + if (props.x === 447) { + return React.createElement( + 'div', + { + label: 'Date last edited', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(FixedDataTableSortableHeader149, {x: 446}) + ) + ) + ); + } + if (props.x === 450) { + return React.createElement( + 'div', + { + label: 'Tags', + width: 150, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 150}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 449}) + ) + ) + ); + } + if (props.x === 453) { + return React.createElement( + 'div', + { + label: '', + width: 25, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 25}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + React.createElement(AdsPETableHeader141, {x: 452}) + ) + ) + ); + } + }; + + var FixedDataTableCell143 = function (props) { + if (props.x === 317) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 721, left: 0}}, + undefined, + React.createElement(TransitionCell142, {x: 316}) + ); + } + if (props.x === 322) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 798, left: 0}}, + undefined, + React.createElement(TransitionCell142, {x: 321}) + ); + } + if (props.x === 325) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 1022, left: 798}}, + undefined, + React.createElement(TransitionCell142, {x: 324}) + ); + } + if (props.x === 328) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 0, left: 1820}}, + undefined, + React.createElement(TransitionCell142, {x: 327}) + ); + } + if (props.x === 331) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 25, left: 1820}}, + undefined, + React.createElement(TransitionCell142, {x: 330}) + ); + } + if (props.x === 339) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg6 _4h2m', + style: {height: 25, width: 42, left: 0}, + }, + undefined, + React.createElement(TransitionCell142, {x: 338}) + ); + } + if (props.x === 344) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 400, left: 42}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 343}) + ); + } + if (props.x === 350) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 33, left: 442}}, + undefined, + React.createElement(TransitionCell142, {x: 349}) + ); + } + if (props.x === 356) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 36, left: 475}}, + undefined, + React.createElement(TransitionCell142, {x: 355}) + ); + } + if (props.x === 361) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 60, left: 511}}, + undefined, + React.createElement(TransitionCell142, {x: 360}) + ); + } + if (props.x === 366) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 150, left: 571}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 365}) + ); + } + if (props.x === 373) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 140, left: 0}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 372}) + ); + } + if (props.x === 378) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 140, left: 140}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 377}) + ); + } + if (props.x === 383) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 280}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 382}) + ); + } + if (props.x === 388) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 360}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 387}) + ); + } + if (props.x === 393) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 60, left: 440}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 392}) + ); + } + if (props.x === 398) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 500}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 397}) + ); + } + if (props.x === 403) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 78, left: 580}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 402}) + ); + } + if (props.x === 408) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 70, left: 658}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 407}) + ); + } + if (props.x === 413) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 70, left: 728}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 412}) + ); + } + if (props.x === 418) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 200, left: 798}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 417}) + ); + } + if (props.x === 423) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 100, left: 998}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 422}) + ); + } + if (props.x === 428) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 120, left: 1098}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 427}) + ); + } + if (props.x === 433) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1218}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 432}) + ); + } + if (props.x === 438) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1331}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 437}) + ); + } + if (props.x === 443) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1444}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 442}) + ); + } + if (props.x === 448) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1557}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 447}) + ); + } + if (props.x === 451) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 150, left: 1670}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + React.createElement(TransitionCell142, {x: 450}) + ); + } + if (props.x === 454) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 25, left: 1820}}, + undefined, + React.createElement(TransitionCell142, {x: 453}) + ); + } + }; + + var FixedDataTableCellGroupImpl144 = function (props) { + if (props.x === 318) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 40, + position: 'absolute', + width: 721, + zIndex: 2, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 317, key: 'cell_0'}) + ); + } + if (props.x === 332) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 40, + position: 'absolute', + width: 1845, + zIndex: 0, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 322, key: 'cell_0'}), + React.createElement(FixedDataTableCell143, {x: 325, key: 'cell_1'}), + React.createElement(FixedDataTableCell143, {x: 328, key: 'cell_2'}), + React.createElement(FixedDataTableCell143, {x: 331, key: 'cell_3'}) + ); + } + if (props.x === 367) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 25, + position: 'absolute', + width: 721, + zIndex: 2, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 339, key: 'cell_0'}), + React.createElement(FixedDataTableCell143, {x: 344, key: 'cell_1'}), + React.createElement(FixedDataTableCell143, {x: 350, key: 'cell_2'}), + React.createElement(FixedDataTableCell143, {x: 356, key: 'cell_3'}), + React.createElement(FixedDataTableCell143, {x: 361, key: 'cell_4'}), + React.createElement(FixedDataTableCell143, {x: 366, key: 'cell_5'}) + ); + } + if (props.x === 455) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 25, + position: 'absolute', + width: 1845, + zIndex: 0, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(FixedDataTableCell143, {x: 373, key: 'cell_0'}), + React.createElement(FixedDataTableCell143, {x: 378, key: 'cell_1'}), + React.createElement(FixedDataTableCell143, {x: 383, key: 'cell_2'}), + React.createElement(FixedDataTableCell143, {x: 388, key: 'cell_3'}), + React.createElement(FixedDataTableCell143, {x: 393, key: 'cell_4'}), + React.createElement(FixedDataTableCell143, {x: 398, key: 'cell_5'}), + React.createElement(FixedDataTableCell143, {x: 403, key: 'cell_6'}), + React.createElement(FixedDataTableCell143, {x: 408, key: 'cell_7'}), + React.createElement(FixedDataTableCell143, {x: 413, key: 'cell_8'}), + React.createElement(FixedDataTableCell143, {x: 418, key: 'cell_9'}), + React.createElement(FixedDataTableCell143, {x: 423, key: 'cell_10'}), + React.createElement(FixedDataTableCell143, {x: 428, key: 'cell_11'}), + React.createElement(FixedDataTableCell143, {x: 433, key: 'cell_12'}), + React.createElement(FixedDataTableCell143, {x: 438, key: 'cell_13'}), + React.createElement(FixedDataTableCell143, {x: 443, key: 'cell_14'}), + React.createElement(FixedDataTableCell143, {x: 448, key: 'cell_15'}), + React.createElement(FixedDataTableCell143, {x: 451, key: 'cell_16'}), + React.createElement(FixedDataTableCell143, {x: 454, key: 'cell_17'}) + ); + } + }; + + var FixedDataTableCellGroup145 = function (props) { + if (props.x === 319) { + return React.createElement( + 'div', + {style: {height: 40, left: 0}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 318}) + ); + } + if (props.x === 333) { + return React.createElement( + 'div', + {style: {height: 40, left: 721}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 332}) + ); + } + if (props.x === 368) { + return React.createElement( + 'div', + {style: {height: 25, left: 0}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 367}) + ); + } + if (props.x === 456) { + return React.createElement( + 'div', + {style: {height: 25, left: 721}, className: '_3pzk'}, + React.createElement(FixedDataTableCellGroupImpl144, {x: 455}) + ); + } + }; + + var FixedDataTableRowImpl146 = function (props) { + if (props.x === 334) { + return React.createElement( + 'div', + { + className: '_1gd4 _4li _52no _3h1a _1mib', + onClick: null, + onDoubleClick: null, + onMouseDown: null, + onMouseEnter: null, + onMouseLeave: null, + style: {width: 1209, height: 40}, + }, + React.createElement( + 'div', + {className: '_1gd5'}, + React.createElement(FixedDataTableCellGroup145, { + x: 319, + key: 'fixed_cells', + }), + React.createElement(FixedDataTableCellGroup145, { + x: 333, + key: 'scrollable_cells', + }), + React.createElement('div', { + className: '_1gd6 _1gd8', + style: {left: 721, height: 40}, + }) + ) + ); + } + if (props.x === 457) { + return React.createElement( + 'div', + { + className: '_1gd4 _4li _3h1a _1mib', + onClick: null, + onDoubleClick: null, + onMouseDown: null, + onMouseEnter: null, + onMouseLeave: null, + style: {width: 1209, height: 25}, + }, + React.createElement( + 'div', + {className: '_1gd5'}, + React.createElement(FixedDataTableCellGroup145, { + x: 368, + key: 'fixed_cells', + }), + React.createElement(FixedDataTableCellGroup145, { + x: 456, + key: 'scrollable_cells', + }), + React.createElement('div', { + className: '_1gd6 _1gd8', + style: {left: 721, height: 25}, + }) + ) + ); + } + }; + + var FixedDataTableRow147 = function (props) { + if (props.x === 335) { + return React.createElement( + 'div', + { + style: { + width: 1209, + height: 40, + zIndex: 1, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + className: '_1gda', + }, + React.createElement(FixedDataTableRowImpl146, {x: 334}) + ); + } + if (props.x === 458) { + return React.createElement( + 'div', + { + style: { + width: 1209, + height: 25, + zIndex: 1, + transform: 'translate3d(0px,40px,0)', + backfaceVisibility: 'hidden', + }, + className: '_1gda', + }, + React.createElement(FixedDataTableRowImpl146, {x: 457}) + ); + } + }; + + var FixedDataTableAbstractSortableHeader148 = function (props) { + if (props.x === 341) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 340}) + ) + ); + } + if (props.x === 347) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _1kst _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 346}) + ) + ); + } + if (props.x === 353) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _1kst _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 352}) + ) + ); + } + if (props.x === 358) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 357}) + ) + ); + } + if (props.x === 363) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _54_9 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 362}) + ) + ); + } + if (props.x === 370) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 369}) + ) + ); + } + if (props.x === 375) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 374}) + ) + ); + } + if (props.x === 380) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 379}) + ) + ); + } + if (props.x === 385) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 384}) + ) + ); + } + if (props.x === 390) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 389}) + ) + ); + } + if (props.x === 395) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 394}) + ) + ); + } + if (props.x === 400) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 399}) + ) + ); + } + if (props.x === 405) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 404}) + ) + ); + } + if (props.x === 410) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 409}) + ) + ); + } + if (props.x === 415) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 414}) + ) + ); + } + if (props.x === 420) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 419}) + ) + ); + } + if (props.x === 425) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 424}) + ) + ); + } + if (props.x === 430) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 429}) + ) + ); + } + if (props.x === 435) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 434}) + ) + ); + } + if (props.x === 440) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 439}) + ) + ); + } + if (props.x === 445) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + React.createElement(AdsPETableHeader141, {x: 444}) + ) + ); + } + }; + + var FixedDataTableSortableHeader149 = function (props) { + if (props.x === 342) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 341, + }); + } + if (props.x === 348) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 347, + }); + } + if (props.x === 354) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 353, + }); + } + if (props.x === 359) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 358, + }); + } + if (props.x === 364) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 363, + }); + } + if (props.x === 371) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 370, + }); + } + if (props.x === 376) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 375, + }); + } + if (props.x === 381) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 380, + }); + } + if (props.x === 386) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 385, + }); + } + if (props.x === 391) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 390, + }); + } + if (props.x === 396) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 395, + }); + } + if (props.x === 401) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 400, + }); + } + if (props.x === 406) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 405, + }); + } + if (props.x === 411) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 410, + }); + } + if (props.x === 416) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 415, + }); + } + if (props.x === 421) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 420, + }); + } + if (props.x === 426) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 425, + }); + } + if (props.x === 431) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 430, + }); + } + if (props.x === 436) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 435, + }); + } + if (props.x === 441) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 440, + }); + } + if (props.x === 446) { + return React.createElement(FixedDataTableAbstractSortableHeader148, { + x: 445, + }); + } + }; + + var FixedDataTableBufferedRows150 = function (props) { + if (props.x === 459) { + return React.createElement('div', { + style: { + position: 'absolute', + pointerEvents: 'auto', + transform: 'translate3d(0px,65px,0)', + backfaceVisibility: 'hidden', + }, + }); + } + }; + + var Scrollbar151 = function (props) { + if (props.x === 460) { + return null; + } + if (props.x === 461) { + return React.createElement( + 'div', + { + onFocus: function () {}, + onBlur: function () {}, + onKeyDown: function () {}, + onMouseDown: function () {}, + onWheel: function () {}, + className: '_1t0r _1t0t _4jdr _1t0u', + style: {width: 1209, zIndex: 99}, + tabIndex: 0, + }, + React.createElement('div', { + className: '_1t0w _1t0y _1t0_', + style: { + width: 561.6340607950117, + transform: 'translate3d(4px,0px,0)', + backfaceVisibility: 'hidden', + }, + }) + ); + } + }; + + var HorizontalScrollbar152 = function (props) { + if (props.x === 462) { + return React.createElement( + 'div', + {className: '_3h1k _3h1m', style: {height: 15, width: 1209}}, + React.createElement( + 'div', + { + style: { + height: 15, + position: 'absolute', + overflow: 'hidden', + width: 1209, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + React.createElement(Scrollbar151, {x: 461}) + ) + ); + } + }; + + var FixedDataTable153 = function (props) { + if (props.x === 463) { + return React.createElement( + 'div', + { + className: '_3h1i _1mie', + onWheel: function () {}, + style: {height: 25, width: 1209}, + }, + React.createElement( + 'div', + {className: '_3h1j', style: {height: 8, width: 1209}}, + React.createElement(FixedDataTableColumnResizeHandle140, {x: 313}), + React.createElement(FixedDataTableRow147, { + x: 335, + key: 'group_header', + }), + React.createElement(FixedDataTableRow147, {x: 458, key: 'header'}), + React.createElement(FixedDataTableBufferedRows150, {x: 459}), + null, + undefined, + React.createElement('div', { + className: '_3h1e _3h1h', + style: {top: 8}, + }) + ), + React.createElement(Scrollbar151, {x: 460}), + React.createElement(HorizontalScrollbar152, {x: 462}) + ); + } + }; + + var TransitionTable154 = function (props) { + if (props.x === 464) { + return React.createElement(FixedDataTable153, {x: 463}); + } + }; + + var AdsSelectableFixedDataTable155 = function (props) { + if (props.x === 465) { + return React.createElement( + 'div', + {className: '_5hht'}, + React.createElement(TransitionTable154, {x: 464}) + ); + } + }; + + var AdsDataTableKeyboardSupportDecorator156 = function (props) { + if (props.x === 466) { + return React.createElement( + 'div', + {className: '_5d6f', tabIndex: '0', onKeyDown: function () {}}, + React.createElement(AdsSelectableFixedDataTable155, {x: 465}) + ); + } + }; + + var AdsEditableDataTableDecorator157 = function (props) { + if (props.x === 467) { + return React.createElement( + 'div', + {onCopy: function () {}}, + React.createElement(AdsDataTableKeyboardSupportDecorator156, {x: 466}) + ); + } + }; + + var AdsPEDataTableContainer158 = function (props) { + if (props.x === 468) { + return React.createElement( + 'div', + {className: '_35l_ _1hr clearfix'}, + null, + null, + null, + React.createElement(AdsEditableDataTableDecorator157, {x: 467}) + ); + } + }; + + var AdsPECampaignGroupTableContainer159 = function (props) { + if (props.x === 470) { + return React.createElement(ResponsiveBlock37, {x: 469}); + } + }; + + var AdsPEManageAdsPaneContainer160 = function (props) { + if (props.x === 473) { + return React.createElement( + 'div', + null, + React.createElement(AdsErrorBoundary10, {x: 65}), + React.createElement( + 'div', + {className: '_2uty'}, + React.createElement(AdsErrorBoundary10, {x: 125}) + ), + React.createElement( + 'div', + {className: '_2utx _21oc'}, + React.createElement(AdsErrorBoundary10, {x: 171}), + React.createElement( + 'div', + {className: '_41tu'}, + React.createElement(AdsErrorBoundary10, {x: 176}), + React.createElement(AdsErrorBoundary10, {x: 194}) + ) + ), + React.createElement( + 'div', + {className: '_2utz', style: {height: 25}}, + React.createElement(AdsErrorBoundary10, {x: 302}), + React.createElement( + 'div', + {className: '_2ut-'}, + React.createElement(AdsErrorBoundary10, {x: 312}) + ), + React.createElement( + 'div', + {className: '_2ut_'}, + React.createElement(AdsErrorBoundary10, {x: 472}) + ) + ) + ); + } + }; + + var AdsPEContentContainer161 = function (props) { + if (props.x === 474) { + return React.createElement(AdsPEManageAdsPaneContainer160, {x: 473}); + } + }; + + var FluxContainer_AdsPEWorkspaceContainer_162 = function (props) { + if (props.x === 477) { + return React.createElement( + 'div', + {className: '_49wu', style: {height: 177, top: 43, width: 1306}}, + React.createElement(ResponsiveBlock37, {x: 62, key: '0'}), + React.createElement(AdsErrorBoundary10, {x: 476, key: '1'}), + null + ); + } + }; + + var FluxContainer_AdsSessionExpiredDialogContainer_163 = function (props) { + if (props.x === 478) { + return null; + } + }; + + var FluxContainer_AdsPEUploadDialogLazyContainer_164 = function (props) { + if (props.x === 479) { + return null; + } + }; + + var FluxContainer_DialogContainer_165 = function (props) { + if (props.x === 480) { + return null; + } + }; + + var AdsBugReportContainer166 = function (props) { + if (props.x === 481) { + return React.createElement('span', null); + } + }; + + var AdsPEAudienceSplittingDialog167 = function (props) { + if (props.x === 482) { + return null; + } + }; + + var AdsPEAudienceSplittingDialogContainer168 = function (props) { + if (props.x === 483) { + return React.createElement( + 'div', + null, + React.createElement(AdsPEAudienceSplittingDialog167, {x: 482}) + ); + } + }; + + var FluxContainer_AdsRuleDialogBootloadContainer_169 = function (props) { + if (props.x === 484) { + return null; + } + }; + + var FluxContainer_AdsPECFTrayContainer_170 = function (props) { + if (props.x === 485) { + return null; + } + }; + + var FluxContainer_AdsPEDeleteDraftContainer_171 = function (props) { + if (props.x === 486) { + return null; + } + }; + + var FluxContainer_AdsPEInitialDraftPublishDialogContainer_172 = function ( + props + ) { + if (props.x === 487) { + return null; + } + }; + + var FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173 = + function (props) { + if (props.x === 488) { + return null; + } + }; + + var FluxContainer_AdsPEPurgeArchiveDialogContainer_174 = function (props) { + if (props.x === 489) { + return null; + } + }; + + var AdsPECreateDialogContainer175 = function (props) { + if (props.x === 490) { + return React.createElement('span', null); + } + }; + + var FluxContainer_AdsPEModalStatusContainer_176 = function (props) { + if (props.x === 491) { + return null; + } + }; + + var FluxContainer_AdsBrowserExtensionErrorDialogContainer_177 = function ( + props + ) { + if (props.x === 492) { + return null; + } + }; + + var FluxContainer_AdsPESortByErrorTipContainer_178 = function (props) { + if (props.x === 493) { + return null; + } + }; + + var LeadDownloadDialogSelector179 = function (props) { + if (props.x === 494) { + return null; + } + }; + + var FluxContainer_AdsPELeadDownloadDialogContainerClass_180 = function ( + props + ) { + if (props.x === 495) { + return React.createElement(LeadDownloadDialogSelector179, {x: 494}); + } + }; + + var AdsPEContainer181 = function (props) { + if (props.x === 496) { + return React.createElement( + 'div', + {id: 'ads_pe_container'}, + React.createElement(FluxContainer_AdsPETopNavContainer_26, {x: 41}), + null, + React.createElement(FluxContainer_AdsPEWorkspaceContainer_162, { + x: 477, + }), + React.createElement( + FluxContainer_AdsSessionExpiredDialogContainer_163, + {x: 478} + ), + React.createElement(FluxContainer_AdsPEUploadDialogLazyContainer_164, { + x: 479, + }), + React.createElement(FluxContainer_DialogContainer_165, {x: 480}), + React.createElement(AdsBugReportContainer166, {x: 481}), + React.createElement(AdsPEAudienceSplittingDialogContainer168, {x: 483}), + React.createElement(FluxContainer_AdsRuleDialogBootloadContainer_169, { + x: 484, + }), + React.createElement(FluxContainer_AdsPECFTrayContainer_170, {x: 485}), + React.createElement( + 'span', + null, + React.createElement(FluxContainer_AdsPEDeleteDraftContainer_171, { + x: 486, + }), + React.createElement( + FluxContainer_AdsPEInitialDraftPublishDialogContainer_172, + {x: 487} + ), + React.createElement( + FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173, + {x: 488} + ) + ), + React.createElement( + FluxContainer_AdsPEPurgeArchiveDialogContainer_174, + {x: 489} + ), + React.createElement(AdsPECreateDialogContainer175, {x: 490}), + React.createElement(FluxContainer_AdsPEModalStatusContainer_176, { + x: 491, + }), + React.createElement( + FluxContainer_AdsBrowserExtensionErrorDialogContainer_177, + {x: 492} + ), + React.createElement(FluxContainer_AdsPESortByErrorTipContainer_178, { + x: 493, + }), + React.createElement( + FluxContainer_AdsPELeadDownloadDialogContainerClass_180, + {x: 495} + ), + React.createElement('div', {id: 'web_ads_guidance_tips'}) + ); + } + }; + + var Benchmark = function (props) { + if (props.x === undefined) { + return React.createElement(AdsPEContainer181, {x: 496}); + } + }; + + var app = document.getElementById('app'); + + window.render = function render() { + ReactDOM.render(React.createElement(Benchmark, null), app); + }; +})(); diff --git a/scripts/bench/benchmarks/pe-functional-components/build.js b/scripts/bench/benchmarks/pe-functional-components/build.js new file mode 100644 index 00000000000..ffbd82637d2 --- /dev/null +++ b/scripts/bench/benchmarks/pe-functional-components/build.js @@ -0,0 +1,17 @@ +'use strict'; + +const {join} = require('path'); + +async function build(reactPath, asyncCopyTo) { + // copy the UMD bundles + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react.production.js'), + join(__dirname, 'react.production.js') + ); + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react-dom.production.js'), + join(__dirname, 'react-dom.production.js') + ); +} + +module.exports = build; diff --git a/scripts/bench/benchmarks/pe-functional-components/index.html b/scripts/bench/benchmarks/pe-functional-components/index.html new file mode 100644 index 00000000000..c2d44dcd00b --- /dev/null +++ b/scripts/bench/benchmarks/pe-functional-components/index.html @@ -0,0 +1,32 @@ + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/scripts/bench/benchmarks/pe-no-components/benchmark.js b/scripts/bench/benchmarks/pe-no-components/benchmark.js new file mode 100644 index 00000000000..664f6db665a --- /dev/null +++ b/scripts/bench/benchmarks/pe-no-components/benchmark.js @@ -0,0 +1,4943 @@ +(function () { + 'use strict'; + + var ReactImage0 = function (x) { + if (x === 0) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (x === 15) { + return React.createElement('i', { + className: '_3ut_ img sp_i534r85sjIn sx_e8ac93', + src: null, + alt: '', + }); + } + if (x === 22) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_7b15bc', + src: null, + }); + } + if (x === 29) { + return React.createElement('i', { + className: '_1m1s _4540 _p img sp_i534r85sjIn sx_f40b1c', + src: null, + alt: '', + }); + } + if (x === 42) { + return React.createElement( + 'i', + { + alt: 'Warning', + className: '_585p img sp_i534r85sjIn sx_20273d', + src: null, + }, + React.createElement('u', null, 'Warning') + ); + } + if (x === 67) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_b5d079', + src: null, + }); + } + if (x === 70) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_29f8c9', + }); + } + if (x === 76) { + return React.createElement('i', { + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_ef6a9c', + src: null, + }); + } + if (x === 79) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_6f8c43', + }); + } + if (x === 88) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_e94a2d', + }); + } + if (x === 91) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_7ed7d4', + }); + } + if (x === 94) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_930440', + }); + } + if (x === 98) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_750c83', + }); + } + if (x === 108) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_73c1bb', + }); + } + if (x === 111) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_29f28d', + }); + } + if (x === 126) { + return React.createElement('i', { + src: null, + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_91c59e', + }); + } + if (x === 127) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (x === 134) { + return React.createElement('i', { + src: null, + alt: '', + className: '_3-8_ img sp_i534r85sjIn sx_c8eb75', + }); + } + if (x === 135) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (x === 148) { + return React.createElement('i', { + className: '_3yz6 _5whs img sp_i534r85sjIn sx_896996', + src: null, + alt: '', + }); + } + if (x === 152) { + return React.createElement('i', { + className: '_5b5p _4gem img sp_i534r85sjIn sx_896996', + src: null, + alt: '', + }); + } + if (x === 153) { + return React.createElement('i', { + className: '_541d img sp_i534r85sjIn sx_2f396a', + src: null, + alt: '', + }); + } + if (x === 160) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_31d9b0', + }); + } + if (x === 177) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_2c18b7', + src: null, + }); + } + if (x === 186) { + return React.createElement('i', { + src: null, + alt: '', + className: 'img sp_i534r85sjIn sx_0a681f', + }); + } + if (x === 195) { + return React.createElement('i', { + className: '_1-lx img sp_OkER5ktbEyg sx_b369b4', + src: null, + alt: '', + }); + } + if (x === 198) { + return React.createElement('i', { + className: '_1-lx img sp_i534r85sjIn sx_96948e', + src: null, + alt: '', + }); + } + if (x === 237) { + return React.createElement('i', { + className: '_541d img sp_i534r85sjIn sx_2f396a', + src: null, + alt: '', + }); + } + if (x === 266) { + return React.createElement('i', { + alt: '', + className: '_3-99 img sp_i534r85sjIn sx_538591', + src: null, + }); + } + if (x === 314) { + return React.createElement('i', { + className: '_1cie _1cif img sp_i534r85sjIn sx_6e6820', + src: null, + alt: '', + }); + } + if (x === 345) { + return React.createElement('i', { + className: '_1cie img sp_i534r85sjIn sx_e896cf', + src: null, + alt: '', + }); + } + if (x === 351) { + return React.createElement('i', { + className: '_1cie img sp_i534r85sjIn sx_38fed8', + src: null, + alt: '', + }); + } + }; + + var AbstractLink1 = function (x) { + if (x === 1) { + return React.createElement( + 'a', + { + className: '_387r _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {width: 250, maxWidth: '250px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '236px'}}, + null, + React.createElement( + 'span', + null, + React.createElement('span', {className: '_48u-'}, 'Account:'), + ' ', + 'Dick Madanson (10149999073643408)' + ) + ), + ReactImage0(0) + ); + } + if (x === 43) { + return React.createElement( + 'a', + { + className: '_585q _50zy _50-0 _50z- _5upp _42ft', + size: 'medium', + type: null, + title: 'Remove', + 'data-hover': undefined, + 'data-tooltip-alignh': undefined, + 'data-tooltip-content': undefined, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + undefined, + 'Remove', + undefined + ); + } + if (x === 49) { + return React.createElement( + 'a', + { + target: '_blank', + href: '/ads/manage/billing.php?act=10149999073643408', + rel: undefined, + onClick: function () {}, + }, + XUIText29(48) + ); + } + if (x === 128) { + return React.createElement( + 'a', + { + className: ' _5bbf _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + ReactImage0(126), + 'Search' + ), + ReactImage0(127) + ); + } + if (x === 136) { + return React.createElement( + 'a', + { + className: ' _5bbf _55pi _2agf _4jy0 _4jy4 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + ReactImage0(134), + 'Filters' + ), + ReactImage0(135) + ); + } + if (x === 178) { + return React.createElement( + 'a', + { + className: '_1_-t _1_-v _42ft', + disabled: null, + height: 'medium', + role: 'button', + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + undefined, + 'Lifetime', + ReactImage0(177) + ); + } + if (x === 207) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'Create Ad Set' + ); + } + if (x === 209) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'View Ad Set' + ); + } + if (x === 241) { + return React.createElement( + 'a', + {href: '#', rel: undefined, onClick: function () {}}, + 'Set a Limit' + ); + } + if (x === 267) { + return React.createElement( + 'a', + { + className: '_p _55pi _2agf _4jy0 _4jy3 _517h _51sy _42ft', + style: {maxWidth: '200px'}, + disabled: null, + label: null, + href: '#', + rel: undefined, + onClick: function () {}, + }, + null, + React.createElement( + 'span', + {className: '_55pe', style: {maxWidth: '186px'}}, + null, + 'Links' + ), + ReactImage0(266) + ); + } + }; + + var Link2 = function (x) { + if (x === 2) { + return AbstractLink1(1); + } + if (x === 44) { + return AbstractLink1(43); + } + if (x === 50) { + return AbstractLink1(49); + } + if (x === 129) { + return AbstractLink1(128); + } + if (x === 137) { + return AbstractLink1(136); + } + if (x === 179) { + return AbstractLink1(178); + } + if (x === 208) { + return AbstractLink1(107); + } + if (x === 210) { + return AbstractLink1(209); + } + if (x === 242) { + return AbstractLink1(241); + } + if (x === 268) { + return AbstractLink1(267); + } + }; + + var AbstractButton3 = function (x) { + if (x === 3) { + return Link2(2); + } + if (x === 20) { + return React.createElement( + 'button', + { + className: '_5n7z _4jy0 _4jy4 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + 'Discard Changes', + undefined + ); + } + if (x === 23) { + return React.createElement( + 'button', + { + className: '_5n7z _2yak _4lj- _4jy0 _4jy4 _517h _51sy _42ft _42fr', + disabled: true, + onClick: function () {}, + 'data-tooltip-content': 'You have no changes to publish', + 'data-hover': 'tooltip', + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(22), + 'Review Changes', + undefined + ); + } + if (x === 45) { + return Link2(44); + } + if (x === 68) { + return React.createElement( + 'button', + { + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(67), + 'Create Campaign', + undefined + ); + } + if (x === 71) { + return React.createElement( + 'button', + { + className: '_u_k _3qx6 _p _4jy0 _4jy4 _517h _51sy _42ft', + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(70), + undefined, + undefined + ); + } + if (x === 77) { + return React.createElement( + 'button', + { + 'aria-label': 'Edit', + 'data-tooltip-content': 'Edit Campaigns (Ctrl+U)', + 'data-hover': 'tooltip', + className: '_d2_ _u_k noMargin _4jy0 _4jy4 _517h _51sy _42ft', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(76), + 'Edit', + undefined + ); + } + if (x === 80) { + return React.createElement( + 'button', + { + className: '_u_k _3qx6 _p _4jy0 _4jy4 _517h _51sy _42ft', + disabled: false, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(79), + undefined, + undefined + ); + } + if (x === 89) { + return React.createElement( + 'button', + { + 'aria-label': 'Revert', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft _42fr', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Revert', + disabled: true, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(88), + undefined, + undefined + ); + } + if (x === 92) { + return React.createElement( + 'button', + { + 'aria-label': 'Delete', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Delete', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(91), + undefined, + undefined + ); + } + if (x === 95) { + return React.createElement( + 'button', + { + 'aria-label': 'Duplicate', + className: '_u_k _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Duplicate', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(94), + undefined, + undefined + ); + } + if (x === 99) { + return React.createElement( + 'button', + { + 'aria-label': 'Export & Import', + className: '_u_k noMargin _p _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Export & Import', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(98), + undefined, + undefined + ); + } + if (x === 109) { + return React.createElement( + 'button', + { + 'aria-label': 'Create Report', + className: '_u_k _5n7z _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Create Report', + disabled: false, + style: {boxSizing: 'border-box', height: '28px', width: '48px'}, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(108), + undefined, + undefined + ); + } + if (x === 112) { + return React.createElement( + 'button', + { + 'aria-label': 'Campaign Tags', + className: ' _5uy7 _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'Campaign Tags', + disabled: false, + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(111), + undefined, + undefined + ); + } + if (x === 130) { + return Link2(129); + } + if (x === 138) { + return Link2(137); + } + if (x === 149) { + return React.createElement( + 'button', + { + className: '_3yz9 _1t-2 _50z- _50zy _50zz _50z- _5upp _42ft', + size: 'small', + onClick: function () {}, + type: 'button', + title: 'Remove', + 'data-hover': undefined, + 'data-tooltip-alignh': undefined, + 'data-tooltip-content': undefined, + label: null, + }, + undefined, + 'Remove', + undefined + ); + } + if (x === 156) { + return React.createElement( + 'button', + { + className: '_5b5u _5b5v _4jy0 _4jy3 _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + 'Apply', + undefined + ); + } + if (x === 161) { + return React.createElement( + 'button', + { + className: '_1wdf _4jy0 _517i _517h _51sy _42ft', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(160), + undefined, + undefined + ); + } + if (x === 180) { + return Link2(179); + } + if (x === 187) { + return React.createElement( + 'button', + { + 'aria-label': 'List Settings', + className: '_u_k _3c5o _1-r0 _4jy0 _4jy4 _517h _51sy _42ft', + 'data-hover': 'tooltip', + 'data-tooltip-content': 'List Settings', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + ReactImage0(186), + undefined, + undefined + ); + } + if (x === 269) { + return Link2(268); + } + if (x === 303) { + return React.createElement( + 'button', + { + className: '_tm3 _tm6 _tm7 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Campaigns', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + if (x === 305) { + return React.createElement( + 'button', + { + className: '_tm4 _tm6 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Ad Sets', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + if (x === 307) { + return React.createElement( + 'button', + { + className: '_tm5 _tm6 _4jy0 _4jy6 _517h _51sy _42ft', + 'data-tooltip-position': 'right', + 'data-tooltip-content': 'Ads', + 'data-hover': 'tooltip', + onClick: function () {}, + label: null, + type: 'submit', + value: '1', + }, + undefined, + React.createElement( + 'div', + null, + React.createElement('div', {className: '_tma'}), + React.createElement('div', {className: '_tm8'}), + React.createElement('div', {className: '_tm9'}, 1) + ), + undefined + ); + } + }; + + var XUIButton4 = function (x) { + if (x === 4) { + return AbstractButton3(3); + } + if (x === 21) { + return AbstractButton3(20); + } + if (x === 24) { + return AbstractButton3(23); + } + if (x === 69) { + return AbstractButton3(68); + } + if (x === 72) { + return AbstractButton3(71); + } + if (x === 78) { + return AbstractButton3(77); + } + if (x === 81) { + return AbstractButton3(80); + } + if (x === 90) { + return AbstractButton3(89); + } + if (x === 93) { + return AbstractButton3(92); + } + if (x === 96) { + return AbstractButton3(95); + } + if (x === 100) { + return AbstractButton3(99); + } + if (x === 110) { + return AbstractButton3(109); + } + if (x === 113) { + return AbstractButton3(112); + } + if (x === 131) { + return AbstractButton3(130); + } + if (x === 139) { + return AbstractButton3(138); + } + if (x === 157) { + return AbstractButton3(156); + } + if (x === 162) { + return AbstractButton3(161); + } + if (x === 188) { + return AbstractButton3(187); + } + if (x === 270) { + return AbstractButton3(269); + } + if (x === 304) { + return AbstractButton3(303); + } + if (x === 306) { + return AbstractButton3(305); + } + if (x === 308) { + return AbstractButton3(307); + } + }; + + var AbstractPopoverButton5 = function (x) { + if (x === 5) { + return XUIButton4(4); + } + if (x === 132) { + return XUIButton4(131); + } + if (x === 140) { + return XUIButton4(139); + } + if (x === 271) { + return XUIButton4(270); + } + }; + + var ReactXUIPopoverButton6 = function (x) { + if (x === 6) { + return AbstractPopoverButton5(5); + } + if (x === 133) { + return AbstractPopoverButton5(132); + } + if (x === 141) { + return AbstractPopoverButton5(140); + } + if (x === 272) { + return AbstractPopoverButton5(271); + } + }; + + var BIGAdAccountSelector7 = function (x) { + if (x === 7) { + return React.createElement('div', null, ReactXUIPopoverButton6(6), null); + } + }; + + var FluxContainer_AdsPEBIGAdAccountSelectorContainer_8 = function (x) { + if (x === 8) { + return BIGAdAccountSelector7(7); + } + }; + + var ErrorBoundary9 = function (x) { + if (x === 9) { + return FluxContainer_AdsPEBIGAdAccountSelectorContainer_8(8); + } + if (x === 13) { + return FluxContainer_AdsPENavigationBarContainer_12(12); + } + if (x === 27) { + return FluxContainer_AdsPEPublishButtonContainer_18(26); + } + if (x === 32) { + return ReactPopoverMenu20(31); + } + if (x === 38) { + return AdsPEResetDialog24(37); + } + if (x === 57) { + return FluxContainer_AdsPETopErrorContainer_35(56); + } + if (x === 60) { + return FluxContainer_AdsGuidanceChannel_36(59); + } + if (x === 64) { + return FluxContainer_AdsBulkEditDialogContainer_38(63); + } + if (x === 124) { + return AdsPECampaignGroupToolbarContainer57(123); + } + if (x === 170) { + return AdsPEFilterContainer72(169); + } + if (x === 175) { + return AdsPETablePagerContainer75(174); + } + if (x === 193) { + return AdsPEStatRangeContainer81(192); + } + if (x === 301) { + return FluxContainer_AdsPEMultiTabDrawerContainer_137(300); + } + if (x === 311) { + return AdsPEOrganizerContainer139(310); + } + if (x === 471) { + return AdsPECampaignGroupTableContainer159(470); + } + if (x === 475) { + return AdsPEContentContainer161(474); + } + }; + + var AdsErrorBoundary10 = function (x) { + if (x === 10) { + return ErrorBoundary9(9); + } + if (x === 14) { + return ErrorBoundary9(13); + } + if (x === 28) { + return ErrorBoundary9(27); + } + if (x === 33) { + return ErrorBoundary9(32); + } + if (x === 39) { + return ErrorBoundary9(38); + } + if (x === 58) { + return ErrorBoundary9(57); + } + if (x === 61) { + return ErrorBoundary9(60); + } + if (x === 65) { + return ErrorBoundary9(64); + } + if (x === 125) { + return ErrorBoundary9(124); + } + if (x === 171) { + return ErrorBoundary9(170); + } + if (x === 176) { + return ErrorBoundary9(175); + } + if (x === 194) { + return ErrorBoundary9(193); + } + if (x === 302) { + return ErrorBoundary9(301); + } + if (x === 312) { + return ErrorBoundary9(311); + } + if (x === 472) { + return ErrorBoundary9(471); + } + if (x === 476) { + return ErrorBoundary9(475); + } + }; + + var AdsPENavigationBar11 = function (x) { + if (x === 11) { + return React.createElement('div', {className: '_4t_9'}); + } + }; + + var FluxContainer_AdsPENavigationBarContainer_12 = function (x) { + if (x === 12) { + return AdsPENavigationBar11(11); + } + }; + + var AdsPEDraftSyncStatus13 = function (x) { + if (x === 16) { + return React.createElement( + 'div', + {className: '_3ut-', onClick: function () {}}, + React.createElement('span', {className: '_3uu0'}, ReactImage0(15)) + ); + } + }; + + var FluxContainer_AdsPEDraftSyncStatusContainer_14 = function (x) { + if (x === 17) { + return AdsPEDraftSyncStatus13(16); + } + }; + + var AdsPEDraftErrorsStatus15 = function (x) { + if (x === 18) { + return null; + } + }; + + var FluxContainer_viewFn_16 = function (x) { + if (x === 19) { + return AdsPEDraftErrorsStatus15(18); + } + }; + + var AdsPEPublishButton17 = function (x) { + if (x === 25) { + return React.createElement( + 'div', + {className: '_5533'}, + FluxContainer_AdsPEDraftSyncStatusContainer_14(17), + FluxContainer_viewFn_16(19), + null, + XUIButton4(21, 'discard'), + XUIButton4(24) + ); + } + }; + + var FluxContainer_AdsPEPublishButtonContainer_18 = function (x) { + if (x === 26) { + return AdsPEPublishButton17(25); + } + }; + + var InlineBlock19 = function (x) { + if (x === 30) { + return React.createElement( + 'div', + {className: 'uiPopover _6a _6b', disabled: null}, + ReactImage0(29) + ); + } + if (x === 73) { + return React.createElement( + 'div', + {className: 'uiPopover _6a _6b', disabled: null}, + XUIButton4(72) + ); + } + if (x === 82) { + return React.createElement( + 'div', + {className: '_1nwm uiPopover _6a _6b', disabled: null}, + XUIButton4(81) + ); + } + if (x === 101) { + return React.createElement( + 'div', + {size: 'large', className: 'uiPopover _6a _6b', disabled: null}, + XUIButton4(100) + ); + } + if (x === 273) { + return React.createElement( + 'div', + { + className: '_3-90 uiPopover _6a _6b', + style: {marginTop: 2}, + disabled: null, + }, + ReactXUIPopoverButton6(272) + ); + } + }; + + var ReactPopoverMenu20 = function (x) { + if (x === 31) { + return InlineBlock19(30); + } + if (x === 74) { + return InlineBlock19(73); + } + if (x === 83) { + return InlineBlock19(82); + } + if (x === 102) { + return InlineBlock19(101); + } + if (x === 274) { + return InlineBlock19(273); + } + }; + + var LeftRight21 = function (x) { + if (x === 34) { + return React.createElement( + 'div', + {className: 'clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + React.createElement( + 'div', + {className: '_34_j'}, + React.createElement( + 'div', + {className: '_34_k'}, + AdsErrorBoundary10(10) + ), + React.createElement( + 'div', + {className: '_2u-6'}, + AdsErrorBoundary10(14) + ) + ) + ), + React.createElement( + 'div', + {key: 'right', className: '_ohf rfloat'}, + React.createElement( + 'div', + {className: '_34_m'}, + React.createElement( + 'div', + {key: '0', className: '_5ju2'}, + AdsErrorBoundary10(28) + ), + React.createElement( + 'div', + {key: '1', className: '_5ju2'}, + AdsErrorBoundary10(33) + ) + ) + ) + ); + } + if (x === 232) { + return React.createElement( + 'div', + {direction: 'left', className: 'clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + AdsLabeledField104(231) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement( + 'div', + {className: '_2oc7'}, + 'Clicks to Website' + ) + ) + ) + ); + } + if (x === 235) { + return React.createElement( + 'div', + {className: '_3-8x clearfix', direction: 'left'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + AdsLabeledField104(234) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + React.createElement('div', {className: '_2oc7'}, 'Auction') + ) + ) + ); + } + if (x === 245) { + return React.createElement( + 'div', + {className: '_3-8y clearfix', direction: 'left'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + AdsLabeledField104(240) + ), + React.createElement( + 'div', + {key: 'right', className: ''}, + React.createElement( + 'div', + {className: '_42ef'}, + FluxContainer_AdsCampaignGroupSpendCapContainer_107(244) + ) + ) + ); + } + if (x === 277) { + return React.createElement( + 'div', + {className: '_5dw9 _5dwa clearfix'}, + React.createElement( + 'div', + {key: 'left', className: '_ohe lfloat'}, + XUICardHeaderTitle100(265) + ), + React.createElement( + 'div', + {key: 'right', className: '_ohf rfloat'}, + FluxContainer_AdsPluginizedLinksMenuContainer_121(276) + ) + ); + } + }; + + var AdsUnifiedNavigationLocalNav22 = function (x) { + if (x === 35) { + return React.createElement('div', {className: '_34_i'}, LeftRight21(34)); + } + }; + + var XUIDialog23 = function (x) { + if (x === 36) { + return null; + } + }; + + var AdsPEResetDialog24 = function (x) { + if (x === 37) { + return React.createElement('span', null, XUIDialog23(36)); + } + }; + + var AdsPETopNav25 = function (x) { + if (x === 40) { + return React.createElement( + 'div', + {style: {width: 1306}}, + AdsUnifiedNavigationLocalNav22(35), + AdsErrorBoundary10(39) + ); + } + }; + + var FluxContainer_AdsPETopNavContainer_26 = function (x) { + if (x === 41) { + return AdsPETopNav25(40); + } + }; + + var XUIAbstractGlyphButton27 = function (x) { + if (x === 46) { + return AbstractButton3(45); + } + if (x === 150) { + return AbstractButton3(149); + } + }; + + var XUICloseButton28 = function (x) { + if (x === 47) { + return XUIAbstractGlyphButton27(46); + } + if (x === 151) { + return XUIAbstractGlyphButton27(150); + } + }; + + var XUIText29 = function (x) { + if (x === 48) { + return React.createElement( + 'span', + {display: 'inline', className: ' _50f7'}, + 'Ads Manager' + ); + } + if (x === 205) { + return React.createElement( + 'span', + {className: '_2x9f _50f5 _50f7', display: 'inline'}, + 'Editing Campaign' + ); + } + if (x === 206) { + return React.createElement( + 'span', + {display: 'inline', className: ' _50f5 _50f7'}, + 'Test Campaign' + ); + } + }; + + var XUINotice30 = function (x) { + if (x === 51) { + return React.createElement( + 'div', + {size: 'medium', className: '_585n _585o _2wdd'}, + ReactImage0(42), + XUICloseButton28(47), + React.createElement( + 'div', + {className: '_585r _2i-a _50f4'}, + 'Please go to ', + Link2(50), + ' to set up a payment method for this ad account.' + ) + ); + } + }; + + var ReactCSSTransitionGroupChild31 = function (x) { + if (x === 52) { + return XUINotice30(51); + } + }; + + var ReactTransitionGroup32 = function (x) { + if (x === 53) { + return React.createElement( + 'span', + null, + ReactCSSTransitionGroupChild31(52) + ); + } + }; + + var ReactCSSTransitionGroup33 = function (x) { + if (x === 54) { + return ReactTransitionGroup32(53); + } + }; + + var AdsPETopError34 = function (x) { + if (x === 55) { + return React.createElement( + 'div', + {className: '_2wdc'}, + ReactCSSTransitionGroup33(54) + ); + } + }; + + var FluxContainer_AdsPETopErrorContainer_35 = function (x) { + if (x === 56) { + return AdsPETopError34(55); + } + }; + + var FluxContainer_AdsGuidanceChannel_36 = function (x) { + if (x === 59) { + return null; + } + }; + + var ResponsiveBlock37 = function (x) { + if (x === 62) { + return React.createElement( + 'div', + {className: '_4u-c'}, + [AdsErrorBoundary10(58), AdsErrorBoundary10(61)], + React.createElement( + 'div', + {key: 'sensor', className: '_4u-f'}, + React.createElement('iframe', { + 'aria-hidden': 'true', + className: '_1_xb', + tabIndex: '-1', + }) + ) + ); + } + if (x === 469) { + return React.createElement( + 'div', + {className: '_4u-c'}, + AdsPEDataTableContainer158(468), + React.createElement( + 'div', + {key: 'sensor', className: '_4u-f'}, + React.createElement('iframe', { + 'aria-hidden': 'true', + className: '_1_xb', + tabIndex: '-1', + }) + ) + ); + } + }; + + var FluxContainer_AdsBulkEditDialogContainer_38 = function (x) { + if (x === 63) { + return null; + } + }; + + var Column39 = function (x) { + if (x === 66) { + return React.createElement( + 'div', + {className: '_4bl8 _4bl7'}, + React.createElement( + 'div', + {className: '_3c5f'}, + null, + null, + React.createElement('div', {className: '_3c5i'}), + null + ) + ); + } + }; + + var XUIButtonGroup40 = function (x) { + if (x === 75) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + XUIButton4(69), + ReactPopoverMenu20(74) + ); + } + if (x === 84) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + XUIButton4(78), + ReactPopoverMenu20(83) + ); + } + if (x === 97) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + XUIButton4(90), + XUIButton4(93), + XUIButton4(96) + ); + } + if (x === 117) { + return React.createElement( + 'div', + {className: '_5n7z _51xa'}, + AdsPEExportImportMenuContainer48(107), + XUIButton4(110), + AdsPECampaignGroupTagContainer51(116) + ); + } + }; + + var AdsPEEditToolbarButton41 = function (x) { + if (x === 85) { + return XUIButtonGroup40(84); + } + }; + + var FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42 = function ( + x + ) { + if (x === 86) { + return AdsPEEditToolbarButton41(85); + } + }; + + var FluxContainer_AdsPEEditToolbarButtonContainer_43 = function (x) { + if (x === 87) { + return FluxContainer_AdsPEEditCampaignGroupToolbarButtonContainer_42(86); + } + }; + + var AdsPEExportImportMenu44 = function (x) { + if (x === 103) { + return ReactPopoverMenu20(102); + } + }; + + var FluxContainer_AdsPECustomizeExportContainer_45 = function (x) { + if (x === 104) { + return null; + } + }; + + var AdsPEExportAsTextDialog46 = function (x) { + if (x === 105) { + return null; + } + }; + + var FluxContainer_AdsPEExportAsTextDialogContainer_47 = function (x) { + if (x === 106) { + return AdsPEExportAsTextDialog46(105); + } + }; + + var AdsPEExportImportMenuContainer48 = function (x) { + if (x === 107) { + return React.createElement( + 'span', + null, + AdsPEExportImportMenu44(103), + FluxContainer_AdsPECustomizeExportContainer_45(104), + FluxContainer_AdsPEExportAsTextDialogContainer_47(106), + null, + null + ); + } + }; + + var Constructor49 = function (x) { + if (x === 114) { + return null; + } + if (x === 142) { + return null; + } + if (x === 143) { + return null; + } + if (x === 183) { + return null; + } + }; + + var TagSelectorPopover50 = function (x) { + if (x === 115) { + return React.createElement( + 'span', + {className: ' _3d6e'}, + XUIButton4(113), + Constructor49(114) + ); + } + }; + + var AdsPECampaignGroupTagContainer51 = function (x) { + if (x === 116) { + return TagSelectorPopover50(115); + } + }; + + var AdsRuleToolbarMenu52 = function (x) { + if (x === 118) { + return null; + } + }; + + var FluxContainer_AdsPERuleToolbarMenuContainer_53 = function (x) { + if (x === 119) { + return AdsRuleToolbarMenu52(118); + } + }; + + var FillColumn54 = function (x) { + if (x === 120) { + return React.createElement( + 'div', + {className: '_4bl9'}, + React.createElement( + 'span', + {className: '_3c5e'}, + React.createElement( + 'span', + null, + XUIButtonGroup40(75), + FluxContainer_AdsPEEditToolbarButtonContainer_43(87), + null, + XUIButtonGroup40(97) + ), + XUIButtonGroup40(117), + FluxContainer_AdsPERuleToolbarMenuContainer_53(119) + ) + ); + } + }; + + var Layout55 = function (x) { + if (x === 121) { + return React.createElement( + 'div', + {className: 'clearfix'}, + Column39(66), + FillColumn54(120) + ); + } + }; + + var AdsPEMainPaneToolbar56 = function (x) { + if (x === 122) { + return React.createElement( + 'div', + {className: '_3c5b clearfix'}, + Layout55(121) + ); + } + }; + + var AdsPECampaignGroupToolbarContainer57 = function (x) { + if (x === 123) { + return AdsPEMainPaneToolbar56(122); + } + }; + + var AdsPEFiltersPopover58 = function (x) { + if (x === 144) { + return React.createElement( + 'span', + {className: '_5b-l _5bbe'}, + ReactXUIPopoverButton6(133), + ReactXUIPopoverButton6(141), + [Constructor49(142), Constructor49(143)] + ); + } + }; + + var AbstractCheckboxInput59 = function (x) { + if (x === 145) { + return React.createElement( + 'label', + {className: 'uiInputLabelInput _55sg _kv1'}, + React.createElement('input', { + checked: true, + disabled: true, + name: 'filterUnpublished', + value: 'on', + onClick: function () {}, + className: null, + id: 'js_input_label_21', + type: 'checkbox', + }), + React.createElement('span', { + 'data-hover': null, + 'data-tooltip-content': undefined, + }) + ); + } + if (x === 336) { + return React.createElement( + 'label', + {className: '_4h2r _55sg _kv1'}, + React.createElement('input', { + checked: undefined, + onChange: function () {}, + className: null, + type: 'checkbox', + }), + React.createElement('span', { + 'data-hover': null, + 'data-tooltip-content': undefined, + }) + ); + } + }; + + var XUICheckboxInput60 = function (x) { + if (x === 146) { + return AbstractCheckboxInput59(145); + } + if (x === 337) { + return AbstractCheckboxInput59(336); + } + }; + + var InputLabel61 = function (x) { + if (x === 147) { + return React.createElement( + 'div', + {display: 'block', className: 'uiInputLabel clearfix'}, + XUICheckboxInput60(146), + React.createElement( + 'label', + {className: 'uiInputLabelLabel', htmlFor: 'js_input_label_21'}, + 'Always show new items' + ) + ); + } + }; + + var AdsPopoverLink62 = function (x) { + if (x === 154) { + return React.createElement( + 'span', + null, + React.createElement( + 'span', + { + onMouseEnter: function () {}, + onMouseLeave: function () {}, + onMouseUp: undefined, + }, + React.createElement('span', {className: '_3o_j'}), + ReactImage0(153) + ), + null + ); + } + if (x === 238) { + return React.createElement( + 'span', + null, + React.createElement( + 'span', + { + onMouseEnter: function () {}, + onMouseLeave: function () {}, + onMouseUp: undefined, + }, + React.createElement('span', {className: '_3o_j'}), + ReactImage0(237) + ), + null + ); + } + }; + + var AdsHelpLink63 = function (x) { + if (x === 155) { + return AdsPopoverLink62(154); + } + if (x === 239) { + return AdsPopoverLink62(238); + } + }; + + var BUIFilterTokenInput64 = function (x) { + if (x === 158) { + return React.createElement( + 'div', + {className: '_5b5o _3yz3 _4cld'}, + React.createElement( + 'div', + {className: '_5b5t _2d2k'}, + ReactImage0(152), + React.createElement( + 'div', + {className: '_5b5r'}, + 'Campaigns: (1)', + AdsHelpLink63(155) + ) + ), + XUIButton4(157) + ); + } + }; + + var BUIFilterToken65 = function (x) { + if (x === 159) { + return React.createElement( + 'div', + {className: '_3yz1 _3yz2 _3dad'}, + React.createElement( + 'div', + {className: '_3yz4', 'aria-hidden': false}, + React.createElement( + 'div', + {onClick: function () {}, className: '_3yz5'}, + ReactImage0(148), + React.createElement('div', {className: '_3yz7'}, 'Campaigns:'), + React.createElement( + 'div', + { + className: 'ellipsis _3yz8', + 'data-hover': 'tooltip', + 'data-tooltip-display': 'overflow', + }, + '(1)' + ) + ), + null, + XUICloseButton28(151) + ), + BUIFilterTokenInput64(158) + ); + } + }; + + var BUIFilterTokenCreateButton66 = function (x) { + if (x === 163) { + return React.createElement('div', {className: '_1tc'}, XUIButton4(162)); + } + }; + + var BUIFilterTokenizer67 = function (x) { + if (x === 164) { + return React.createElement( + 'div', + {className: '_5b-m clearfix'}, + undefined, + [], + BUIFilterToken65(159), + BUIFilterTokenCreateButton66(163), + null, + React.createElement('div', {className: '_49u3'}) + ); + } + }; + + var XUIAmbientNUX68 = function (x) { + if (x === 165) { + return null; + } + if (x === 189) { + return null; + } + if (x === 200) { + return null; + } + }; + + var XUIAmbientNUX69 = function (x) { + if (x === 166) { + return XUIAmbientNUX68(165); + } + if (x === 190) { + return XUIAmbientNUX68(189); + } + if (x === 201) { + return XUIAmbientNUX68(200); + } + }; + + var AdsPEAmbientNUXMegaphone70 = function (x) { + if (x === 167) { + return React.createElement( + 'span', + null, + React.createElement('span', {}), + XUIAmbientNUX69(166) + ); + } + }; + + var AdsPEFilters71 = function (x) { + if (x === 168) { + return React.createElement( + 'div', + {className: '_4rw_'}, + AdsPEFiltersPopover58(144), + React.createElement('div', {className: '_1eo'}, InputLabel61(147)), + BUIFilterTokenizer67(164), + '', + AdsPEAmbientNUXMegaphone70(167) + ); + } + }; + + var AdsPEFilterContainer72 = function (x) { + if (x === 169) { + return AdsPEFilters71(168); + } + }; + + var AdsPETablePager73 = function (x) { + if (x === 172) { + return null; + } + }; + + var AdsPECampaignGroupTablePagerContainer74 = function (x) { + if (x === 173) { + return AdsPETablePager73(172); + } + }; + + var AdsPETablePagerContainer75 = function (x) { + if (x === 174) { + return AdsPECampaignGroupTablePagerContainer74(173); + } + }; + + var ReactXUIError76 = function (x) { + if (x === 181) { + return AbstractButton3(180); + } + if (x === 216) { + return React.createElement( + 'div', + {className: '_40bf _2vl4 _1h18'}, + null, + null, + React.createElement( + 'div', + {className: '_2vl9 _1h1f', style: {backgroundColor: '#fff'}}, + React.createElement( + 'div', + {className: '_2vla _1h1g'}, + React.createElement( + 'div', + null, + null, + React.createElement('textarea', { + className: '_2vli _2vlj _1h26 _1h27', + dir: 'auto', + disabled: undefined, + id: undefined, + maxLength: null, + value: 'Test Campaign', + onBlur: function () {}, + onChange: function () {}, + onFocus: function () {}, + onKeyDown: function () {}, + }), + null + ), + React.createElement('div', { + 'aria-hidden': 'true', + className: '_2vlk', + }) + ) + ), + null + ); + } + if (x === 221) { + return XUICard94(220); + } + if (x === 250) { + return XUICard94(249); + } + if (x === 280) { + return XUICard94(279); + } + }; + + var BUIPopoverButton77 = function (x) { + if (x === 182) { + return ReactXUIError76(181); + } + }; + + var BUIDateRangePicker78 = function (x) { + if (x === 184) { + return React.createElement('span', null, BUIPopoverButton77(182), [ + Constructor49(183), + ]); + } + }; + + var AdsPEStatsRangePicker79 = function (x) { + if (x === 185) { + return BUIDateRangePicker78(184); + } + }; + + var AdsPEStatRange80 = function (x) { + if (x === 191) { + return React.createElement( + 'div', + {className: '_3c5k'}, + React.createElement('span', {className: '_3c5j'}, 'Stats:'), + React.createElement( + 'span', + {className: '_3c5l'}, + AdsPEStatsRangePicker79(185), + XUIButton4(188) + ), + [XUIAmbientNUX69(190)] + ); + } + }; + + var AdsPEStatRangeContainer81 = function (x) { + if (x === 192) { + return AdsPEStatRange80(191); + } + }; + + var AdsPESideTrayTabButton82 = function (x) { + if (x === 196) { + return React.createElement( + 'div', + {className: '_1-ly _59j9 _d9a', onClick: function () {}}, + ReactImage0(195), + React.createElement('div', {className: '_vf7'}), + React.createElement('div', {className: '_vf8'}) + ); + } + if (x === 199) { + return React.createElement( + 'div', + {className: ' _1-lz _d9a', onClick: function () {}}, + ReactImage0(198), + React.createElement('div', {className: '_vf7'}), + React.createElement('div', {className: '_vf8'}) + ); + } + if (x === 203) { + return null; + } + }; + + var AdsPEEditorTrayTabButton83 = function (x) { + if (x === 197) { + return AdsPESideTrayTabButton82(196); + } + }; + + var AdsPEInsightsTrayTabButton84 = function (x) { + if (x === 202) { + return React.createElement( + 'span', + null, + AdsPESideTrayTabButton82(199), + XUIAmbientNUX69(201) + ); + } + }; + + var AdsPENekoDebuggerTrayTabButton85 = function (x) { + if (x === 204) { + return AdsPESideTrayTabButton82(203); + } + }; + + var AdsPEEditorChildLink86 = function (x) { + if (x === 211) { + return React.createElement( + 'div', + {className: '_3ywr'}, + Link2(208), + React.createElement('span', {className: '_3ywq'}, '|'), + Link2(210) + ); + } + }; + + var AdsPEEditorChildLinkContainer87 = function (x) { + if (x === 212) { + return AdsPEEditorChildLink86(211); + } + }; + + var AdsPEHeaderSection88 = function (x) { + if (x === 213) { + return React.createElement( + 'div', + {className: '_yke'}, + React.createElement('div', {className: '_2x9d _pr-'}), + XUIText29(205), + React.createElement( + 'div', + {className: '_3a-a'}, + React.createElement('div', {className: '_3a-b'}, XUIText29(206)) + ), + AdsPEEditorChildLinkContainer87(212) + ); + } + }; + + var AdsPECampaignGroupHeaderSectionContainer89 = function (x) { + if (x === 214) { + return AdsPEHeaderSection88(213); + } + }; + + var AdsEditorLoadingErrors90 = function (x) { + if (x === 215) { + return null; + } + }; + + var AdsTextInput91 = function (x) { + if (x === 217) { + return ReactXUIError76(216); + } + }; + + var BUIFormElement92 = function (x) { + if (x === 218) { + return React.createElement( + 'div', + {className: '_5521 clearfix'}, + React.createElement( + 'div', + {className: '_5522 _3w5q'}, + React.createElement( + 'label', + { + onClick: undefined, + htmlFor: '1467872040612:1961945894', + className: '_5523 _3w5r', + }, + 'Campaign Name', + null + ) + ), + React.createElement( + 'div', + {className: '_5527'}, + React.createElement( + 'div', + {className: '_5528'}, + React.createElement( + 'span', + {key: '.0', className: '_40bg', id: '1467872040612:1961945894'}, + AdsTextInput91(217), + null + ) + ), + null + ) + ); + } + }; + + var BUIForm93 = function (x) { + if (x === 219) { + return React.createElement( + 'div', + {className: '_5ks1 _550r _550t _550y _3w5n'}, + BUIFormElement92(218) + ); + } + }; + + var XUICard94 = function (x) { + if (x === 220) { + return React.createElement( + 'div', + {className: '_40bc _12k2 _4-u2 _4-u8'}, + BUIForm93(219) + ); + } + if (x === 249) { + return React.createElement( + 'div', + {className: '_12k2 _4-u2 _4-u8'}, + AdsCardHeader103(230), + AdsCardSection108(248) + ); + } + if (x === 279) { + return React.createElement( + 'div', + {className: '_12k2 _4-u2 _4-u8'}, + AdsCardLeftRightHeader122(278) + ); + } + }; + + var AdsCard95 = function (x) { + if (x === 222) { + return ReactXUIError76(221); + } + if (x === 251) { + return ReactXUIError76(250); + } + if (x === 281) { + return ReactXUIError76(280); + } + }; + + var AdsEditorNameSection96 = function (x) { + if (x === 223) { + return AdsCard95(222); + } + }; + + var AdsCampaignGroupNameSectionContainer97 = function (x) { + if (x === 224) { + return AdsEditorNameSection96(223); + } + }; + + var _render98 = function (x) { + if (x === 225) { + return AdsCampaignGroupNameSectionContainer97(224); + } + }; + + var AdsPluginWrapper99 = function (x) { + if (x === 226) { + return _render98(225); + } + if (x === 255) { + return _render111(254); + } + if (x === 258) { + return _render113(257); + } + if (x === 287) { + return _render127(286); + } + if (x === 291) { + return _render130(290); + } + }; + + var XUICardHeaderTitle100 = function (x) { + if (x === 227) { + return React.createElement( + 'span', + {className: '_38my'}, + 'Campaign Details', + null, + React.createElement('span', {className: '_c1c'}) + ); + } + if (x === 265) { + return React.createElement( + 'span', + {className: '_38my'}, + [ + React.createElement( + 'span', + {key: 1}, + 'Campaign ID', + ': ', + '98010048849317' + ), + React.createElement( + 'div', + {className: '_5lh9', key: 2}, + FluxContainer_AdsCampaignGroupStatusSwitchContainer_119(264) + ), + ], + null, + React.createElement('span', {className: '_c1c'}) + ); + } + }; + + var XUICardSection101 = function (x) { + if (x === 228) { + return React.createElement( + 'div', + {className: '_5dw9 _5dwa _4-u3'}, + [XUICardHeaderTitle100(227)], + undefined, + undefined, + React.createElement('div', {className: '_3s3-'}) + ); + } + if (x === 247) { + return React.createElement( + 'div', + {className: '_12jy _4-u3'}, + React.createElement( + 'div', + {className: '_3-8j'}, + FlexibleBlock105(233), + FlexibleBlock105(236), + FlexibleBlock105(246), + null, + null + ) + ); + } + }; + + var XUICardHeader102 = function (x) { + if (x === 229) { + return XUICardSection101(228); + } + }; + + var AdsCardHeader103 = function (x) { + if (x === 230) { + return XUICardHeader102(229); + } + }; + + var AdsLabeledField104 = function (x) { + if (x === 231) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz', label: 'Objective'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Objective ' + ), + null, + React.createElement('div', {className: '_3bv-'}) + ); + } + if (x === 234) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz', label: 'Buying Type'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Buying Type ' + ), + null, + React.createElement('div', {className: '_3bv-'}) + ); + } + if (x === 240) { + return React.createElement( + 'div', + {className: '_2oc6 _3bvz'}, + React.createElement( + 'label', + {className: '_4el4 _3qwj _3hy-', htmlFor: undefined}, + 'Campaign Spending Limit ' + ), + AdsHelpLink63(239), + React.createElement('div', {className: '_3bv-'}) + ); + } + }; + + var FlexibleBlock105 = function (x) { + if (x === 233) { + return LeftRight21(232); + } + if (x === 236) { + return LeftRight21(235); + } + if (x === 246) { + return LeftRight21(245); + } + }; + + var AdsBulkCampaignSpendCapField106 = function (x) { + if (x === 243) { + return React.createElement( + 'div', + {className: '_33dv'}, + '', + Link2(242), + ' (optional)' + ); + } + }; + + var FluxContainer_AdsCampaignGroupSpendCapContainer_107 = function (x) { + if (x === 244) { + return AdsBulkCampaignSpendCapField106(243); + } + }; + + var AdsCardSection108 = function (x) { + if (x === 248) { + return XUICardSection101(247); + } + }; + + var AdsEditorCampaignGroupDetailsSection109 = function (x) { + if (x === 252) { + return AdsCard95(251); + } + }; + + var AdsEditorCampaignGroupDetailsSectionContainer110 = function (x) { + if (x === 253) { + return AdsEditorCampaignGroupDetailsSection109(252); + } + }; + + var _render111 = function (x) { + if (x === 254) { + return AdsEditorCampaignGroupDetailsSectionContainer110(253); + } + }; + + var FluxContainer_AdsEditorToplineDetailsSectionContainer_112 = function (x) { + if (x === 256) { + return null; + } + }; + + var _render113 = function (x) { + if (x === 257) { + return FluxContainer_AdsEditorToplineDetailsSectionContainer_112(256); + } + }; + + var AdsStickyArea114 = function (x) { + if (x === 259) { + return React.createElement( + 'div', + {}, + React.createElement('div', {onWheel: function () {}}) + ); + } + if (x === 292) { + return React.createElement( + 'div', + {}, + React.createElement('div', {onWheel: function () {}}, [ + React.createElement( + 'div', + {key: 'campaign_group_errors_section98010048849317'}, + AdsPluginWrapper99(291) + ), + ]) + ); + } + }; + + var FluxContainer_AdsEditorColumnContainer_115 = function (x) { + if (x === 260) { + return React.createElement( + 'div', + null, + [ + React.createElement( + 'div', + {key: 'campaign_group_name_section98010048849317'}, + AdsPluginWrapper99(226) + ), + React.createElement( + 'div', + {key: 'campaign_group_basic_section98010048849317'}, + AdsPluginWrapper99(255) + ), + React.createElement( + 'div', + {key: 'campaign_group_topline_section98010048849317'}, + AdsPluginWrapper99(258) + ), + ], + AdsStickyArea114(259) + ); + } + if (x === 293) { + return React.createElement( + 'div', + null, + [ + React.createElement( + 'div', + {key: 'campaign_group_navigation_section98010048849317'}, + AdsPluginWrapper99(287) + ), + ], + AdsStickyArea114(292) + ); + } + }; + + var BUISwitch116 = function (x) { + if (x === 261) { + return React.createElement( + 'div', + { + 'data-hover': 'tooltip', + 'data-tooltip-content': + 'Currently active. Click this switch to deactivate it.', + 'data-tooltip-position': 'below', + disabled: false, + value: true, + onToggle: function () {}, + className: '_128j _128k _128n', + role: 'checkbox', + 'aria-checked': 'true', + }, + React.createElement( + 'div', + { + className: '_128o', + onClick: function () {}, + onKeyDown: function () {}, + onMouseDown: function () {}, + tabIndex: '0', + }, + React.createElement('div', {className: '_128p'}) + ), + null + ); + } + }; + + var AdsStatusSwitchInternal117 = function (x) { + if (x === 262) { + return BUISwitch116(261); + } + }; + + var AdsStatusSwitch118 = function (x) { + if (x === 263) { + return AdsStatusSwitchInternal117(262); + } + }; + + var FluxContainer_AdsCampaignGroupStatusSwitchContainer_119 = function (x) { + if (x === 264) { + return AdsStatusSwitch118(263); + } + }; + + var AdsLinksMenu120 = function (x) { + if (x === 275) { + return ReactPopoverMenu20(274); + } + }; + + var FluxContainer_AdsPluginizedLinksMenuContainer_121 = function (x) { + if (x === 276) { + return React.createElement('div', null, null, AdsLinksMenu120(275)); + } + }; + + var AdsCardLeftRightHeader122 = function (x) { + if (x === 278) { + return LeftRight21(277); + } + }; + + var AdsPEIDSection123 = function (x) { + if (x === 282) { + return AdsCard95(281); + } + }; + + var FluxContainer_AdsPECampaignGroupIDSectionContainer_124 = function (x) { + if (x === 283) { + return AdsPEIDSection123(282); + } + }; + + var DeferredComponent125 = function (x) { + if (x === 284) { + return FluxContainer_AdsPECampaignGroupIDSectionContainer_124(283); + } + }; + + var BootloadedComponent126 = function (x) { + if (x === 285) { + return DeferredComponent125(284); + } + }; + + var _render127 = function (x) { + if (x === 286) { + return BootloadedComponent126(285); + } + }; + + var AdsEditorErrorsCard128 = function (x) { + if (x === 288) { + return null; + } + }; + + var FluxContainer_FunctionalContainer_129 = function (x) { + if (x === 289) { + return AdsEditorErrorsCard128(288); + } + }; + + var _render130 = function (x) { + if (x === 290) { + return FluxContainer_FunctionalContainer_129(289); + } + }; + + var AdsEditorMultiColumnLayout131 = function (x) { + if (x === 294) { + return React.createElement( + 'div', + {className: '_psh'}, + React.createElement( + 'div', + {className: '_3cc0'}, + React.createElement( + 'div', + null, + AdsEditorLoadingErrors90(215), + React.createElement( + 'div', + {className: '_3ms3'}, + React.createElement( + 'div', + {className: '_3ms4'}, + FluxContainer_AdsEditorColumnContainer_115(260) + ), + React.createElement( + 'div', + {className: '_3pvg'}, + FluxContainer_AdsEditorColumnContainer_115(293) + ) + ) + ) + ) + ); + } + }; + + var AdsPECampaignGroupEditor132 = function (x) { + if (x === 295) { + return React.createElement( + 'div', + null, + AdsPECampaignGroupHeaderSectionContainer89(214), + AdsEditorMultiColumnLayout131(294) + ); + } + }; + + var AdsPECampaignGroupEditorContainer133 = function (x) { + if (x === 296) { + return AdsPECampaignGroupEditor132(295); + } + }; + + var AdsPESideTrayTabContent134 = function (x) { + if (x === 297) { + return React.createElement( + 'div', + {className: '_1o_8 _44ra _5cyn'}, + AdsPECampaignGroupEditorContainer133(296) + ); + } + }; + + var AdsPEEditorTrayTabContentContainer135 = function (x) { + if (x === 298) { + return AdsPESideTrayTabContent134(297); + } + }; + + var AdsPEMultiTabDrawer136 = function (x) { + if (x === 299) { + return React.createElement( + 'div', + {className: '_2kev _2kex'}, + React.createElement( + 'div', + {className: '_5yno'}, + AdsPEEditorTrayTabButton83(197), + AdsPEInsightsTrayTabButton84(202), + AdsPENekoDebuggerTrayTabButton85(204) + ), + React.createElement( + 'div', + {className: '_5ynn'}, + AdsPEEditorTrayTabContentContainer135(298), + null + ) + ); + } + }; + + var FluxContainer_AdsPEMultiTabDrawerContainer_137 = function (x) { + if (x === 300) { + return AdsPEMultiTabDrawer136(299); + } + }; + + var AdsPESimpleOrganizer138 = function (x) { + if (x === 309) { + return React.createElement( + 'div', + {className: '_tm2'}, + XUIButton4(304), + XUIButton4(306), + XUIButton4(308) + ); + } + }; + + var AdsPEOrganizerContainer139 = function (x) { + if (x === 310) { + return React.createElement('div', null, AdsPESimpleOrganizer138(309)); + } + }; + + var FixedDataTableColumnResizeHandle140 = function (x) { + if (x === 313) { + return React.createElement( + 'div', + { + className: '_3487 _3488 _3489', + style: {width: 0, height: 25, left: 0}, + }, + React.createElement('div', {className: '_348a', style: {height: 25}}) + ); + } + }; + + var AdsPETableHeader141 = function (x) { + if (x === 315) { + return React.createElement( + 'div', + {className: '_1cig _1ksv _1vd7 _4h2r', id: undefined}, + ReactImage0(314), + React.createElement('span', {className: '_1cid'}, 'Campaigns') + ); + } + if (x === 320) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Performance') + ); + } + if (x === 323) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Overview') + ); + } + if (x === 326) { + return React.createElement( + 'div', + {className: '_1cig _1vd7 _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Toplines') + ); + } + if (x === 329) { + return React.createElement('div', { + className: '_1cig _1vd7 _4h2r', + id: undefined, + }); + } + if (x === 340) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Campaign Name') + ); + } + if (x === 346) { + return React.createElement( + 'div', + { + className: '_1cig _25fg', + id: undefined, + 'data-tooltip-content': 'Changed', + 'data-hover': 'tooltip', + }, + ReactImage0(345), + null + ); + } + if (x === 352) { + return React.createElement( + 'div', + { + className: '_1cig _25fg', + id: 'ads_pe_table_error_header', + 'data-tooltip-content': 'Errors', + 'data-hover': 'tooltip', + }, + ReactImage0(351), + null + ); + } + if (x === 357) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Status') + ); + } + if (x === 362) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Delivery') + ); + } + if (x === 369) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Results') + ); + } + if (x === 374) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Cost') + ); + } + if (x === 379) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Reach') + ); + } + if (x === 384) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Impressions') + ); + } + if (x === 389) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Clicks') + ); + } + if (x === 394) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Avg. CPM') + ); + } + if (x === 399) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Avg. CPC') + ); + } + if (x === 404) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'CTR %') + ); + } + if (x === 409) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Spent') + ); + } + if (x === 414) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Objective') + ); + } + if (x === 419) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Buying Type') + ); + } + if (x === 424) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Campaign ID') + ); + } + if (x === 429) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Start') + ); + } + if (x === 434) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'End') + ); + } + if (x === 439) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Date created') + ); + } + if (x === 444) { + return React.createElement( + 'div', + {className: '_1cig _25fg', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Date last edited') + ); + } + if (x === 449) { + return React.createElement( + 'div', + {className: '_1cig _25fg _4h2r', id: undefined}, + null, + React.createElement('span', {className: '_1cid'}, 'Tags') + ); + } + if (x === 452) { + return React.createElement('div', { + className: '_1cig _25fg _4h2r', + id: undefined, + }); + } + }; + + var TransitionCell142 = function (x) { + if (x === 316) { + return React.createElement( + 'div', + { + label: 'Campaigns', + height: 40, + width: 721, + className: '_4lgc _4h2u', + style: {height: 40, width: 721}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(315) + ) + ) + ); + } + if (x === 321) { + return React.createElement( + 'div', + { + label: 'Performance', + height: 40, + width: 798, + className: '_4lgc _4h2u', + style: {height: 40, width: 798}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(320) + ) + ) + ); + } + if (x === 324) { + return React.createElement( + 'div', + { + label: 'Overview', + height: 40, + width: 1022, + className: '_4lgc _4h2u', + style: {height: 40, width: 1022}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(323) + ) + ) + ); + } + if (x === 327) { + return React.createElement( + 'div', + { + label: 'Toplines', + height: 40, + width: 0, + className: '_4lgc _4h2u', + style: {height: 40, width: 0}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(326) + ) + ) + ); + } + if (x === 330) { + return React.createElement( + 'div', + { + label: '', + height: 40, + width: 25, + className: '_4lgc _4h2u', + style: {height: 40, width: 25}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(329) + ) + ) + ); + } + if (x === 338) { + return React.createElement( + 'div', + { + label: undefined, + width: 42, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 42}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + XUICheckboxInput60(337) + ) + ) + ); + } + if (x === 343) { + return React.createElement( + 'div', + { + label: 'Campaign Name', + width: 400, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 400}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(342) + ) + ) + ); + } + if (x === 349) { + return React.createElement( + 'div', + { + label: undefined, + width: 33, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 33}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(348) + ) + ) + ); + } + if (x === 355) { + return React.createElement( + 'div', + { + label: undefined, + width: 36, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 36}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(354) + ) + ) + ); + } + if (x === 360) { + return React.createElement( + 'div', + { + label: 'Status', + width: 60, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 60}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(359) + ) + ) + ); + } + if (x === 365) { + return React.createElement( + 'div', + { + label: 'Delivery', + width: 150, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 150}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(364) + ) + ) + ); + } + if (x === 372) { + return React.createElement( + 'div', + { + label: 'Results', + width: 140, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 140}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(371) + ) + ) + ); + } + if (x === 377) { + return React.createElement( + 'div', + { + label: 'Cost', + width: 140, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 140}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(376) + ) + ) + ); + } + if (x === 382) { + return React.createElement( + 'div', + { + label: 'Reach', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(381) + ) + ) + ); + } + if (x === 387) { + return React.createElement( + 'div', + { + label: 'Impressions', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(386) + ) + ) + ); + } + if (x === 392) { + return React.createElement( + 'div', + { + label: 'Clicks', + width: 60, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 60}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(391) + ) + ) + ); + } + if (x === 397) { + return React.createElement( + 'div', + { + label: 'Avg. CPM', + width: 80, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 80}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(396) + ) + ) + ); + } + if (x === 402) { + return React.createElement( + 'div', + { + label: 'Avg. CPC', + width: 78, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 78}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(401) + ) + ) + ); + } + if (x === 407) { + return React.createElement( + 'div', + { + label: 'CTR %', + width: 70, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 70}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(406) + ) + ) + ); + } + if (x === 412) { + return React.createElement( + 'div', + { + label: 'Spent', + width: 70, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 70}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(411) + ) + ) + ); + } + if (x === 417) { + return React.createElement( + 'div', + { + label: 'Objective', + width: 200, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 200}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(416) + ) + ) + ); + } + if (x === 422) { + return React.createElement( + 'div', + { + label: 'Buying Type', + width: 100, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 100}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(421) + ) + ) + ); + } + if (x === 427) { + return React.createElement( + 'div', + { + label: 'Campaign ID', + width: 120, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 120}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(426) + ) + ) + ); + } + if (x === 432) { + return React.createElement( + 'div', + { + label: 'Start', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(431) + ) + ) + ); + } + if (x === 437) { + return React.createElement( + 'div', + { + label: 'End', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(436) + ) + ) + ); + } + if (x === 442) { + return React.createElement( + 'div', + { + label: 'Date created', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(441) + ) + ) + ); + } + if (x === 447) { + return React.createElement( + 'div', + { + label: 'Date last edited', + width: 113, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 113}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + FixedDataTableSortableHeader149(446) + ) + ) + ); + } + if (x === 450) { + return React.createElement( + 'div', + { + label: 'Tags', + width: 150, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 150}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(449) + ) + ) + ); + } + if (x === 453) { + return React.createElement( + 'div', + { + label: '', + width: 25, + className: '_4lgc _4h2u', + height: 25, + style: {height: 25, width: 25}, + }, + React.createElement( + 'div', + {className: '_4lgd _4h2w'}, + React.createElement( + 'div', + {className: '_4lge _4h2x'}, + AdsPETableHeader141(452) + ) + ) + ); + } + }; + + var FixedDataTableCell143 = function (x) { + if (x === 317) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 721, left: 0}}, + undefined, + TransitionCell142(316) + ); + } + if (x === 322) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 798, left: 0}}, + undefined, + TransitionCell142(321) + ); + } + if (x === 325) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 1022, left: 798}}, + undefined, + TransitionCell142(324) + ); + } + if (x === 328) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 0, left: 1820}}, + undefined, + TransitionCell142(327) + ); + } + if (x === 331) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 40, width: 25, left: 1820}}, + undefined, + TransitionCell142(330) + ); + } + if (x === 339) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg6 _4h2m', + style: {height: 25, width: 42, left: 0}, + }, + undefined, + TransitionCell142(338) + ); + } + if (x === 344) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 400, left: 42}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(343) + ); + } + if (x === 350) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 33, left: 442}}, + undefined, + TransitionCell142(349) + ); + } + if (x === 356) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 36, left: 475}}, + undefined, + TransitionCell142(355) + ); + } + if (x === 361) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 60, left: 511}}, + undefined, + TransitionCell142(360) + ); + } + if (x === 366) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 150, left: 571}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(365) + ); + } + if (x === 373) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 140, left: 0}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(372) + ); + } + if (x === 378) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 140, left: 140}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(377) + ); + } + if (x === 383) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 280}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(382) + ); + } + if (x === 388) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 360}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(387) + ); + } + if (x === 393) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 60, left: 440}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(392) + ); + } + if (x === 398) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 80, left: 500}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(397) + ); + } + if (x === 403) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 78, left: 580}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(402) + ); + } + if (x === 408) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 70, left: 658}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(407) + ); + } + if (x === 413) { + return React.createElement( + 'div', + { + className: '_4lg0 _4lg5 _4h2p _4h2m', + style: {height: 25, width: 70, left: 728}, + }, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(412) + ); + } + if (x === 418) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 200, left: 798}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(417) + ); + } + if (x === 423) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 100, left: 998}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(422) + ); + } + if (x === 428) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 120, left: 1098}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(427) + ); + } + if (x === 433) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1218}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(432) + ); + } + if (x === 438) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1331}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(437) + ); + } + if (x === 443) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1444}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(442) + ); + } + if (x === 448) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 113, left: 1557}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(447) + ); + } + if (x === 451) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 150, left: 1670}}, + React.createElement( + 'div', + { + className: '_4lg9', + style: {height: 25}, + onMouseDown: function () {}, + }, + React.createElement('div', { + className: '_4lga _4lgb', + style: {height: 25}, + }) + ), + TransitionCell142(450) + ); + } + if (x === 454) { + return React.createElement( + 'div', + {className: '_4lg0 _4h2m', style: {height: 25, width: 25, left: 1820}}, + undefined, + TransitionCell142(453) + ); + } + }; + + var FixedDataTableCellGroupImpl144 = function (x) { + if (x === 318) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 40, + position: 'absolute', + width: 721, + zIndex: 2, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + FixedDataTableCell143(317) + ); + } + if (x === 332) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 40, + position: 'absolute', + width: 1845, + zIndex: 0, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + FixedDataTableCell143(322), + FixedDataTableCell143(325), + FixedDataTableCell143(328), + FixedDataTableCell143(331) + ); + } + if (x === 367) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 25, + position: 'absolute', + width: 721, + zIndex: 2, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + FixedDataTableCell143(339), + FixedDataTableCell143(344), + FixedDataTableCell143(350), + FixedDataTableCell143(356), + FixedDataTableCell143(361), + FixedDataTableCell143(366) + ); + } + if (x === 455) { + return React.createElement( + 'div', + { + className: '_3pzj', + style: { + height: 25, + position: 'absolute', + width: 1845, + zIndex: 0, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + FixedDataTableCell143(373), + FixedDataTableCell143(378), + FixedDataTableCell143(383), + FixedDataTableCell143(388), + FixedDataTableCell143(393), + FixedDataTableCell143(398), + FixedDataTableCell143(403), + FixedDataTableCell143(408), + FixedDataTableCell143(413), + FixedDataTableCell143(418), + FixedDataTableCell143(423), + FixedDataTableCell143(428), + FixedDataTableCell143(433), + FixedDataTableCell143(438), + FixedDataTableCell143(443), + FixedDataTableCell143(448), + FixedDataTableCell143(451), + FixedDataTableCell143(454) + ); + } + }; + + var FixedDataTableCellGroup145 = function (x) { + if (x === 319) { + return React.createElement( + 'div', + {style: {height: 40, left: 0}, className: '_3pzk'}, + FixedDataTableCellGroupImpl144(318) + ); + } + if (x === 333) { + return React.createElement( + 'div', + {style: {height: 40, left: 721}, className: '_3pzk'}, + FixedDataTableCellGroupImpl144(332) + ); + } + if (x === 368) { + return React.createElement( + 'div', + {style: {height: 25, left: 0}, className: '_3pzk'}, + FixedDataTableCellGroupImpl144(367) + ); + } + if (x === 456) { + return React.createElement( + 'div', + {style: {height: 25, left: 721}, className: '_3pzk'}, + FixedDataTableCellGroupImpl144(455) + ); + } + }; + + var FixedDataTableRowImpl146 = function (x) { + if (x === 334) { + return React.createElement( + 'div', + { + className: '_1gd4 _4li _52no _3h1a _1mib', + onClick: null, + onDoubleClick: null, + onMouseDown: null, + onMouseEnter: null, + onMouseLeave: null, + style: {width: 1209, height: 40}, + }, + React.createElement( + 'div', + {className: '_1gd5'}, + FixedDataTableCellGroup145(319), + FixedDataTableCellGroup145(333), + React.createElement('div', { + className: '_1gd6 _1gd8', + style: {left: 721, height: 40}, + }) + ) + ); + } + if (x === 457) { + return React.createElement( + 'div', + { + className: '_1gd4 _4li _3h1a _1mib', + onClick: null, + onDoubleClick: null, + onMouseDown: null, + onMouseEnter: null, + onMouseLeave: null, + style: {width: 1209, height: 25}, + }, + React.createElement( + 'div', + {className: '_1gd5'}, + FixedDataTableCellGroup145(368), + FixedDataTableCellGroup145(456), + React.createElement('div', { + className: '_1gd6 _1gd8', + style: {left: 721, height: 25}, + }) + ) + ); + } + }; + + var FixedDataTableRow147 = function (x) { + if (x === 335) { + return React.createElement( + 'div', + { + style: { + width: 1209, + height: 40, + zIndex: 1, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + className: '_1gda', + }, + FixedDataTableRowImpl146(334) + ); + } + if (x === 458) { + return React.createElement( + 'div', + { + style: { + width: 1209, + height: 25, + zIndex: 1, + transform: 'translate3d(0px,40px,0)', + backfaceVisibility: 'hidden', + }, + className: '_1gda', + }, + FixedDataTableRowImpl146(457) + ); + } + }; + + var FixedDataTableAbstractSortableHeader148 = function (x) { + if (x === 341) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(340) + ) + ); + } + if (x === 347) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _1kst _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(346) + ) + ); + } + if (x === 353) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _1kst _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(352) + ) + ); + } + if (x === 358) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(357) + ) + ); + } + if (x === 363) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _54_9 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(362) + ) + ); + } + if (x === 370) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(369) + ) + ); + } + if (x === 375) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(374) + ) + ); + } + if (x === 380) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(379) + ) + ); + } + if (x === 385) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(384) + ) + ); + } + if (x === 390) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(389) + ) + ); + } + if (x === 395) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(394) + ) + ); + } + if (x === 400) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(399) + ) + ); + } + if (x === 405) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(404) + ) + ); + } + if (x === 410) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(409) + ) + ); + } + if (x === 415) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(414) + ) + ); + } + if (x === 420) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(419) + ) + ); + } + if (x === 425) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(424) + ) + ); + } + if (x === 430) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(429) + ) + ); + } + if (x === 435) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(434) + ) + ); + } + if (x === 440) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(439) + ) + ); + } + if (x === 445) { + return React.createElement( + 'div', + {onClick: function () {}, className: '_54_8 _4h2r _2wzx'}, + React.createElement( + 'div', + {className: '_2eq6'}, + null, + AdsPETableHeader141(444) + ) + ); + } + }; + + var FixedDataTableSortableHeader149 = function (x) { + if (x === 342) { + return FixedDataTableAbstractSortableHeader148(341); + } + if (x === 348) { + return FixedDataTableAbstractSortableHeader148(347); + } + if (x === 354) { + return FixedDataTableAbstractSortableHeader148(353); + } + if (x === 359) { + return FixedDataTableAbstractSortableHeader148(358); + } + if (x === 364) { + return FixedDataTableAbstractSortableHeader148(363); + } + if (x === 371) { + return FixedDataTableAbstractSortableHeader148(370); + } + if (x === 376) { + return FixedDataTableAbstractSortableHeader148(375); + } + if (x === 381) { + return FixedDataTableAbstractSortableHeader148(380); + } + if (x === 386) { + return FixedDataTableAbstractSortableHeader148(385); + } + if (x === 391) { + return FixedDataTableAbstractSortableHeader148(390); + } + if (x === 396) { + return FixedDataTableAbstractSortableHeader148(395); + } + if (x === 401) { + return FixedDataTableAbstractSortableHeader148(400); + } + if (x === 406) { + return FixedDataTableAbstractSortableHeader148(405); + } + if (x === 411) { + return FixedDataTableAbstractSortableHeader148(410); + } + if (x === 416) { + return FixedDataTableAbstractSortableHeader148(415); + } + if (x === 421) { + return FixedDataTableAbstractSortableHeader148(420); + } + if (x === 426) { + return FixedDataTableAbstractSortableHeader148(425); + } + if (x === 431) { + return FixedDataTableAbstractSortableHeader148(430); + } + if (x === 436) { + return FixedDataTableAbstractSortableHeader148(435); + } + if (x === 441) { + return FixedDataTableAbstractSortableHeader148(440); + } + if (x === 446) { + return FixedDataTableAbstractSortableHeader148(445); + } + }; + + var FixedDataTableBufferedRows150 = function (x) { + if (x === 459) { + return React.createElement('div', { + style: { + position: 'absolute', + pointerEvents: 'auto', + transform: 'translate3d(0px,65px,0)', + backfaceVisibility: 'hidden', + }, + }); + } + }; + + var Scrollbar151 = function (x) { + if (x === 460) { + return null; + } + if (x === 461) { + return React.createElement( + 'div', + { + onFocus: function () {}, + onBlur: function () {}, + onKeyDown: function () {}, + onMouseDown: function () {}, + onWheel: function () {}, + className: '_1t0r _1t0t _4jdr _1t0u', + style: {width: 1209, zIndex: 99}, + tabIndex: 0, + }, + React.createElement('div', { + className: '_1t0w _1t0y _1t0_', + style: { + width: 561.6340607950117, + transform: 'translate3d(4px,0px,0)', + backfaceVisibility: 'hidden', + }, + }) + ); + } + }; + + var HorizontalScrollbar152 = function (x) { + if (x === 462) { + return React.createElement( + 'div', + {className: '_3h1k _3h1m', style: {height: 15, width: 1209}}, + React.createElement( + 'div', + { + style: { + height: 15, + position: 'absolute', + overflow: 'hidden', + width: 1209, + transform: 'translate3d(0px,0px,0)', + backfaceVisibility: 'hidden', + }, + }, + Scrollbar151(461) + ) + ); + } + }; + + var FixedDataTable153 = function (x) { + if (x === 463) { + return React.createElement( + 'div', + { + className: '_3h1i _1mie', + onWheel: function () {}, + style: {height: 25, width: 1209}, + }, + React.createElement( + 'div', + {className: '_3h1j', style: {height: 8, width: 1209}}, + FixedDataTableColumnResizeHandle140(313), + FixedDataTableRow147(335), + FixedDataTableRow147(458), + FixedDataTableBufferedRows150(459), + null, + undefined, + React.createElement('div', { + className: '_3h1e _3h1h', + style: {top: 8}, + }) + ), + Scrollbar151(460), + HorizontalScrollbar152(462) + ); + } + }; + + var TransitionTable154 = function (x) { + if (x === 464) { + return FixedDataTable153(463); + } + }; + + var AdsSelectableFixedDataTable155 = function (x) { + if (x === 465) { + return React.createElement( + 'div', + {className: '_5hht'}, + TransitionTable154(464) + ); + } + }; + + var AdsDataTableKeyboardSupportDecorator156 = function (x) { + if (x === 466) { + return React.createElement( + 'div', + {className: '_5d6f', tabIndex: '0', onKeyDown: function () {}}, + AdsSelectableFixedDataTable155(465) + ); + } + }; + + var AdsEditableDataTableDecorator157 = function (x) { + if (x === 467) { + return React.createElement( + 'div', + {onCopy: function () {}}, + AdsDataTableKeyboardSupportDecorator156(466) + ); + } + }; + + var AdsPEDataTableContainer158 = function (x) { + if (x === 468) { + return React.createElement( + 'div', + {className: '_35l_ _1hr clearfix'}, + null, + null, + null, + AdsEditableDataTableDecorator157(467) + ); + } + }; + + var AdsPECampaignGroupTableContainer159 = function (x) { + if (x === 470) { + return ResponsiveBlock37(469); + } + }; + + var AdsPEManageAdsPaneContainer160 = function (x) { + if (x === 473) { + return React.createElement( + 'div', + null, + AdsErrorBoundary10(65), + React.createElement( + 'div', + {className: '_2uty'}, + AdsErrorBoundary10(125) + ), + React.createElement( + 'div', + {className: '_2utx _21oc'}, + AdsErrorBoundary10(171), + React.createElement( + 'div', + {className: '_41tu'}, + AdsErrorBoundary10(176), + AdsErrorBoundary10(194) + ) + ), + React.createElement( + 'div', + {className: '_2utz', style: {height: 25}}, + AdsErrorBoundary10(302), + React.createElement( + 'div', + {className: '_2ut-'}, + AdsErrorBoundary10(312) + ), + React.createElement( + 'div', + {className: '_2ut_'}, + AdsErrorBoundary10(472) + ) + ) + ); + } + }; + + var AdsPEContentContainer161 = function (x) { + if (x === 474) { + return AdsPEManageAdsPaneContainer160(473); + } + }; + + var FluxContainer_AdsPEWorkspaceContainer_162 = function (x) { + if (x === 477) { + return React.createElement( + 'div', + {className: '_49wu', style: {height: 177, top: 43, width: 1306}}, + ResponsiveBlock37(62, '0'), + AdsErrorBoundary10(476, '1'), + null + ); + } + }; + + var FluxContainer_AdsSessionExpiredDialogContainer_163 = function (x) { + if (x === 478) { + return null; + } + }; + + var FluxContainer_AdsPEUploadDialogLazyContainer_164 = function (x) { + if (x === 479) { + return null; + } + }; + + var FluxContainer_DialogContainer_165 = function (x) { + if (x === 480) { + return null; + } + }; + + var AdsBugReportContainer166 = function (x) { + if (x === 481) { + return React.createElement('span', null); + } + }; + + var AdsPEAudienceSplittingDialog167 = function (x) { + if (x === 482) { + return null; + } + }; + + var AdsPEAudienceSplittingDialogContainer168 = function (x) { + if (x === 483) { + return React.createElement( + 'div', + null, + AdsPEAudienceSplittingDialog167(482) + ); + } + }; + + var FluxContainer_AdsRuleDialogBootloadContainer_169 = function (x) { + if (x === 484) { + return null; + } + }; + + var FluxContainer_AdsPECFTrayContainer_170 = function (x) { + if (x === 485) { + return null; + } + }; + + var FluxContainer_AdsPEDeleteDraftContainer_171 = function (x) { + if (x === 486) { + return null; + } + }; + + var FluxContainer_AdsPEInitialDraftPublishDialogContainer_172 = function (x) { + if (x === 487) { + return null; + } + }; + + var FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173 = + function (x) { + if (x === 488) { + return null; + } + }; + + var FluxContainer_AdsPEPurgeArchiveDialogContainer_174 = function (x) { + if (x === 489) { + return null; + } + }; + + var AdsPECreateDialogContainer175 = function (x) { + if (x === 490) { + return React.createElement('span', null); + } + }; + + var FluxContainer_AdsPEModalStatusContainer_176 = function (x) { + if (x === 491) { + return null; + } + }; + + var FluxContainer_AdsBrowserExtensionErrorDialogContainer_177 = function (x) { + if (x === 492) { + return null; + } + }; + + var FluxContainer_AdsPESortByErrorTipContainer_178 = function (x) { + if (x === 493) { + return null; + } + }; + + var LeadDownloadDialogSelector179 = function (x) { + if (x === 494) { + return null; + } + }; + + var FluxContainer_AdsPELeadDownloadDialogContainerClass_180 = function (x) { + if (x === 495) { + return LeadDownloadDialogSelector179(494); + } + }; + + var AdsPEContainer181 = function (x) { + if (x === 496) { + return React.createElement( + 'div', + {id: 'ads_pe_container'}, + FluxContainer_AdsPETopNavContainer_26(41), + null, + FluxContainer_AdsPEWorkspaceContainer_162(477), + FluxContainer_AdsSessionExpiredDialogContainer_163(478), + FluxContainer_AdsPEUploadDialogLazyContainer_164(479), + FluxContainer_DialogContainer_165(480), + AdsBugReportContainer166(481), + AdsPEAudienceSplittingDialogContainer168(483), + FluxContainer_AdsRuleDialogBootloadContainer_169(484), + FluxContainer_AdsPECFTrayContainer_170(485), + React.createElement( + 'span', + null, + FluxContainer_AdsPEDeleteDraftContainer_171(486), + FluxContainer_AdsPEInitialDraftPublishDialogContainer_172(487), + FluxContainer_AdsPEReachFrequencyStatusTransitionDialogBootloadContainer_173( + 488 + ) + ), + FluxContainer_AdsPEPurgeArchiveDialogContainer_174(489), + AdsPECreateDialogContainer175(490), + FluxContainer_AdsPEModalStatusContainer_176(491), + FluxContainer_AdsBrowserExtensionErrorDialogContainer_177(492), + FluxContainer_AdsPESortByErrorTipContainer_178(493), + FluxContainer_AdsPELeadDownloadDialogContainerClass_180(495), + React.createElement('div', {id: 'web_ads_guidance_tips'}) + ); + } + }; + + var Benchmark = function (x) { + if (x === undefined) { + return AdsPEContainer181(496); + } + }; + + var app = document.getElementById('app'); + + window.render = function render() { + ReactDOM.render(Benchmark(), app); + }; +})(); diff --git a/scripts/bench/benchmarks/pe-no-components/build.js b/scripts/bench/benchmarks/pe-no-components/build.js new file mode 100644 index 00000000000..ffbd82637d2 --- /dev/null +++ b/scripts/bench/benchmarks/pe-no-components/build.js @@ -0,0 +1,17 @@ +'use strict'; + +const {join} = require('path'); + +async function build(reactPath, asyncCopyTo) { + // copy the UMD bundles + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react.production.js'), + join(__dirname, 'react.production.js') + ); + await asyncCopyTo( + join(reactPath, 'build', 'dist', 'react-dom.production.js'), + join(__dirname, 'react-dom.production.js') + ); +} + +module.exports = build; diff --git a/scripts/bench/benchmarks/pe-no-components/index.html b/scripts/bench/benchmarks/pe-no-components/index.html new file mode 100644 index 00000000000..c2d44dcd00b --- /dev/null +++ b/scripts/bench/benchmarks/pe-no-components/index.html @@ -0,0 +1,32 @@ + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/scripts/bench/build.js b/scripts/bench/build.js new file mode 100644 index 00000000000..9c10379a0eb --- /dev/null +++ b/scripts/bench/build.js @@ -0,0 +1,122 @@ +'use strict'; + +const Git = require('nodegit'); +const rimraf = require('rimraf'); +const ncp = require('ncp').ncp; +const {existsSync} = require('fs'); +const exec = require('child_process').exec; +const {join} = require('path'); + +const reactUrl = 'https://github.com/facebook/react.git'; + +function cleanDir() { + return new Promise(_resolve => rimraf('remote-repo', _resolve)); +} + +function executeCommand(command) { + return new Promise(_resolve => + exec(command, error => { + if (!error) { + _resolve(); + } else { + console.error(error); + process.exit(1); + } + }) + ); +} + +function asyncCopyTo(from, to) { + return new Promise(_resolve => { + ncp(from, to, error => { + if (error) { + console.error(error); + process.exit(1); + } + _resolve(); + }); + }); +} + +function getDefaultReactPath() { + return join(__dirname, 'remote-repo'); +} + +async function buildBenchmark(reactPath = getDefaultReactPath(), benchmark) { + // get the build.js from the benchmark directory and execute it + await require(join(__dirname, 'benchmarks', benchmark, 'build.js'))( + reactPath, + asyncCopyTo + ); +} + +async function getMergeBaseFromLocalGitRepo(localRepo) { + const repo = await Git.Repository.open(localRepo); + return await Git.Merge.base( + repo, + await repo.getHeadCommit(), + await repo.getBranchCommit('main') + ); +} + +async function buildBenchmarkBundlesFromGitRepo( + commitId, + skipBuild, + url = reactUrl, + clean +) { + let repo; + const remoteRepoDir = getDefaultReactPath(); + + if (!skipBuild) { + if (clean) { + //clear remote-repo folder + await cleanDir(remoteRepoDir); + } + // check if remote-repo directory already exists + if (existsSync(remoteRepoDir)) { + repo = await Git.Repository.open(remoteRepoDir); + // fetch all the latest remote changes + await repo.fetchAll(); + } else { + // if not, clone the repo to remote-repo folder + repo = await Git.Clone(url, remoteRepoDir); + } + let commit = await repo.getBranchCommit('main'); + // reset hard to this remote head + await Git.Reset.reset(repo, commit, Git.Reset.TYPE.HARD); + // then we checkout the latest main head + await repo.checkoutBranch('main'); + // make sure we pull in the latest changes + await repo.mergeBranches('main', 'origin/main'); + // then we check if we need to move the HEAD to the merge base + if (commitId && commitId !== 'main') { + // as the commitId probably came from our local repo + // we use it to lookup the right commit in our remote repo + commit = await Git.Commit.lookup(repo, commitId); + // then we checkout the merge base + await Git.Checkout.tree(repo, commit); + } + await buildReactBundles(); + } +} + +async function buildReactBundles(reactPath = getDefaultReactPath(), skipBuild) { + if (!skipBuild) { + await executeCommand( + `cd ${reactPath} && yarn && yarn build react/index,react-dom/index --type=UMD_PROD` + ); + } +} + +// if run directly via CLI +if (require.main === module) { + buildBenchmarkBundlesFromGitRepo(); +} + +module.exports = { + buildReactBundles, + buildBenchmark, + buildBenchmarkBundlesFromGitRepo, + getMergeBaseFromLocalGitRepo, +}; diff --git a/scripts/bench/extract-component.js b/scripts/bench/extract-component.js deleted file mode 100644 index 9cfab989ccc..00000000000 --- a/scripts/bench/extract-component.js +++ /dev/null @@ -1,207 +0,0 @@ -/*global copy */ -/*eslint-disable no-debugger */ - -// Copy and paste this file into your (Chrome) browser console after changing -// the React root ID. Works on facebook.com as of 7/6/16 (use a test user). -// Then run this to convert the JSX: -// -// ../../node_modules/.bin/babel \ -// --presets ../../node_modules/babel-preset-react \ -// --no-babelrc --compact=false \ -// bench-foo.js -o bench-foo-es5.js - -'use strict'; - -var rootID = 5; -var outputStatelessFunctional = false; - -var React = require('React'); -var ReactMount = require('ReactMount'); -copy(print(ReactMount._instancesByReactRootID[rootID]._renderedComponent)); - -function elementMeta(element) { - var meta = ''; - var key = element.key; - if (key) { - meta += ' key={' + JSON.stringify(key) + '}'; - } - var ref = element.ref; - if (typeof ref === 'string') { - meta += ' ref={' + JSON.stringify(ref) + '}'; - } else if (typeof ref === 'function') { - meta += ' ref={function() {}}'; - } - return meta; -} - -function print(outerComponent) { - var typeCounter = 0; - var elementCounter = 0; - var composites = new Map(); - - function addComposite(type, child) { - var info = composites.get(type); - if (!info) { - var name = (type.displayName || type.name || 'Component').replace(/(?:^[^a-z]|\W)+/gi, '_') + typeCounter++; - if (!/^[A-Z]/.test(name)) { - name = '_' + name; - } - info = {name: name, values: new Map()}; - composites.set(type, info); - } - var c = elementCounter++; - info.values.set(c, child); - return '<' + info.name + ' x={' + c + '} />'; - } - - function printComposite(info) { - if (outputStatelessFunctional) { - output += 'var ' + info.name + ' = function(props) {\n'; - } else { - output += 'var ' + info.name + ' = React.createClass({\n'; - output += ' render: function() {\n'; - output += ' var props = this.props;\n'; - } - for (var [c, child] of info.values) { - output += ' if (props.x === ' + c + ') {\n'; - if (child.indexOf('\n') !== -1) { - output += ' return (\n'; - output += child.replace(/^|\n/g, '$& ') + '\n'; - output += ' );\n'; - } else { - output += ' return ' + child + ';\n'; - } - output += ' }\n'; - } - if (outputStatelessFunctional) { - output += '};\n'; - } else { - output += ' },\n'; - output += '});\n'; - } - output += '\n'; - } - - function printImpl(component) { - var element = component._currentElement; - - // Empty component - if (element === null || element === false) { - return '' + element; - } - - // Text component - if (typeof element === 'string' || typeof element === 'number') { - return JSON.stringify(element); - } - - // Composite component - if (typeof element.type === 'function') { - var rendered = printImpl(component._renderedComponent); - return addComposite(component._currentElement.type, rendered) - .replace(/(?= \/>$)/, elementMeta(component._currentElement)); - } - - // Native component - if (typeof element.type === 'string') { - var markup = '<' + element.type; - markup += elementMeta(component._currentElement); - for (var propKey in element.props) { - var value = element.props[propKey]; - var valueString = null; - if (propKey === 'style' || propKey === 'dangerouslySetInnerHTML') { - valueString = JSON.stringify(value); - } else if (propKey === 'children') { - } else { - if (typeof value === 'function') { - valueString = 'function() {}'; - } else if (typeof value === 'string' || typeof value === 'number') { - valueString = JSON.stringify(value); - } else if (value == null || typeof value === 'boolean') { - valueString = '' + value; - } else if (typeof value === 'object') { - valueString = '{}'; - console.log('smooshing', element.type, propKey, value); - } else { - debugger; - throw new Error('huh? ' + typeof value + ' ' + value); - } - } - if (valueString) { - markup += ' ' + propKey + '={' + valueString + '}'; - } - } - markup += '>'; - - if ( - typeof element.props.children === 'string' || - typeof element.props.children === 'number' - ) { - markup += '{' + JSON.stringify(element.props.children) + '}'; - } else if (component._renderedChildren) { - var renderedChildren = component._renderedChildren; - var keys = Object.keys(renderedChildren); - var values = keys.map((childKey) => renderedChildren[childKey]); - - if (keys.length) { - var dump = function(children) { - if (typeof children === 'boolean' || children == null) { - return '' + children; - } - if (typeof children === 'object' && !Array.isArray(children) && children[Symbol.iterator]) { - // TODO: Not quite right. - children = Array.from(children); - } - if (Array.isArray(children)) { - return children.length ? ( - '[\n' + - children.map(function(ch) { - return ' ' + dump(ch).replace(/\n/g, '$& ') + ',\n'; - }).join('') + - ']' - ) : '[]'; - } else if (React.isValidElement(children) || typeof children === 'string' || typeof children === 'number') { - return printImpl(values.shift()); - } else { - debugger; - throw new Error('hmm'); - } - }; - - markup += '\n'; - var children = element.props.children; - children = Array.isArray(children) ? children : [children]; - children.forEach(function(child) { - var dumped = dump(child).replace(/\n/g, '$& '); - if (dumped.charAt(0) === '<') { - markup += ' ' + dumped + '\n'; - } else { - markup += ' {' + dumped + '}\n'; - } - }); - if (values.length !== 0) { - debugger; - throw new Error('not all children processed'); - } - } - } - - markup += ''; - return markup; - } - - debugger; - throw new Error('hmm'); - } - - var output = '(function() {\n\n'; - - var tail = printImpl(outerComponent); - for (var info of composites.values()) { - printComposite(info); - } - printComposite({name: 'Benchmark', values: new Map([[undefined, tail]])}); - output += 'this.Benchmark = Benchmark;\n'; - output += '\n})(this);\n'; - return output; -} diff --git a/scripts/bench/measure.py b/scripts/bench/measure.py deleted file mode 100755 index 613cb98e4e1..00000000000 --- a/scripts/bench/measure.py +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env python -# Copyright 2015-present, Facebook, Inc. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. An additional grant -# of patent rights can be found in the PATENTS file in the same directory. - -import functools -import json -import os -import random -import subprocess -import sys - - -def _run_js_in_jsc(jit, js, env): - return subprocess.check_output( - ['jsc', '-e', """ - function now() { - return preciseTime() * 1000; - } - function globalEval(code) { - (0, eval)(code); - } - function report(label, time) { - print(label + '_' + %(engine)s, time); - } - - this.ENV = %(env)s; - %(js)s - """ % { - 'env': json.dumps(env), - 'js': js, - 'engine': json.dumps('jsc_' + ('jit' if jit else 'nojit')), - }], - env=dict(os.environ, JSC_useJIT='yes' if jit else 'no'), - ) - -_run_js_in_jsc_jit = functools.partial(_run_js_in_jsc, True) -_run_js_in_jsc_nojit = functools.partial(_run_js_in_jsc, False) - - -def _run_js_in_node(js, env): - return subprocess.check_output( - ['node', '-e', """ - function now() { - var hrTime = process.hrtime(); - return hrTime[0] * 1e3 + hrTime[1] * 1e-6; - } - function globalEval(code) { - var vm = require('vm'); - // Hide "module" so UMD wrappers use the global - vm.runInThisContext('(function(module){' + code + '\\n})()'); - } - function readFile(filename) { - var fs = require('fs'); - return fs.readFileSync(filename); - } - function report(label, time) { - console.log(label + '_node', time); - } - - global.ENV = %(env)s; - %(js)s - """ % { - 'env': json.dumps(env), - 'js': js - }] - ) - - -def _measure_ssr_ms(engine, react_path, bench_name, bench_path, measure_warm): - return engine( - """ - var reactCode = readFile(ENV.react_path + '/react.min.js'); - var reactDOMServerCode = readFile(ENV.react_path + '/react-dom-server.min.js'); - var START = now(); - globalEval(reactCode); - globalEval(reactDOMServerCode); - var END = now(); - if (typeof React !== 'object') throw new Error('React not loaded'); - if (typeof ReactDOMServer !== 'object') throw new Error('ReactDOMServer not loaded'); - report('factory_ms', END - START); - - globalEval(readFile(ENV.bench_path)); - if (typeof Benchmark !== 'function') { - throw new Error('benchmark not loaded'); - } - var START = now(); - var html = ReactDOMServer.renderToString(React.createElement(Benchmark)); - html.charCodeAt(0); // flatten ropes - var END = now(); - report('ssr_' + ENV.bench_name + '_cold_ms', END - START); - - var warmup = ENV.measure_warm ? 80 : 0; - var trials = ENV.measure_warm ? 40 : 0; - - for (var i = 0; i < warmup; i++) { - ReactDOMServer.renderToString(React.createElement(Benchmark)); - } - - for (var i = 0; i < trials; i++) { - var START = now(); - var html = ReactDOMServer.renderToString(React.createElement(Benchmark)); - html.charCodeAt(0); // flatten ropes - var END = now(); - report('ssr_' + ENV.bench_name + '_warm_ms', END - START); - } - """, - { - 'bench_name': bench_name, - 'bench_path': bench_path, - 'measure_warm': measure_warm, - 'react_path': react_path, - }, - ) - - -def _main(): - if len(sys.argv) < 2 or len(sys.argv) % 2 == 0: - sys.stderr.write("usage: measure.py build-folder-a a.txt build-folder-b b.txt\n") - return 1 - # [(react_path, out_path)] - react_paths = sys.argv[1::2] - files = [open(out_path, 'w') for out_path in sys.argv[2::2]] - - trials = 30 - sys.stderr.write("Measuring SSR for PE benchmark (%d trials)\n" % trials) - sys.stderr.write("_" * trials + "\n") - for i in range(trials): - for engine in [ - _run_js_in_jsc_jit, - _run_js_in_jsc_nojit, - _run_js_in_node - ]: - engines = range(len(react_paths)) - random.shuffle(engines) - for i in engines: - out = _measure_ssr_ms(engine, react_paths[i], 'pe', 'bench-pe-es5.js', False) - files[i].write(out) - sys.stderr.write(".") - sys.stderr.flush() - sys.stderr.write("\n") - sys.stderr.flush() - - # You can set this to a number of trials you want to do with warm JIT. - # They are disabled by default because they are slower. - trials = 0 - - sys.stderr.write("Measuring SSR for PE with warm JIT (%d slow trials)\n" % trials) - sys.stderr.write("_" * trials + "\n") - for i in range(trials): - for engine in [ - _run_js_in_jsc_jit, - _run_js_in_jsc_nojit, - _run_js_in_node - ]: - engines = range(len(react_paths)) - random.shuffle(engines) - for i in engines: - out = _measure_ssr_ms(engine, react_paths[i], 'pe', 'bench-pe-es5.js', True) - files[i].write(out) - sys.stderr.write(".") - sys.stderr.flush() - sys.stderr.write("\n") - sys.stderr.flush() - - for f in files: - f.close() - - -if __name__ == '__main__': - sys.exit(_main()) - diff --git a/scripts/bench/package.json b/scripts/bench/package.json new file mode 100644 index 00000000000..5372942c58b --- /dev/null +++ b/scripts/bench/package.json @@ -0,0 +1,22 @@ +{ + "name": "react-benchmark", + "version": "0.0.1", + "main": "runner.js", + "scripts": { + "start": "node runner.js" + }, + "dependencies": { + "chalk": "^2.1.0", + "chrome-launcher": "^0.10.5", + "cli-table": "^0.3.1", + "http-server": "^0.10.0", + "http2": "^3.3.6", + "lighthouse": "^3.2.1", + "mime": "^1.3.6", + "minimist": "^1.2.3", + "ncp": "^2.0.0", + "nodegit": "^0.18.3", + "rimraf": "^2.6.1", + "stats-analysis": "^2.0.0" + } +} diff --git a/scripts/bench/runner.js b/scripts/bench/runner.js new file mode 100644 index 00000000000..922e914d4ea --- /dev/null +++ b/scripts/bench/runner.js @@ -0,0 +1,135 @@ +'use strict'; + +const {readdirSync, statSync} = require('fs'); +const {join} = require('path'); +const runBenchmark = require('./benchmark'); +const { + buildReactBundles, + buildBenchmark, + buildBenchmarkBundlesFromGitRepo, + getMergeBaseFromLocalGitRepo, +} = require('./build'); +const argv = require('minimist')(process.argv.slice(2)); +const chalk = require('chalk'); +const printResults = require('./stats'); +const serveBenchmark = require('./server'); + +function getBenchmarkNames() { + return readdirSync(join(__dirname, 'benchmarks')).filter(file => + statSync(join(__dirname, 'benchmarks', file)).isDirectory() + ); +} + +function wait(val) { + return new Promise(resolve => setTimeout(resolve, val)); +} + +const runRemote = argv.remote; +const runLocal = argv.local; +const benchmarkFilter = argv.benchmark; +const headless = argv.headless; +const skipBuild = argv['skip-build']; + +async function runBenchmarks(reactPath) { + const benchmarkNames = getBenchmarkNames(); + const results = {}; + const server = serveBenchmark(); + await wait(1000); + + for (let i = 0; i < benchmarkNames.length; i++) { + const benchmarkName = benchmarkNames[i]; + + if ( + !benchmarkFilter || + (benchmarkFilter && benchmarkName.indexOf(benchmarkFilter) !== -1) + ) { + console.log( + chalk.gray(`- Building benchmark "${chalk.white(benchmarkName)}"...`) + ); + await buildBenchmark(reactPath, benchmarkName); + console.log( + chalk.gray(`- Running benchmark "${chalk.white(benchmarkName)}"...`) + ); + results[benchmarkName] = await runBenchmark(benchmarkName, headless); + } + } + + server.close(); + // http-server.close() is async but they don't provide a callback.. + await wait(500); + return results; +} + +// get the performance benchmark results +// from remote main (default React repo) +async function benchmarkRemoteMaster() { + console.log(chalk.gray(`- Building React bundles...`)); + let commit = argv.remote; + + if (!commit || typeof commit !== 'string') { + commit = await getMergeBaseFromLocalGitRepo(join(__dirname, '..', '..')); + console.log( + chalk.gray(`- Merge base commit ${chalk.white(commit.tostrS())}`) + ); + } + await buildBenchmarkBundlesFromGitRepo(commit, skipBuild); + return { + benchmarks: await runBenchmarks(), + }; +} + +// get the performance benchmark results +// of the local react repo +async function benchmarkLocal(reactPath) { + console.log(chalk.gray(`- Building React bundles...`)); + await buildReactBundles(reactPath, skipBuild); + return { + benchmarks: await runBenchmarks(reactPath), + }; +} + +async function runLocalBenchmarks(showResults) { + console.log( + chalk.white.bold('Running benchmarks for ') + + chalk.green.bold('Local (Current Branch)') + ); + const localResults = await benchmarkLocal(join(__dirname, '..', '..')); + + if (showResults) { + printResults(localResults, null); + } + return localResults; +} + +async function runRemoteBenchmarks(showResults) { + console.log( + chalk.white.bold('Running benchmarks for ') + + chalk.yellow.bold('Remote (Merge Base)') + ); + const remoteMasterResults = await benchmarkRemoteMaster(); + + if (showResults) { + printResults(null, remoteMasterResults); + } + return remoteMasterResults; +} + +async function compareLocalToMaster() { + console.log( + chalk.white.bold('Comparing ') + + chalk.green.bold('Local (Current Branch)') + + chalk.white.bold(' to ') + + chalk.yellow.bold('Remote (Merge Base)') + ); + const localResults = await runLocalBenchmarks(false); + const remoteMasterResults = await runRemoteBenchmarks(false); + printResults(localResults, remoteMasterResults); +} + +if ((runLocal && runRemote) || (!runLocal && !runRemote)) { + compareLocalToMaster().then(() => process.exit(0)); +} else if (runLocal) { + runLocalBenchmarks(true).then(() => process.exit(0)); +} else if (runRemote) { + runRemoteBenchmarks(true).then(() => process.exit(0)); +} diff --git a/scripts/bench/server.js b/scripts/bench/server.js new file mode 100644 index 00000000000..6bc9dc14cbd --- /dev/null +++ b/scripts/bench/server.js @@ -0,0 +1,78 @@ +'use strict'; + +const http2Server = require('http2'); +const httpServer = require('http-server'); +const {existsSync, statSync, createReadStream} = require('fs'); +const {join} = require('path'); +const argv = require('minimist')(process.argv.slice(2)); +const mime = require('mime'); + +function sendFile(filename, response) { + response.setHeader('Content-Type', mime.lookup(filename)); + response.writeHead(200); + const fileStream = createReadStream(filename); + fileStream.pipe(response); + fileStream.on('finish', response.end); +} + +function createHTTP2Server(benchmark) { + const server = http2Server.createServer({}, (request, response) => { + const filename = join( + __dirname, + 'benchmarks', + benchmark, + request.url + ).replace(/\?.*/g, ''); + + if (existsSync(filename) && statSync(filename).isFile()) { + sendFile(filename, response); + } else { + const indexHtmlPath = join(filename, 'index.html'); + + if (existsSync(indexHtmlPath)) { + sendFile(indexHtmlPath, response); + } else { + response.writeHead(404); + response.end(); + } + } + }); + server.listen(8080); + return server; +} + +function createHTTPServer() { + const server = httpServer.createServer({ + root: join(__dirname, 'benchmarks'), + robots: true, + cache: 'no-store', + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': 'true', + }, + }); + server.listen(8080); + return server; +} + +function serveBenchmark(benchmark, http2) { + if (http2) { + return createHTTP2Server(benchmark); + } else { + return createHTTPServer(); + } +} + +// if run directly via CLI +if (require.main === module) { + const benchmarkInput = argv._[0]; + + if (benchmarkInput) { + serveBenchmark(benchmarkInput); + } else { + console.error('Please specify a benchmark directory to serve!'); + process.exit(1); + } +} + +module.exports = serveBenchmark; diff --git a/scripts/bench/stats.js b/scripts/bench/stats.js new file mode 100644 index 00000000000..9fb5883d832 --- /dev/null +++ b/scripts/bench/stats.js @@ -0,0 +1,112 @@ +'use strict'; + +const chalk = require('chalk'); +const Table = require('cli-table'); + +function percentChange(prev, current, prevSem, currentSem) { + const [mean, sd] = calculateMeanAndSdOfRatioFromDeltaMethod( + prev, + current, + prevSem, + currentSem + ); + const pctChange = +(mean * 100).toFixed(1); + const ci95 = +(100 * 1.96 * sd).toFixed(1); + + const ciInfo = ci95 > 0 ? ` +- ${ci95} %` : ''; + const text = `${pctChange > 0 ? '+' : ''}${pctChange} %${ciInfo}`; + if (pctChange + ci95 < 0) { + return chalk.green(text); + } else if (pctChange - ci95 > 0) { + return chalk.red(text); + } else { + // Statistically insignificant. + return text; + } +} + +function calculateMeanAndSdOfRatioFromDeltaMethod( + meanControl, + meanTest, + semControl, + semTest +) { + const mean = + (meanTest - meanControl) / meanControl - + (Math.pow(semControl, 2) * meanTest) / Math.pow(meanControl, 3); + const variance = + Math.pow(semTest / meanControl, 2) + + Math.pow(semControl * meanTest, 2) / Math.pow(meanControl, 4); + return [mean, Math.sqrt(variance)]; +} + +function addBenchmarkResults(table, localResults, remoteMasterResults) { + const benchmarks = Object.keys( + (localResults && localResults.benchmarks) || + (remoteMasterResults && remoteMasterResults.benchmarks) + ); + benchmarks.forEach(benchmark => { + const rowHeader = [chalk.white.bold(benchmark)]; + if (remoteMasterResults) { + rowHeader.push(chalk.white.bold('Time')); + } + if (localResults) { + rowHeader.push(chalk.white.bold('Time')); + } + if (localResults && remoteMasterResults) { + rowHeader.push(chalk.white.bold('Diff')); + } + table.push(rowHeader); + + const measurements = + (localResults && localResults.benchmarks[benchmark].averages) || + (remoteMasterResults && + remoteMasterResults.benchmarks[benchmark].averages); + measurements.forEach((measurement, i) => { + const row = [chalk.gray(measurement.entry)]; + let remoteMean; + let remoteSem; + if (remoteMasterResults) { + remoteMean = remoteMasterResults.benchmarks[benchmark].averages[i].mean; + remoteSem = remoteMasterResults.benchmarks[benchmark].averages[i].sem; + // https://en.wikipedia.org/wiki/1.96 gives a 99% confidence interval. + const ci95 = remoteSem * 1.96; + row.push( + chalk.white(+remoteMean.toFixed(2) + ' ms +- ' + ci95.toFixed(2)) + ); + } + let localMean; + let localSem; + if (localResults) { + localMean = localResults.benchmarks[benchmark].averages[i].mean; + localSem = localResults.benchmarks[benchmark].averages[i].sem; + const ci95 = localSem * 1.96; + row.push( + chalk.white(+localMean.toFixed(2) + ' ms +- ' + ci95.toFixed(2)) + ); + } + if (localResults && remoteMasterResults) { + row.push(percentChange(remoteMean, localMean, remoteSem, localSem)); + } + table.push(row); + }); + }); +} + +function printResults(localResults, remoteMasterResults) { + const head = ['']; + if (remoteMasterResults) { + head.push(chalk.yellow.bold('Remote (Merge Base)')); + } + if (localResults) { + head.push(chalk.green.bold('Local (Current Branch)')); + } + if (localResults && remoteMasterResults) { + head.push(''); + } + const table = new Table({head}); + addBenchmarkResults(table, localResults, remoteMasterResults); + console.log(table.toString()); +} + +module.exports = printResults; diff --git a/scripts/bench/yarn.lock b/scripts/bench/yarn.lock new file mode 100644 index 00000000000..af003082404 --- /dev/null +++ b/scripts/bench/yarn.lock @@ -0,0 +1,1742 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/core-js@^0.9.41": + version "0.9.46" + resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-0.9.46.tgz#ea701ee34cbb6dfe6d100f1530319547c93c8d79" + integrity sha512-LooLR6XHes9V+kNYRz1Qm8w3atw9QMn7XeZUmIpUelllF9BdryeUKd/u0Wh5ErcjpWfG39NrToU9MF7ngsTFVw== + +"@types/mkdirp@^0.3.29": + version "0.3.29" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" + integrity sha1-fyrX7FX5FEgvybHsS7GuYCjUYGY= + +"@types/node@*": + version "10.12.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" + integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== + +"@types/node@^9.3.0": + version "9.6.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.35.tgz#197dd535c094362a7c95f0b78f07583d6681ed26" + integrity sha512-h5zvHS8wXHGa+Gcqs9K8vqCgOtqjr0+NqG/DDJmQIX1wpR9HivAfgV8bjcD3mGM4bPfQw5Aneb2Pn8355L83jA== + +"@types/rimraf@^0.0.28": + version "0.0.28" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-0.0.28.tgz#5562519bc7963caca8abf7f128cae3b594d41d06" + integrity sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY= + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +axe-core@3.0.0-beta.2: + version "3.0.0-beta.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.0.0-beta.2.tgz#82a13d371268034352bba2bcb263c5625b3e4a09" + integrity sha512-JyMXnHDuzr6hei+mINWsR/iEyPBFSjpgF4/lUijO7QDGVKtTmdpDxc2+7X/xW+rPIwhcd72euJ2UunbRXF+1Eg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boxen@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^1.0.0" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.0.1, chalk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +chrome-devtools-frontend@1.0.401423: + version "1.0.401423" + resolved "https://registry.yarnpkg.com/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.401423.tgz#32a89b8d04e378a494be3c8d63271703be1c04ea" + +chrome-devtools-frontend@1.0.593291: + version "1.0.593291" + resolved "https://registry.yarnpkg.com/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.593291.tgz#72ed2e488e4ab8c5df9f35a5ce6bb128eb3c5e74" + integrity sha512-rZYanFVohRHjYdFdbvmna/9yzA+PMYfjBqXaLfF6SxE9ZnmfuMhItHGqPXrUTvuv1IuqaD1FX51WmTFwa2zfUA== + +chrome-launcher@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.10.5.tgz#d0aa72c11f1653e6a60dfebea171522447470ef1" + integrity sha512-Gbzg8HlWhyuoVqflhiXwfFXhzNfNWvAkSWv2QR1Yl6mwsMo1oCLAVjp2tIySuS4lrZLEjzVx1fOy584yE76P4g== + dependencies: + "@types/core-js" "^0.9.41" + "@types/mkdirp" "^0.3.29" + "@types/node" "^9.3.0" + "@types/rimraf" "^0.0.28" + is-wsl "^1.1.0" + lighthouse-logger "^1.0.0" + mkdirp "0.5.1" + rimraf "^2.6.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +configstore@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +corser@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +cssom@0.3.x: + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" + integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== + +cssstyle@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@^2.2.0: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +devtools-timeline-model@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/devtools-timeline-model/-/devtools-timeline-model-1.1.6.tgz#7be51a73b55d727b597bb30dd1ed2e8e210639a5" + dependencies: + chrome-devtools-frontend "1.0.401423" + resolve "1.1.7" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecstatic@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.2.2.tgz#1c7969b7a8893a04852e9373edeeb1d62809d393" + integrity sha512-F1g29y3I+abOS+M0AiK2O9R96AJ49Bc3kH696HtqnN+CL3YhpUnSzHNoUBQL03qDsN9Lr1XeKIxTqEH3BtiBgg== + dependencies: + he "^1.1.1" + mime "^1.2.11" + minimist "^1.1.0" + url-join "^2.0.2" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fs-extra@~0.26.2: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob@^7.0.3, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +http-link-header@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-0.8.0.tgz#a22b41a0c9b1e2d8fac1bf1b697c6bd532d5f5e4" + integrity sha1-oitBoMmx4tj6wb8baXxr1TLV9eQ= + +http-proxy@^1.8.1: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-server@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.10.0.tgz#b2a446b16a9db87ed3c622ba9beb1b085b1234a7" + dependencies: + colors "1.0.3" + corser "~2.0.0" + ecstatic "^2.0.0" + http-proxy "^1.8.1" + opener "~1.4.0" + optimist "0.6.x" + portfinder "^1.0.13" + union "~0.4.3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/http2/-/http2-3.3.6.tgz#7df06227e02b5b5a5841deea08239b3198d04bec" + +iconv-lite@^0.4.17: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +image-ssim@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/image-ssim/-/image-ssim-0.2.0.tgz#83b42c7a2e6e4b85505477fe6917f5dbc56420e5" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +intl-messageformat-parser@1.4.0, intl-messageformat-parser@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" + integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= + +intl-messageformat@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz#345bcd46de630b7683330c2e52177ff5eab484fc" + integrity sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw= + dependencies: + intl-messageformat-parser "1.4.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jpeg-js@0.1.2, jpeg-js@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.1.2.tgz#135b992c0575c985cfa0f494a3227ed238583ece" + +js-library-detector@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/js-library-detector/-/js-library-detector-5.1.0.tgz#1e2e88b119bb91e6581b28f4a90018ea1320de73" + integrity sha512-EIBFkV6/3PFoTp3V7BjuPTPuc8/2wjPMyI5A0t2eicZ/RhXHBYnWzb+E3Ai2H8kVW/N+a+pYMyWqVcV3CBCtzw== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lighthouse-logger@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz#b76d56935e9c137e86a04741f6bb9b2776e886ca" + integrity sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw== + dependencies: + debug "^2.6.8" + marky "^1.2.0" + +lighthouse@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/lighthouse/-/lighthouse-3.2.1.tgz#90681c9eb8b5dea41a2569e3d4bafdbd4292c97f" + integrity sha512-zoL0wc9gj8TJhhY1oHwO62E4bAj3LL+5YPCEgCU+sepextiynt11mXDjQcBXpTeDI195zIuk3CjEnppbq/kW5Q== + dependencies: + axe-core "3.0.0-beta.2" + chrome-devtools-frontend "1.0.593291" + chrome-launcher "^0.10.5" + configstore "^3.1.1" + cssstyle "1.1.1" + devtools-timeline-model "1.1.6" + esprima "^4.0.1" + http-link-header "^0.8.0" + inquirer "^3.3.0" + intl-messageformat "^2.2.0" + intl-messageformat-parser "^1.4.0" + jpeg-js "0.1.2" + js-library-detector "^5.1.0" + lighthouse-logger "^1.0.0" + lodash.isequal "^4.5.0" + lookup-closest-locale "6.0.4" + metaviewport-parser "0.2.0" + mkdirp "0.5.1" + opn "4.0.2" + parse-cache-control "1.0.1" + raven "^2.2.1" + rimraf "^2.6.1" + robots-parser "^2.0.1" + semver "^5.3.0" + speedline-core "1.4.2" + update-notifier "^2.1.0" + ws "3.3.2" + yargs "3.32.0" + yargs-parser "7.0.0" + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash@^4.13.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@^4.3.0: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +lookup-closest-locale@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/lookup-closest-locale/-/lookup-closest-locale-6.0.4.tgz#1279fed7546a601647bbc980f64423ee990a8590" + integrity sha512-bWoFbSGe6f1GvMGzj17LrwMX4FhDXDwZyH04ySVCPbtOJADcSRguZNKewoJ3Ful/MOxD/wRHvFPadk/kYZUbuQ== + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + +marky@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.0.tgz#9617ed647bbbea8f45d19526da33dec70606df42" + integrity sha1-lhftZHu76o9F0ZUm2jPexwYG30I= + +md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +metaviewport-parser@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz#535c3ce1ccf6223a5025fddc6a1c36505f7e7db1" + integrity sha1-U1w84cz2IjpQJf3cahw2UF9+fbE= + +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" + dependencies: + mime-db "~1.29.0" + +mime@^1.2.11, mime@^1.3.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.2.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +ncp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + +node-gyp@^3.5.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-pre-gyp@~0.6.32: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nodegit-promise@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/nodegit-promise/-/nodegit-promise-4.0.0.tgz#5722b184f2df7327161064a791d2e842c9167b34" + dependencies: + asap "~2.0.3" + +nodegit@^0.18.3: + version "0.18.3" + resolved "https://registry.yarnpkg.com/nodegit/-/nodegit-0.18.3.tgz#305b6a305ea485fe5f1679fe37e6224a669ae9fc" + dependencies: + fs-extra "~0.26.2" + lodash "^4.13.1" + nan "^2.2.0" + node-gyp "^3.5.0" + node-pre-gyp "~0.6.32" + promisify-node "~0.3.0" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opener@~1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +optimist@0.6.x: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-cache-control@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + integrity sha1-juqz5U+laSD+Fro493+iGqzC104= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +portfinder@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +promisify-node@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promisify-node/-/promisify-node-0.3.0.tgz#b4b55acf90faa7d2b8b90ca396899086c03060cf" + dependencies: + nodegit-promise "~4.0.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +raven@^2.2.1: + version "2.6.4" + resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" + integrity sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw== + dependencies: + cookie "0.3.1" + md5 "^2.2.1" + stack-trace "0.0.10" + timed-out "4.0.1" + uuid "3.3.2" + +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +request@2, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +robots-parser@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/robots-parser/-/robots-parser-2.1.0.tgz#d16b78ce34e861ab6afbbf0aac65974dbe01566e" + integrity sha512-k07MeDS1Tl1zjoYs5bHfUbgQ0MfaeTOepDcjZFxdYXd84p6IeLDQyUwlMk2AZ9c2yExA30I3ayWhmqz9tg0DzQ== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +speedline-core@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/speedline-core/-/speedline-core-1.4.2.tgz#bb061444a218d67b4cd52f63a262386197b90c8a" + integrity sha512-9/5CApkKKl6bS6jJ2D0DQllwz/1xq3cyJCR6DLgAQnkj5djCuq8NbflEdD2TI01p8qzS9qaKjzxM9cHT11ezmg== + dependencies: + "@types/node" "*" + image-ssim "^0.2.0" + jpeg-js "^0.1.2" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +stats-analysis@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stats-analysis/-/stats-analysis-2.0.0.tgz#f45c516ff5c5d26c26f2d8c7b3d57592802d6187" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.0.0, tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@4.0.1, timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +union@~0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" + dependencies: + qs "~2.3.3" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +update-notifier@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +url-join@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" + integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@1, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +ws@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.2.tgz#96c1d08b3fefda1d5c1e33700d3bfaa9be2d5608" + integrity sha512-t+WGpsNxhMR4v6EClXS8r8km5ZljKJzyGhJf7goJz9k5Ye3+b5Bvno5rjqPuIBn5mnn5GBb7o8IrIWHxX1qOLQ== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= + dependencies: + camelcase "^4.1.0" + +yargs@3.32.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" diff --git a/scripts/ci/check_license.sh b/scripts/ci/check_license.sh new file mode 100755 index 00000000000..697f390b096 --- /dev/null +++ b/scripts/ci/check_license.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -e + +# Make sure we don't introduce accidental references to PATENTS. +EXPECTED='scripts/ci/check_license.sh' +ACTUAL=$(git grep -l PATENTS) + +if [ "$EXPECTED" != "$ACTUAL" ]; then + echo "PATENTS crept into some new files?" + diff -u <(echo "$EXPECTED") <(echo "$ACTUAL") || true + exit 1 +fi diff --git a/scripts/ci/download_devtools_regression_build.js b/scripts/ci/download_devtools_regression_build.js new file mode 100755 index 00000000000..ed3c596a0ef --- /dev/null +++ b/scripts/ci/download_devtools_regression_build.js @@ -0,0 +1,152 @@ +#!/usr/bin/env node + +'use strict'; + +const {exec} = require('child-process-promise'); +const chalk = require('chalk'); +const {join} = require('path'); +const semver = require('semver'); +const yargs = require('yargs'); +const fs = require('fs'); + +const REGRESSION_FOLDER = 'build-regression'; + +const ROOT_PATH = join(__dirname, '..', '..'); + +const buildPath = join(ROOT_PATH, `build`, 'oss-experimental'); +const regressionBuildPath = join(ROOT_PATH, REGRESSION_FOLDER); + +const argv = yargs(process.argv.slice(2)).argv; + +const version = process.argv[2]; +const shouldReplaceBuild = !!argv.replaceBuild; + +async function downloadRegressionBuild() { + const reactVersion = semver.coerce(version).version; + const installPackages = ['react-dom', 'react', 'react-test-renderer']; + if (semver.gte(reactVersion, '16.3.0')) { + installPackages.push('react-is'); + } + + console.log(chalk.bold.white(`Downloading React v${version}\n`)); + + // Make build directory for temporary modules we're going to download + // from NPM + console.log( + chalk.white( + `Make Build directory at ${chalk.underline.blue(regressionBuildPath)}\n` + ) + ); + await exec(`mkdir ${regressionBuildPath}`); + + // Install all necessary React packages that have the same version + const downloadPackagesStr = installPackages.reduce( + (str, name) => `${str} ${name}@${version}`, + '' + ); + await exec( + `npm install --prefix ${REGRESSION_FOLDER} ${downloadPackagesStr}` + ); + + // If we shouldn't replace the build folder, we can stop here now + // before we modify anything + if (!shouldReplaceBuild) { + return; + } + + // Remove all the packages that we downloaded in the original build folder + // so we can move the modules from the regression build over + const removePackagesStr = installPackages.reduce( + (str, name) => `${str} ${join(buildPath, name)}`, + '' + ); + console.log( + chalk.white( + `Removing ${removePackagesStr + .split(' ') + .map(str => chalk.underline.blue(str) + '\n') + .join(' ')}\n` + ) + ); + await exec(`rm -rf ${removePackagesStr}`); + + // Move all packages that we downloaded to the original build folder + // We need to separately move the scheduler package because it might + // be called schedule + const movePackageString = installPackages.reduce( + (str, name) => `${str} ${join(regressionBuildPath, 'node_modules', name)}`, + '' + ); + console.log( + chalk.white( + `Moving ${movePackageString + .split(' ') + .map(str => chalk.underline.blue(str) + '\n') + .join(' ')} to ${chalk.underline.blue(buildPath)}\n` + ) + ); + fs.mkdirSync(buildPath, {recursive: true}); + await exec(`mv ${movePackageString} ${buildPath}`); + + // For React versions earlier than 18.0.0, we explicitly scheduler v0.20.1, which + // is the first version that has unstable_mock, which DevTools tests need, but also + // has Scheduler.unstable_trace, which, although we don't use in DevTools tests + // is imported by older React versions and will break if it's not there + if (semver.lte(reactVersion, '18.0.0')) { + await exec(`npm install --prefix ${REGRESSION_FOLDER} scheduler@0.20.1`); + } + + // In v16.5, scheduler is called schedule. We need to make sure we also move + // this over. Otherwise the code will break. + if (fs.existsSync(join(regressionBuildPath, 'node_modules', 'schedule'))) { + console.log(chalk.white(`Downloading schedule\n`)); + await exec( + `mv ${join(regressionBuildPath, 'node_modules', 'schedule')} ${buildPath}` + ); + } else { + console.log(chalk.white(`Downloading scheduler\n`)); + await exec(`rm -rf ${join(buildPath, 'scheduler')}`); + await exec( + `mv ${join( + regressionBuildPath, + 'node_modules', + 'scheduler' + )} ${buildPath}` + ); + } + + if (semver.gte(reactVersion, '18.2.0') && semver.lt(reactVersion, '19.0.0')) { + console.log(chalk.white(`Downloading react-compiler-runtime\n`)); + await exec( + `npm install --prefix ${REGRESSION_FOLDER} react-compiler-runtime` + ); + + console.log( + chalk.white( + `Moving react-compiler-runtime to react/compiler-runtime.js\n` + ) + ); + await exec( + `mv ${REGRESSION_FOLDER}/node_modules/react-compiler-runtime/dist/index.js ${buildPath}/react/compiler-runtime.js` + ); + } +} + +async function main() { + try { + if (!version) { + console.log(chalk.red('Must specify React version to download')); + return; + } + await downloadRegressionBuild(); + } finally { + // We shouldn't remove the regression-build folder unless we're using + // it to replace the build folder + if (shouldReplaceBuild) { + console.log(chalk.bold.white(`Removing regression build`)); + await exec(`rm -r ${regressionBuildPath}`); + } + } +} + +main(); diff --git a/scripts/ci/pack_and_store_devtools_artifacts.sh b/scripts/ci/pack_and_store_devtools_artifacts.sh new file mode 100755 index 00000000000..d427a303e5a --- /dev/null +++ b/scripts/ci/pack_and_store_devtools_artifacts.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -e + +mkdir -p build/devtools + +cd packages/react-devtools +npm pack +mv ./react-devtools*.tgz ../../build/devtools/ + +cd ../react-devtools-core +npm pack +mv ./react-devtools-core*.tgz ../../build/devtools/ + +cd ../react-devtools-inline +npm pack +mv ./react-devtools-inline*.tgz ../../build/devtools/ + +cd ../react-devtools-extensions +if [[ -n "$1" ]]; then + yarn build:$1 + mv ./$1/build/ReactDevTools.zip ../../build/devtools/$1-extension.zip + mv ./$1/build/webpack-stats.*.json ../../build/devtools/ +else + yarn build + for browser in chrome firefox edge; do + mv ./$browser/build/ReactDevTools.zip ../../build/devtools/$browser-extension.zip + mv ./$browser/build/webpack-stats.*.json ../../build/devtools/ + done +fi diff --git a/scripts/ci/run_devtools_e2e_tests.js b/scripts/ci/run_devtools_e2e_tests.js new file mode 100755 index 00000000000..040af722ad9 --- /dev/null +++ b/scripts/ci/run_devtools_e2e_tests.js @@ -0,0 +1,200 @@ +#!/usr/bin/env node + +'use strict'; + +const {spawn} = require('child_process'); +const {join} = require('path'); + +const ROOT_PATH = join(__dirname, '..', '..'); +const reactVersion = process.argv[2]; +const inlinePackagePath = join(ROOT_PATH, 'packages', 'react-devtools-inline'); +const shellPackagePath = join(ROOT_PATH, 'packages', 'react-devtools-shell'); +const playwrightArtifactsPath = join(ROOT_PATH, 'tmp', 'playwright-artifacts'); + +const {SUCCESSFUL_COMPILATION_MESSAGE} = require( + join(shellPackagePath, 'constants.js') +); + +let buildProcess = null; +let serverProcess = null; +let testProcess = null; + +function format(loggable) { + return `${loggable}` + .split('\n') + .filter(line => { + return line.trim() !== ''; + }) + .map(line => ` ${line}`) + .join('\n'); +} + +function logBright(loggable) { + console.log(`\x1b[1m${loggable}\x1b[0m`); +} + +function logDim(loggable) { + const formatted = format(loggable, 2); + if (formatted !== '') { + console.log(`\x1b[2m${formatted}\x1b[0m`); + } +} + +function logError(loggable) { + const formatted = format(loggable, 2); + if (formatted !== '') { + console.error(`\x1b[31m${formatted}\x1b[0m`); + } +} + +function buildInlinePackage() { + logBright('Building inline packages'); + + buildProcess = spawn('yarn', ['build'], {cwd: inlinePackagePath}); + buildProcess.stdout.on('data', data => { + logDim(data); + }); + buildProcess.stderr.on('data', data => { + if ( + `${data}`.includes('Warning') || + // E.g. [BABEL] Note: The code generator has deoptimised the styling of * as it exceeds the max of 500KB. + `${data}`.includes('[BABEL] Note') + ) { + logDim(data); + } else { + logError(`Error:\n${data}`); + + exitWithCode(1); + } + }); + buildProcess.on('close', code => { + logBright('Inline package built'); + + runTestShell(); + }); +} + +function runTestShell() { + const timeoutID = setTimeout(() => { + // Assume the test shell server failed to start. + logError('Testing shell server failed to start'); + exitWithCode(1); + }, 60 * 1000); + + logBright('Starting testing shell server'); + + if (!reactVersion) { + serverProcess = spawn('yarn', ['start'], {cwd: shellPackagePath}); + } else { + serverProcess = spawn('yarn', ['start'], { + cwd: shellPackagePath, + env: {...process.env, REACT_VERSION: reactVersion}, + }); + } + + serverProcess.stdout.on('data', data => { + if (`${data}`.includes(SUCCESSFUL_COMPILATION_MESSAGE)) { + logBright('Testing shell server running'); + + clearTimeout(timeoutID); + + runEndToEndTests(); + } + }); + + serverProcess.stderr.on('data', data => { + if (`${data}`.includes('EADDRINUSE')) { + // Something is occupying this port; + // We could kill the process and restart but probably better to prompt the user to do this. + + logError('Free up the port and re-run tests:'); + logBright(' kill -9 $(lsof -ti:8080)'); + + exitWithCode(1); + } else if (`${data}`.includes('ERROR')) { + logError(`Error:\n${data}`); + + exitWithCode(1); + } else { + // Non-fatal stuff like Babel optimization warnings etc. + logDim(data); + } + }); +} + +async function runEndToEndTests() { + logBright('Running e2e tests'); + if (!reactVersion) { + testProcess = spawn( + 'yarn', + ['test:e2e', `--output=${playwrightArtifactsPath}`], + { + cwd: inlinePackagePath, + } + ); + } else { + testProcess = spawn( + 'yarn', + ['test:e2e', `--output=${playwrightArtifactsPath}`], + { + cwd: inlinePackagePath, + env: {...process.env, REACT_VERSION: reactVersion}, + } + ); + } + + testProcess.stdout.on('data', data => { + // Log without formatting because Playwright applies its own formatting. + const formatted = format(data); + if (formatted !== '') { + console.log(formatted); + } + }); + testProcess.stderr.on('data', data => { + // Log without formatting because Playwright applies its own formatting. + const formatted = format(data); + if (formatted !== '') { + console.error(formatted); + } + + exitWithCode(1); + }); + testProcess.on('close', code => { + logBright(`Tests completed with code: ${code}`); + + exitWithCode(code); + }); +} + +function exitWithCode(code) { + if (buildProcess !== null) { + try { + logBright('Shutting down build process'); + buildProcess.kill(); + } catch (error) { + logError(error); + } + } + + if (serverProcess !== null) { + try { + logBright('Shutting down shell server process'); + serverProcess.kill(); + } catch (error) { + logError(error); + } + } + + if (testProcess !== null) { + try { + logBright('Shutting down test process'); + testProcess.kill(); + } catch (error) { + logError(error); + } + } + + process.exit(code); +} + +buildInlinePackage(); diff --git a/scripts/ci/test_print_warnings.sh b/scripts/ci/test_print_warnings.sh new file mode 100755 index 00000000000..27be0ace0a2 --- /dev/null +++ b/scripts/ci/test_print_warnings.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +WARNINGS=$(node scripts/print-warnings/print-warnings.js) +echo "$WARNINGS" +test ! -z "$WARNINGS" diff --git a/scripts/circleci/build_gh_pages.sh b/scripts/circleci/build_gh_pages.sh deleted file mode 100755 index c0ecc81e35d..00000000000 --- a/scripts/circleci/build_gh_pages.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -set -e - -if [ "$CIRCLE_BRANCH" = "$REACT_WEBSITE_BRANCH" ]; then - - GH_PAGES_DIR=`pwd`/../react-gh-pages - - # check if directory exists (restored from cache) - if [ -d $GH_PAGES_DIR ]; then - pushd $GH_PAGES_DIR - git pull origin gh-pages - popd - else - git clone --branch gh-pages --depth=1 \ - https://reactjs-bot@github.com/facebook/react.git \ - $GH_PAGES_DIR - fi - - pushd docs - bundle exec rake release - cd $GH_PAGES_DIR - git status - git --no-pager diff - if ! git diff-index --quiet HEAD --; then - git add -A . - git commit -m "Rebuild website" - git push origin gh-pages - fi - popd -else - echo "Not building website" -fi diff --git a/scripts/circleci/set_up_github_keys.sh b/scripts/circleci/set_up_github_keys.sh deleted file mode 100755 index 302c40eef0e..00000000000 --- a/scripts/circleci/set_up_github_keys.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e - -if [ -n $GITHUB_TOKEN ]; then - - GH_PAGES_DIR=`pwd`/../react-gh-pages - echo "machine github.com login reactjs-bot password $GITHUB_TOKEN" >~/.netrc - git config --global user.name "Circle CI" - git config --global user.email "circle@reactjs.org" - -fi diff --git a/scripts/circleci/test_coverage.sh b/scripts/circleci/test_coverage.sh deleted file mode 100755 index 05a717c2a41..00000000000 --- a/scripts/circleci/test_coverage.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -e - -./node_modules/.bin/grunt jest:coverage -if [ -z $CI_PULL_REQUEST ]; then - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls -fi diff --git a/scripts/circleci/test_entry_point.sh b/scripts/circleci/test_entry_point.sh deleted file mode 100755 index d9a2fbf959f..00000000000 --- a/scripts/circleci/test_entry_point.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -set -e - -COMMANDS_TO_RUN=() - -# We split these to be approximately equal chunks of four. As of this writing, -# times were around: -# - 3:30 test_coverage.sh -# - 2:00 test_fiber.sh -# - 1:15 test_html_generation.sh -# - 1:15 grunt build -# with everything else < 0:30. - -if [ $((1 % CIRCLE_NODE_TOTAL)) -eq "$CIRCLE_NODE_INDEX" ]; then - COMMANDS_TO_RUN+=('./scripts/circleci/test_coverage.sh') -fi - -if [ $((2 % CIRCLE_NODE_TOTAL)) -eq "$CIRCLE_NODE_INDEX" ]; then - COMMANDS_TO_RUN+=('./scripts/circleci/test_fiber.sh') -fi - -if [ $((3 % CIRCLE_NODE_TOTAL)) -eq "$CIRCLE_NODE_INDEX" ]; then - COMMANDS_TO_RUN+=('./scripts/circleci/test_html_generation.sh') -fi - -# These seem out of order but extract-errors must be run after jest. -if [ $((0 % CIRCLE_NODE_TOTAL)) -eq "$CIRCLE_NODE_INDEX" ]; then - COMMANDS_TO_RUN+=('./node_modules/.bin/gulp lint') - COMMANDS_TO_RUN+=('node ./scripts/prettier/index') - COMMANDS_TO_RUN+=('./node_modules/.bin/gulp flow') - COMMANDS_TO_RUN+=('./node_modules/.bin/grunt build') - COMMANDS_TO_RUN+=('./scripts/circleci/test_extract_errors.sh') - COMMANDS_TO_RUN+=('./scripts/circleci/track_stats.sh') -fi - -RETURN_CODES=() -FAILURE=0 - -printf "Node #%s (%s total). " "$CIRCLE_NODE_INDEX" "$CIRCLE_NODE_TOTAL" -if [ -n "${COMMANDS_TO_RUN[0]}" ]; then - echo "Preparing to run commands:" - for cmd in "${COMMANDS_TO_RUN[@]}"; do - echo "- $cmd" - done - - for cmd in "${COMMANDS_TO_RUN[@]}"; do - echo - echo "$ $cmd" - set +e - $cmd - rc=$? - set -e - RETURN_CODES+=($rc) - if [ $rc -ne 0 ]; then - FAILURE=$rc - fi - done - - echo - for i in "${!COMMANDS_TO_RUN[@]}"; do - echo "Received return code ${RETURN_CODES[i]} from: ${COMMANDS_TO_RUN[i]}" - done - exit $FAILURE -else - echo "No commands to run." -fi diff --git a/scripts/circleci/test_extract_errors.sh b/scripts/circleci/test_extract_errors.sh deleted file mode 100755 index cce29cc3473..00000000000 --- a/scripts/circleci/test_extract_errors.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -e - -./node_modules/.bin/gulp react:extract-errors -git checkout -- scripts/error-codes/codes.json - -WARNINGS=$(node scripts/error-codes/print-warnings.js) -echo "$WARNINGS" -test ! -z "$WARNINGS" diff --git a/scripts/circleci/test_fiber.sh b/scripts/circleci/test_fiber.sh deleted file mode 100755 index 47fbf9cbe99..00000000000 --- a/scripts/circleci/test_fiber.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -e - -echo 'Testing in fiber mode...' -./scripts/fiber/record-tests --track-facts --max-workers 1 -git --no-pager diff scripts/fiber -FIBER_TESTS_STATUS=$(git status --porcelain scripts/fiber) -test -z "$FIBER_TESTS_STATUS" diff --git a/scripts/circleci/test_html_generation.sh b/scripts/circleci/test_html_generation.sh deleted file mode 100755 index 0bedb26aea4..00000000000 --- a/scripts/circleci/test_html_generation.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -e - -echo 'Testing in server-render (HTML generation) mode...' -printf '\nmodule.exports.useCreateElement = false;\n' \ - >> src/renderers/dom/shared/ReactDOMFeatureFlags.js -./node_modules/.bin/grunt jest:normal -git checkout -- src/renderers/dom/shared/ReactDOMFeatureFlags.js diff --git a/scripts/circleci/track_stats.sh b/scripts/circleci/track_stats.sh deleted file mode 100755 index a8a3eae1fad..00000000000 --- a/scripts/circleci/track_stats.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -e - -ALL_FILES=`find src -name '*.js' | grep -v umd/ | grep -v __tests__ | grep -v __mocks__` -COUNT_ALL_FILES=`echo "$ALL_FILES" | wc -l` -COUNT_WITH_FLOW=`grep '@flow' $ALL_FILES | perl -pe 's/:.+//' | wc -l` -node scripts/facts-tracker/index.js "flow-files" "$COUNT_WITH_FLOW/$COUNT_ALL_FILES" diff --git a/scripts/circleci/upload_build.sh b/scripts/circleci/upload_build.sh deleted file mode 100755 index 6b57fceac20..00000000000 --- a/scripts/circleci/upload_build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -e - -if [ -z $CI_PULL_REQUEST ] && [ -n "$BUILD_SERVER_ENDPOINT" ]; then - curl \ - -F "react=@build/react.js" \ - -F "react.min=@build/react.min.js" \ - -F "react-dom=@build/react-dom.js" \ - -F "react-dom.min=@build/react-dom.min.js" \ - -F "react-dom-server=@build/react-dom-server.js" \ - -F "react-dom-server.min=@build/react-dom-server.min.js" \ - -F "npm-react=@build/packages/react.tgz" \ - -F "npm-react-dom=@build/packages/react-dom.tgz" \ - -F "commit=$CIRCLE_SHA1" \ - -F "date=`git log --format='%ct' -1`" \ - -F "pull_request=false" \ - -F "token=$BUILD_SERVER_TOKEN" \ - -F "branch=$CIRCLE_BRANCH" \ - $BUILD_SERVER_ENDPOINT -fi diff --git a/scripts/devtools/.gitignore b/scripts/devtools/.gitignore new file mode 100644 index 00000000000..c0a5522d94d --- /dev/null +++ b/scripts/devtools/.gitignore @@ -0,0 +1,2 @@ +.build-metadata +.progress-estimator diff --git a/scripts/devtools/README.md b/scripts/devtools/README.md new file mode 100644 index 00000000000..7f2410c3664 --- /dev/null +++ b/scripts/devtools/README.md @@ -0,0 +1,30 @@ +# Releasing DevTools + +To release DevTools, do the following steps (in order): +1. [Prepare a release](#prepare-a-release) +2. [Build and test a release](#build-and-test-a-release) +3. [Publish a release](#publish-a-release) + +Each of the scripts can be run with a `--dry` flag to test without committing or publishing any changes. + +### Prepare a release +To increment version numbers and update the [CHANGELOG](https://github.com/facebook/react/blob/main/packages/react-devtools/CHANGELOG.md), run the `prepare-release` script: +```sh +./prepare-release.js +``` + +You'll need to follow the instructions at the end of the script to push the committed changes to the main fork on GitHub. + +### Build and test a release +To build and test a release, run the `build-and-test` script: +```sh +./build-and-test.js +``` + +### Publish a release +To publish a release to NPM, run the `publish-release` script: +```sh +./publish-release.js +``` + +You'll need to follow the instructions at the end of the script to upload the extension to Chrome, Edge, and Firefox stores. \ No newline at end of file diff --git a/scripts/devtools/build-and-test.js b/scripts/devtools/build-and-test.js new file mode 100755 index 00000000000..78275691aca --- /dev/null +++ b/scripts/devtools/build-and-test.js @@ -0,0 +1,239 @@ +#!/usr/bin/env node + +'use strict'; + +const chalk = require('chalk'); +const {exec} = require('child-process-promise'); +const inquirer = require('inquirer'); +const {homedir} = require('os'); +const {join, relative} = require('path'); +const {DRY_RUN, ROOT_PATH} = require('./configuration'); +const { + clear, + confirm, + confirmContinue, + execRead, + logger, + saveBuildMetadata, +} = require('./utils'); + +// This is the primary control function for this script. +async function main() { + clear(); + + await confirm('Have you stopped all NPM DEV scripts?', () => { + const packagesPath = relative(process.cwd(), join(__dirname, 'packages')); + + console.log('Stop all NPM DEV scripts in the following directories:'); + console.log( + chalk.bold(' ' + join(packagesPath, 'react-devtools-core')), + chalk.gray('(start:backend, start:standalone)') + ); + console.log( + chalk.bold(' ' + join(packagesPath, 'react-devtools-inline')), + chalk.gray('(start)') + ); + + const buildAndTestScriptPath = join(__dirname, 'build-and-test.js'); + const pathToPrint = relative(process.cwd(), buildAndTestScriptPath); + + console.log('\nThen restart this release step:'); + console.log(chalk.bold.green(' ' + pathToPrint)); + }); + + await confirm('Have you run the prepare-release script?', () => { + const prepareReleaseScriptPath = join(__dirname, 'prepare-release.js'); + const pathToPrint = relative(process.cwd(), prepareReleaseScriptPath); + + console.log('Begin by running the prepare-release script:'); + console.log(chalk.bold.green(' ' + pathToPrint)); + }); + + const archivePath = await archiveGitRevision(); + const currentCommitHash = await downloadLatestReactBuild(); + + await buildAndTestInlinePackage(); + await buildAndTestStandalonePackage(); + await buildAndTestExtensions(); + + saveBuildMetadata({archivePath, currentCommitHash}); + + printFinalInstructions(); +} + +async function archiveGitRevision() { + const desktopPath = join(homedir(), 'Desktop'); + const archivePath = join(desktopPath, 'DevTools.tgz'); + + console.log(`Creating git archive at ${chalk.dim(archivePath)}`); + console.log(''); + + if (!DRY_RUN) { + await exec(`git archive main | gzip > ${archivePath}`, {cwd: ROOT_PATH}); + } + + return archivePath; +} + +async function buildAndTestExtensions() { + const extensionsPackagePath = join( + ROOT_PATH, + 'packages', + 'react-devtools-extensions' + ); + const buildExtensionsPromise = exec('yarn build', { + cwd: extensionsPackagePath, + }); + + await logger( + buildExtensionsPromise, + `Building browser extensions ${chalk.dim('(this may take a minute)')}`, + { + estimate: 60000, + } + ); + + console.log(''); + console.log(`Extensions have been build for Chrome, Edge, and Firefox.`); + console.log(''); + console.log('Smoke test each extension before continuing:'); + console.log(` ${chalk.bold.green('cd ' + extensionsPackagePath)}`); + console.log(''); + console.log(` ${chalk.dim('# Test Chrome extension')}`); + console.log(` ${chalk.bold.green('yarn test:chrome')}`); + console.log(''); + console.log(` ${chalk.dim('# Test Edge extension')}`); + console.log(` ${chalk.bold.green('yarn test:edge')}`); + console.log(''); + console.log(` ${chalk.dim('# Firefox Chrome extension')}`); + console.log(` ${chalk.bold.green('yarn test:firefox')}`); + + await confirmContinue(); +} + +async function buildAndTestStandalonePackage() { + const corePackagePath = join(ROOT_PATH, 'packages', 'react-devtools-core'); + const corePackageDest = join(corePackagePath, 'dist'); + + await exec(`rm -rf ${corePackageDest}`); + const buildCorePromise = exec('yarn build', {cwd: corePackagePath}); + + await logger( + buildCorePromise, + `Building ${chalk.bold('react-devtools-core')} package.`, + { + estimate: 25000, + } + ); + + const standalonePackagePath = join(ROOT_PATH, 'packages', 'react-devtools'); + const safariFixturePath = join( + ROOT_PATH, + 'fixtures', + 'devtools', + 'standalone', + 'index.html' + ); + + console.log(''); + console.log( + `Test the ${chalk.bold('react-devtools-core')} target before continuing:` + ); + console.log(` ${chalk.bold.green('cd ' + standalonePackagePath)}`); + console.log(` ${chalk.bold.green('yarn start')}`); + console.log(''); + console.log( + 'The following fixture can be useful for testing Safari integration:' + ); + console.log(` ${chalk.dim(safariFixturePath)}`); + + await confirmContinue(); +} + +async function buildAndTestInlinePackage() { + const inlinePackagePath = join( + ROOT_PATH, + 'packages', + 'react-devtools-inline' + ); + const inlinePackageDest = join(inlinePackagePath, 'dist'); + + await exec(`rm -rf ${inlinePackageDest}`); + const buildPromise = exec('yarn build', {cwd: inlinePackagePath}); + + await logger( + buildPromise, + `Building ${chalk.bold('react-devtools-inline')} package.`, + { + estimate: 10000, + } + ); + + const shellPackagePath = join(ROOT_PATH, 'packages', 'react-devtools-shell'); + + console.log(''); + console.log(`Built ${chalk.bold('react-devtools-inline')} target.`); + console.log(''); + console.log('Test this build before continuing:'); + console.log(` ${chalk.bold.green('cd ' + shellPackagePath)}`); + console.log(` ${chalk.bold.green('yarn start')}`); + + await confirmContinue(); +} + +async function downloadLatestReactBuild() { + const releaseScriptPath = join(ROOT_PATH, 'scripts', 'release'); + const installPromise = exec('yarn install', {cwd: releaseScriptPath}); + + await logger( + installPromise, + `Installing release script dependencies. ${chalk.dim( + '(this may take a minute if CI is still running)' + )}`, + { + estimate: 5000, + } + ); + + console.log(''); + + const currentCommitHash = (await exec('git rev-parse HEAD')).stdout.trim(); + if (!currentCommitHash) { + throw new Error('Failed to get current commit hash'); + } + + const {commit} = await inquirer.prompt([ + { + type: 'input', + name: 'commit', + message: 'Which React version (commit) should be used?', + default: currentCommitHash, + }, + ]); + console.log(''); + + const downloadScriptPath = join( + releaseScriptPath, + 'download-experimental-build.js' + ); + const downloadPromise = execRead( + `"${downloadScriptPath}" --commit=${commit}` + ); + + await logger(downloadPromise, 'Downloading React artifacts from CI.', { + estimate: 15000, + }); + + return currentCommitHash; +} + +function printFinalInstructions() { + const publishReleaseScriptPath = join(__dirname, 'publish-release.js'); + const pathToPrint = relative(process.cwd(), publishReleaseScriptPath); + + console.log(''); + console.log('Continue by running the publish-release script:'); + console.log(chalk.bold.green(' ' + pathToPrint)); +} + +main(); diff --git a/scripts/devtools/configuration.js b/scripts/devtools/configuration.js new file mode 100644 index 00000000000..98d65baf946 --- /dev/null +++ b/scripts/devtools/configuration.js @@ -0,0 +1,46 @@ +'use strict'; + +const {join} = require('path'); + +const PACKAGE_PATHS = [ + 'packages/react-devtools/package.json', + 'packages/react-devtools-core/package.json', + 'packages/react-devtools-inline/package.json', + 'packages/react-devtools-timeline/package.json', +]; + +const MANIFEST_PATHS = [ + 'packages/react-devtools-extensions/chrome/manifest.json', + 'packages/react-devtools-extensions/edge/manifest.json', + 'packages/react-devtools-extensions/firefox/manifest.json', +]; + +const NPM_PACKAGES = [ + 'react-devtools', + 'react-devtools-core', + 'react-devtools-inline', +]; + +const CHANGELOG_PATH = 'packages/react-devtools/CHANGELOG.md'; + +const PULL_REQUEST_BASE_URL = 'https://github.com/facebook/react/pull/'; + +const RELEASE_SCRIPT_TOKEN = ''; + +const ROOT_PATH = join(__dirname, '..', '..'); + +const DRY_RUN = process.argv.includes('--dry'); + +const BUILD_METADATA_TEMP_DIRECTORY = join(__dirname, '.build-metadata'); + +module.exports = { + BUILD_METADATA_TEMP_DIRECTORY, + CHANGELOG_PATH, + DRY_RUN, + MANIFEST_PATHS, + NPM_PACKAGES, + PACKAGE_PATHS, + PULL_REQUEST_BASE_URL, + RELEASE_SCRIPT_TOKEN, + ROOT_PATH, +}; diff --git a/scripts/devtools/package.json b/scripts/devtools/package.json new file mode 100644 index 00000000000..2188210b239 --- /dev/null +++ b/scripts/devtools/package.json @@ -0,0 +1,16 @@ +{ + "name": "react-devtools-release-script", + "version": "0.0.0", + "private": true, + "scripts": {}, + "license": "MIT", + "dependencies": { + "chalk": "^2.1.0", + "child-process-promise": "^2.2.1", + "fs-extra": "^4.0.2", + "inquirer": "^8.1.2", + "progress-estimator": "^0.2.1", + "prompt-promise": "^1.0.3", + "semver": "^5.4.1" + } +} diff --git a/scripts/devtools/prepare-release.js b/scripts/devtools/prepare-release.js new file mode 100755 index 00000000000..6ea4e60741b --- /dev/null +++ b/scripts/devtools/prepare-release.js @@ -0,0 +1,286 @@ +#!/usr/bin/env node + +'use strict'; + +const chalk = require('chalk'); +const {exec} = require('child-process-promise'); +const {readFileSync, writeFileSync} = require('fs'); +const {readJsonSync, writeJsonSync} = require('fs-extra'); +const inquirer = require('inquirer'); +const {join, relative} = require('path'); +const semver = require('semver'); +const { + CHANGELOG_PATH, + DRY_RUN, + MANIFEST_PATHS, + PACKAGE_PATHS, + PULL_REQUEST_BASE_URL, + RELEASE_SCRIPT_TOKEN, + ROOT_PATH, +} = require('./configuration'); +const { + checkNPMPermissions, + clear, + confirmContinue, + execRead, +} = require('./utils'); + +// This is the primary control function for this script. +async function main() { + clear(); + + await checkNPMPermissions(); + + const sha = await getPreviousCommitSha(); + const [shortCommitLog, formattedCommitLog] = await getCommitLog(sha); + + console.log(''); + console.log( + 'This release includes the following commits:', + chalk.gray(shortCommitLog) + ); + console.log(''); + + const releaseType = await getReleaseType(); + + const path = join(ROOT_PATH, PACKAGE_PATHS[0]); + const previousVersion = readJsonSync(path).version; + const {major, minor, patch} = semver(previousVersion); + const nextVersion = + releaseType === 'minor' + ? `${major}.${minor + 1}.0` + : `${major}.${minor}.${patch + 1}`; + + updateChangelog(nextVersion, formattedCommitLog); + + await reviewChangelogPrompt(); + + updatePackageVersions(previousVersion, nextVersion); + updateManifestVersions(previousVersion, nextVersion); + + console.log(''); + console.log( + `Packages and manifests have been updated from version ${chalk.bold( + previousVersion + )} to ${chalk.bold(nextVersion)}` + ); + console.log(''); + + await commitPendingChanges(previousVersion, nextVersion); + + printFinalInstructions(); +} + +async function commitPendingChanges(previousVersion, nextVersion) { + console.log(''); + console.log('Committing revision and changelog.'); + console.log(chalk.dim(' git add .')); + console.log( + chalk.dim( + ` git commit -m "React DevTools ${previousVersion} -> ${nextVersion}"` + ) + ); + + if (!DRY_RUN) { + await exec(` + git add . + git commit -m "React DevTools ${previousVersion} -> ${nextVersion}" + `); + } + + console.log(''); + console.log(`Please push this commit before continuing:`); + console.log(` ${chalk.bold.green('git push')}`); + + await confirmContinue(); +} + +async function getCommitLog(sha) { + let shortLog = ''; + let formattedLog = ''; + + const hasGh = await hasGithubCLI(); + const rawLog = await execRead(` + git log --topo-order --pretty=format:'%s' ${sha}...HEAD -- packages/react-devtools* + `); + const lines = rawLog.split('\n'); + for (let i = 0; i < lines.length; i++) { + const line = lines[i].replace(/^\[devtools\] */i, ''); + const match = line.match(/(.+) \(#([0-9]+)\)/); + if (match !== null) { + const title = match[1]; + const pr = match[2]; + let username; + if (hasGh) { + const response = await execRead( + `gh api /repos/facebook/react/pulls/${pr}` + ); + const {user} = JSON.parse(response); + username = `[${user.login}](${user.html_url})`; + } else { + username = '[USERNAME](https://github.com/USERNAME)'; + } + formattedLog += `\n* ${title} (${username} in [#${pr}](${PULL_REQUEST_BASE_URL}${pr}))`; + shortLog += `\n* ${title}`; + } else { + formattedLog += `\n* ${line}`; + shortLog += `\n* ${line}`; + } + } + + return [shortLog, formattedLog]; +} + +async function hasGithubCLI() { + try { + await exec('which gh'); + return true; + } catch (_) {} + return false; +} + +async function getPreviousCommitSha() { + const choices = []; + + const lines = await execRead(` + git log --max-count=5 --topo-order --pretty=format:'%H:::%s:::%as' HEAD -- ${join( + ROOT_PATH, + PACKAGE_PATHS[0] + )} + `); + + lines.split('\n').forEach((line, index) => { + const [hash, message, date] = line.split(':::'); + choices.push({ + name: `${chalk.bold(hash)} ${chalk.dim(date)} ${message}`, + value: hash, + short: date, + }); + }); + + const {sha} = await inquirer.prompt([ + { + type: 'list', + name: 'sha', + message: 'Which of the commits above marks the last DevTools release?', + choices, + default: choices[0].value, + }, + ]); + + return sha; +} + +async function getReleaseType() { + const {releaseType} = await inquirer.prompt([ + { + type: 'list', + name: 'releaseType', + message: 'Which type of release is this?', + choices: [ + { + name: 'Minor (new user facing functionality)', + value: 'minor', + short: 'Minor', + }, + {name: 'Patch (bug fixes only)', value: 'patch', short: 'Patch'}, + ], + default: 'patch', + }, + ]); + + return releaseType; +} + +function printFinalInstructions() { + const buildAndTestcriptPath = join(__dirname, 'build-and-test.js'); + const pathToPrint = relative(process.cwd(), buildAndTestcriptPath); + + console.log(''); + console.log('Continue by running the build-and-test script:'); + console.log(chalk.bold.green(' ' + pathToPrint)); +} + +async function reviewChangelogPrompt() { + console.log(''); + console.log( + 'The changelog has been updated with commits since the previous release:' + ); + console.log(` ${chalk.bold(CHANGELOG_PATH)}`); + console.log(''); + console.log('Please review the new changelog text for the following:'); + console.log(' 1. Filter out any non-user-visible changes (e.g. typo fixes)'); + console.log(' 2. Organize the list into Features vs Bugfixes'); + console.log(' 3. Combine related PRs into a single bullet list'); + console.log( + ' 4. Replacing the "USERNAME" placeholder text with the GitHub username(s)' + ); + console.log(''); + console.log(` ${chalk.bold.green(`open ${CHANGELOG_PATH}`)}`); + + await confirmContinue(); +} + +function updateChangelog(nextVersion, commitLog) { + const path = join(ROOT_PATH, CHANGELOG_PATH); + const oldChangelog = readFileSync(path, 'utf8'); + + const [beginning, end] = oldChangelog.split(RELEASE_SCRIPT_TOKEN); + + const dateString = new Date().toLocaleDateString('en-us', { + year: 'numeric', + month: 'long', + day: 'numeric', + }); + const header = `---\n\n### ${nextVersion}\n${dateString}`; + + const newChangelog = `${beginning}${RELEASE_SCRIPT_TOKEN}\n\n${header}\n${commitLog}${end}`; + + console.log(chalk.dim(' Updating changelog: ' + CHANGELOG_PATH)); + + if (!DRY_RUN) { + writeFileSync(path, newChangelog); + } +} + +function updateManifestVersions(previousVersion, nextVersion) { + MANIFEST_PATHS.forEach(partialPath => { + const path = join(ROOT_PATH, partialPath); + const json = readJsonSync(path); + json.version = nextVersion; + + if (json.hasOwnProperty('version_name')) { + json.version_name = nextVersion; + } + + console.log(chalk.dim(' Updating manifest JSON: ' + partialPath)); + + if (!DRY_RUN) { + writeJsonSync(path, json, {spaces: 2}); + } + }); +} + +function updatePackageVersions(previousVersion, nextVersion) { + PACKAGE_PATHS.forEach(partialPath => { + const path = join(ROOT_PATH, partialPath); + const json = readJsonSync(path); + json.version = nextVersion; + + for (let key in json.dependencies) { + if (key.startsWith('react-devtools')) { + const version = json.dependencies[key]; + + json.dependencies[key] = version.replace(previousVersion, nextVersion); + } + } + + console.log(chalk.dim(' Updating package JSON: ' + partialPath)); + + if (!DRY_RUN) { + writeJsonSync(path, json, {spaces: 2}); + } + }); +} + +main(); diff --git a/scripts/devtools/publish-release.js b/scripts/devtools/publish-release.js new file mode 100755 index 00000000000..6a2ab4f79d2 --- /dev/null +++ b/scripts/devtools/publish-release.js @@ -0,0 +1,122 @@ +#!/usr/bin/env node + +'use strict'; + +const chalk = require('chalk'); +const {exec} = require('child-process-promise'); +const {readJsonSync} = require('fs-extra'); +const inquirer = require('inquirer'); +const {join, relative} = require('path'); +const {DRY_RUN, NPM_PACKAGES, ROOT_PATH} = require('./configuration'); +const { + checkNPMPermissions, + clear, + confirm, + execRead, + logger, + readSavedBuildMetadata, +} = require('./utils'); + +// This is the primary control function for this script. +async function main() { + clear(); + + await confirm('Have you run the build-and-test script?', () => { + const buildAndTestScriptPath = join(__dirname, 'build-and-test.js'); + const pathToPrint = relative(process.cwd(), buildAndTestScriptPath); + + console.log('Begin by running the build-and-test script:'); + console.log(chalk.bold.green(' ' + pathToPrint)); + }); + + const {archivePath, currentCommitHash} = readSavedBuildMetadata(); + + await checkNPMPermissions(); + + await publishToNPM(); + + await printFinalInstructions(currentCommitHash, archivePath); +} + +async function printFinalInstructions(currentCommitHash, archivePath) { + console.log(''); + console.log( + 'You are now ready to publish the extension to Chrome, Edge, and Firefox:' + ); + console.log( + ` ${chalk.blue.underline( + 'https://fburl.com/publish-react-devtools-extensions' + )}` + ); + console.log(''); + console.log('When publishing to Firefox, remember the following:'); + console.log(` Commit Hash: ${chalk.bold(currentCommitHash)}`); + console.log(` Git archive: ${chalk.bold(archivePath)}`); + console.log(''); + console.log('Also consider syncing this release to Facebook:'); + console.log(` ${chalk.bold.green('js1 upgrade react-devtools')}`); +} + +async function publishToNPM() { + const {otp} = await inquirer.prompt([ + { + type: 'input', + name: 'otp', + message: 'Please provide an NPM two-factor auth token:', + }, + ]); + + console.log(''); + + if (!otp) { + console.error(chalk.red(`Invalid OTP provided: "${chalk.bold(otp)}"`)); + process.exit(0); + } + + for (let index = 0; index < NPM_PACKAGES.length; index++) { + const npmPackage = NPM_PACKAGES[index]; + const packagePath = join(ROOT_PATH, 'packages', npmPackage); + const {version} = readJsonSync(join(packagePath, 'package.json')); + + // Check if this package version has already been published. + // If so we might be resuming from a previous run. + // We could infer this by comparing the build-info.json, + // But for now the easiest way is just to ask if this is expected. + const versionListJSON = await execRead( + `npm view ${npmPackage} versions --json` + ); + const versionList = JSON.parse(versionListJSON); + const versionIsAlreadyPublished = versionList.includes(version); + + if (versionIsAlreadyPublished) { + console.log(''); + console.log( + `${npmPackage} version ${chalk.bold( + version + )} has already been published.` + ); + + await confirm(`Is this expected (will skip ${npmPackage}@${version})?`); + continue; + } + + if (DRY_RUN) { + console.log(`Publishing package ${chalk.bold(npmPackage)}`); + console.log(chalk.dim(` npm publish --otp=${otp}`)); + } else { + const publishPromise = exec(`npm publish --otp=${otp}`, { + cwd: packagePath, + }); + + await logger( + publishPromise, + `Publishing package ${chalk.bold(npmPackage)}`, + { + estimate: 2500, + } + ); + } + } +} + +main(); diff --git a/scripts/devtools/utils.js b/scripts/devtools/utils.js new file mode 100644 index 00000000000..06006500627 --- /dev/null +++ b/scripts/devtools/utils.js @@ -0,0 +1,128 @@ +'use strict'; + +const chalk = require('chalk'); +const {exec} = require('child-process-promise'); +const {existsSync, mkdirSync} = require('fs'); +const {readJsonSync, writeJsonSync} = require('fs-extra'); +const inquirer = require('inquirer'); +const {join} = require('path'); +const createLogger = require('progress-estimator'); +const { + BUILD_METADATA_TEMP_DIRECTORY, + NPM_PACKAGES, +} = require('./configuration'); + +const logger = createLogger({ + storagePath: join(__dirname, '.progress-estimator'), +}); + +async function checkNPMPermissions() { + const currentUser = await execRead('npm whoami'); + const failedProjects = []; + + const checkProject = async project => { + const owners = (await execRead(`npm owner ls ${project}`)) + .split('\n') + .filter(owner => owner) + .map(owner => owner.split(' ')[0]); + + if (!owners.includes(currentUser)) { + failedProjects.push(project); + } + }; + + await logger( + Promise.all(NPM_PACKAGES.map(checkProject)), + `Checking NPM permissions for ${chalk.bold(currentUser)}.`, + {estimate: 2500} + ); + + console.log(''); + + if (failedProjects.length) { + console.error(chalk.red.bold('Insufficient NPM permissions')); + console.error(''); + console.error( + chalk.red( + `NPM user {underline ${currentUser}} is not an owner for: ${chalk.bold( + failedProjects.join(', ') + )}` + ) + ); + console.error( + chalk.red( + 'Please contact a React team member to be added to the above project(s).' + ) + ); + process.exit(1); + } +} + +function clear() { + console.clear(); +} + +async function confirm(message, exitFunction) { + console.log(''); + + const {confirmation} = await inquirer.prompt({ + name: 'confirmation', + type: 'confirm', + message, + }); + + console.log(''); + + if (!confirmation) { + if (typeof exitFunction === 'function') { + exitFunction(); + } + + process.exit(0); + } +} + +async function confirmContinue(exitFunction) { + await confirm('Continue the release?', exitFunction); +} + +async function execRead(command, options) { + const {stdout} = await exec(command, options); + + return stdout.trim(); +} + +function readSavedBuildMetadata() { + const path = join(BUILD_METADATA_TEMP_DIRECTORY, 'metadata'); + + if (!existsSync(path)) { + console.error(chalk.red('Expected to find build metadata at:')); + console.error(chalk.dim(` ${path}`)); + process.exit(1); + } + + const {archivePath, currentCommitHash} = readJsonSync(path); + + return {archivePath, currentCommitHash}; +} + +function saveBuildMetadata({archivePath, currentCommitHash}) { + const path = join(BUILD_METADATA_TEMP_DIRECTORY, 'metadata'); + + if (!existsSync(BUILD_METADATA_TEMP_DIRECTORY)) { + mkdirSync(BUILD_METADATA_TEMP_DIRECTORY); + } + + writeJsonSync(path, {archivePath, currentCommitHash}, {spaces: 2}); +} + +module.exports = { + checkNPMPermissions, + clear, + confirm, + confirmContinue, + execRead, + logger, + readSavedBuildMetadata, + saveBuildMetadata, +}; diff --git a/scripts/devtools/yarn.lock b/scripts/devtools/yarn.lock new file mode 100644 index 00000000000..fd79a7138bd --- /dev/null +++ b/scripts/devtools/yarn.lock @@ -0,0 +1,586 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +chalk@^2.1.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +child-process-promise@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" + integrity sha1-RzChHvYQ+tRQuPIjx50x172tgHQ= + dependencies: + cross-spawn "^4.0.2" + node-version "^1.0.0" + promise-polyfill "^6.0.1" + +cli-cursor@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + +cli-spinners@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +cross-spawn@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +humanize-duration@^3.15.3: + version "3.27.0" + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.27.0.tgz#3f781b7cf8022ad587f76b9839b60bc2b29636b2" + integrity sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d" + integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.3.0" + run-async "^2.4.0" + rxjs "^7.2.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +keypress@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77" + integrity sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc= + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +native-or-another@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/native-or-another/-/native-or-another-2.0.0.tgz#17a567f92beea9cd71acff96a7681a735eca3bff" + integrity sha1-F6Vn+Svuqc1xrP+Wp2gac17KO/8= + dependencies: + native-or-bluebird "^1.1.2" + +native-or-bluebird@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9" + integrity sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck= + +node-version@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" + integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +progress-estimator@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/progress-estimator/-/progress-estimator-0.2.2.tgz#1c3947a5782ea56e40c8fccc290ac7ceeb1b91cb" + integrity sha512-GF76Ac02MTJD6o2nMNtmtOFjwWCnHcvXyn5HOWPQnEMO8OTLw7LAvNmrwe8LmdsB+eZhwUu9fX/c9iQnBxWaFA== + dependencies: + chalk "^2.4.1" + cli-spinners "^1.3.1" + humanize-duration "^3.15.3" + log-update "^2.3.0" + +promise-polyfill@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057" + integrity sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc= + +prompt-promise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/prompt-promise/-/prompt-promise-1.0.3.tgz#78ce4fcb9a14a108c49174f2d808c440d1bde265" + integrity sha1-eM5Py5oUoQjEkXTy2AjEQNG94mU= + dependencies: + keypress "~0.2.1" + native-or-another "~2.0.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^7.2.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" + integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== + dependencies: + tslib "~2.1.0" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.4.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= diff --git a/scripts/error-codes/README.md b/scripts/error-codes/README.md index aefb87b6fd9..38918bd42a5 100644 --- a/scripts/error-codes/README.md +++ b/scripts/error-codes/README.md @@ -1,14 +1,18 @@ -The error code system substitutes React's invariant error messages with error IDs to provide a better debugging support in production. Check out the blog post [here](https://facebook.github.io/react/blog/2016/07/11/introducing-reacts-error-code-system.html). +The error code system substitutes React's error messages with error IDs to +provide a better debugging support in production. Check out the blog post +[here](https://reactjs.org/blog/2016/07/11/introducing-reacts-error-code-system.html). -## Note for cutting a new React release -1. For each release, we run `gulp react:extract-errors` to update the error codes before calling `npm run build`. The build process uses `codes.json` for a production (minified) build; there should be no warning like `Error message "foo" cannot be found` for a successful release. -2. The updated `codes.json` file should be synced back to the master branch. The error decoder page in our documentation site uses `codes.json` from master; if the json file has been updated, the docs site should also be rebuilt (`rake copy_error_codes` is included in the default `rake release` task). -3. It's not recommended to run `gulp react:extract-errors` directly in master since it may contain commits that are not cherry-picked to a release branch. These error messages might be changed/removed before cutting a new release, and we don't want to add intermediate/temporary error messages to `codes.json`. However, if a PR changes an existing error message and there's a specific production test (which is rare), it's ok to update `codes.json` for that. Please use `gulp react:extract-errors` and don't edit the file manually. - -## Structure -The error code system consists of 5 parts: -- [`codes.json`](https://github.com/facebook/react/blob/master/scripts/error-codes/codes.json) contains the mapping from IDs to error messages. This file is generated by the Gulp plugin and is used by both the Babel plugin and the error decoder page in our documentation. This file is append-only, which means an existing code in the file will never be changed/removed. -- [`gulp-extract-errors.js`](https://github.com/facebook/react/blob/master/scripts/error-codes/gulp-extract-errors.js) is a gulp plugin that traverses our codebase and updates `codes.json`. Use it by calling `gulp react:extract-errors`. -- [`dev-expression-with-codes.js`](https://github.com/facebook/react/blob/master/scripts/error-codes/dev-expression-with-codes.js) is a Babel pass that rewrites error messages to IDs for a production (minified) build. Notice that this plugin is not in `.babelrc`; it's being used in the [`gulpfile.js`](https://github.com/facebook/react/blob/master/gulpfile.js#L21) and it has to be run before [`rewrite-modules`](https://github.com/facebook/fbjs/blob/master/packages/babel-preset-fbjs/plugins/rewrite-modules.js) since we search for `require('invariant')` but not `require('./invariant')`. -- [`reactProdInvariant.js`](https://github.com/facebook/react/blob/master/src/shared/utils/reactProdInvariant.js) is the replacement for `invariant` in production. This file gets imported by the Babel plugin and should _not_ be used manually. -- [`ErrorDecoderComponent`](https://github.com/facebook/react/blob/master/docs/_js/ErrorDecoderComponent.js) is a React component that lives at https://facebook.github.io/react/docs/error-decoder.html. This page takes parameters like `?invariant=109&args[]=Foo` and displays a corresponding error message. Our documentation site's [`Rakefile`](https://github.com/facebook/react/blob/master/docs/Rakefile#L64-L69) has a task (`bundle exec rake copy_error_codes`) for adding the latest `codes.json` to the error decoder page. This task is included in the default `bundle exec rake release` task. +- [`codes.json`](https://github.com/facebook/react/blob/main/scripts/error-codes/codes.json) + contains the mapping from IDs to error messages. This file is generated by the + Gulp plugin and is used by both the Babel plugin and the error decoder page in + our documentation. This file is append-only, which means an existing code in + the file will never be changed/removed. +- [`extract-errors.js`](https://github.com/facebook/react/blob/main/scripts/error-codes/extract-errors.js) + is an node script that traverses our codebase and updates `codes.json`. You + can test it by running `yarn extract-errors`. It works by crawling the build + artifacts directory, so you need to have either run the build script or + downloaded pre-built artifacts (e.g. with `yarn download build`). It works + with partial builds, too. +- [`transform-error-messages`](https://github.com/facebook/react/blob/main/scripts/error-codes/transform-error-messages.js) + is a Babel pass that rewrites error messages to IDs for a production + (minified) build. diff --git a/scripts/error-codes/Types.js b/scripts/error-codes/Types.js index 5f7fe7f0062..b13d6306764 100644 --- a/scripts/error-codes/Types.js +++ b/scripts/error-codes/Types.js @@ -1,13 +1,11 @@ /** - * Copyright (c) 2013-present, Facebook, Inc. - * All rights reserved. + * Copyright (c) Meta Platforms, Inc. and affiliates. * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. * * @flow */ 'use strict'; -/*:: export type ErrorMap = { [id: string]: string; }; */ +export type ErrorMap = {[id: string]: string, ...}; diff --git a/scripts/error-codes/__tests__/__snapshots__/transform-error-messages.js.snap b/scripts/error-codes/__tests__/__snapshots__/transform-error-messages.js.snap new file mode 100644 index 00000000000..95987c0cd15 --- /dev/null +++ b/scripts/error-codes/__tests__/__snapshots__/transform-error-messages.js.snap @@ -0,0 +1,81 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`error transform handles deeply nested expressions 1`] = ` +"var val = (a, (b, +// eslint-disable-next-line react-internal/prod-error-codes +new Error('foo')));" +`; + +exports[`error transform handles deeply nested expressions 2`] = ` +"var val = (a, ( +// eslint-disable-next-line react-internal/prod-error-codes +b, new Error('foo')));" +`; + +exports[`error transform handles escaped backticks in template string 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(231, listener, type));" +`; + +exports[`error transform handles ignoring errors that are comment-excluded inside ternary expressions 1`] = ` +"/*! FIXME (minify-errors-in-prod): Unminified error message in production build!*/ +/*! "bar"*/ +var val = someBool ? +//eslint-disable-next-line react-internal/prod-error-codes +new Error('foo') : someOtherBool ? new Error('bar') : +//eslint-disable-next-line react-internal/prod-error-codes +new Error('baz');" +`; + +exports[`error transform handles ignoring errors that are comment-excluded outside ternary expressions 1`] = ` +"//eslint-disable-next-line react-internal/prod-error-codes +var val = someBool ? new Error('foo') : someOtherBool ? new Error('bar') : new Error('baz');" +`; + +exports[`error transform should not touch other calls or new expressions 1`] = ` +"new NotAnError(); +NotAnError();" +`; + +exports[`error transform should output FIXME for errors that don't have a matching error code 1`] = ` +"/*! FIXME (minify-errors-in-prod): Unminified error message in production build!*/ +/*! "This is not a real error message."*/ +Error('This is not a real error message.');" +`; + +exports[`error transform should output FIXME for errors that don't have a matching error code, unless opted out with a comment 1`] = ` +"// eslint-disable-next-line react-internal/prod-error-codes +Error('This is not a real error message.');" +`; + +exports[`error transform should replace error constructors (no new) 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(16));" +`; + +exports[`error transform should replace error constructors 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(16));" +`; + +exports[`error transform should support error constructors with concatenated messages 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(7, foo, bar));" +`; + +exports[`error transform should support extra arguments to error constructor 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(7, foo, bar), { + cause: error +});" +`; + +exports[`error transform should support interpolating arguments with concatenation 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(7, foo, bar));" +`; + +exports[`error transform should support interpolating arguments with template strings 1`] = ` +"import _formatProdErrorMessage from "shared/formatProdErrorMessage"; +Error(_formatProdErrorMessage(7, foo, bar));" +`; diff --git a/scripts/error-codes/__tests__/dev-expression-with-codes-test.js b/scripts/error-codes/__tests__/dev-expression-with-codes-test.js deleted file mode 100644 index 4a459a55082..00000000000 --- a/scripts/error-codes/__tests__/dev-expression-with-codes-test.js +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (c) 2013-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -/* eslint-disable quotes */ -'use strict'; - -let babel = require('babel-core'); -let devExpressionWithCodes = require('../dev-expression-with-codes'); - -function transform(input) { - return babel.transform(input, { - plugins: [devExpressionWithCodes], - }).code; -} - -function compare(input, output) { - var compiled = transform(input); - expect(compiled).toEqual(output); -} - -var oldEnv; - -describe('dev-expression', () => { - beforeEach(() => { - oldEnv = process.env.NODE_ENV; - process.env.NODE_ENV = ''; - }); - - afterEach(() => { - process.env.NODE_ENV = oldEnv; - }); - - it('should replace __DEV__ in if', () => { - compare( -` -if (__DEV__) { - console.log('foo') -}`, -` -if (process.env.NODE_ENV !== 'production') { - console.log('foo'); -}` - ); - }); - - it('should replace warning calls', () => { - compare( - "warning(condition, 'a %s b', 'c');", - "process.env.NODE_ENV !== 'production' ? warning(condition, 'a %s b', 'c') : void 0;" - ); - }); - - it("should add `reactProdInvariant` when it finds `require('invariant')`", () => { - compare( -"var invariant = require('invariant');", - -`var _prodInvariant = require('reactProdInvariant'); - -var invariant = require('invariant');` - ); - }); - - it('should replace simple invariant calls', () => { - compare( - "invariant(condition, 'Do not override existing functions.');", - "var _prodInvariant = require('reactProdInvariant');\n\n" + - "!condition ? " + - "process.env.NODE_ENV !== 'production' ? " + - "invariant(false, 'Do not override existing functions.') : " + - `_prodInvariant('16') : void 0;` - ); - }); - - it("should only add `reactProdInvariant` once", () => { - var expectedInvariantTransformResult = ( - "!condition ? " + - "process.env.NODE_ENV !== 'production' ? " + - "invariant(false, 'Do not override existing functions.') : " + - `_prodInvariant('16') : void 0;` - ); - - compare( -`var invariant = require('invariant'); -invariant(condition, 'Do not override existing functions.'); -invariant(condition, 'Do not override existing functions.');`, - -`var _prodInvariant = require('reactProdInvariant'); - -var invariant = require('invariant'); -${expectedInvariantTransformResult} -${expectedInvariantTransformResult}` - ); - }); - - it('should support invariant calls with args', () => { - compare( - "invariant(condition, 'Expected %s target to be an array; got %s', 'foo', 'bar');", - "var _prodInvariant = require('reactProdInvariant');\n\n" + - "!condition ? " + - "process.env.NODE_ENV !== 'production' ? " + - "invariant(false, 'Expected %s target to be an array; got %s', 'foo', 'bar') : " + - `_prodInvariant('7', 'foo', 'bar') : void 0;` - ); - }); - - it('should support invariant calls with a concatenated template string and args', () => { - compare( - "invariant(condition, 'Expected a component class, ' + 'got %s.' + '%s', 'Foo', 'Bar');", - "var _prodInvariant = require('reactProdInvariant');\n\n" + - "!condition ? " + - "process.env.NODE_ENV !== 'production' ? " + - "invariant(false, 'Expected a component class, got %s.%s', 'Foo', 'Bar') : " + - `_prodInvariant('18', 'Foo', 'Bar') : void 0;` - ); - }); - - it('should warn in non-test envs if the error message cannot be found', () => { - spyOn(console, 'warn'); - transform("invariant(condition, 'a %s b', 'c');"); - - expect(console.warn.calls.count()).toBe(1); - expect(console.warn.calls.argsFor(0)[0]).toBe( - 'Error message "a %s b" ' + - 'cannot be found. The current React version ' + - 'and the error map are probably out of sync. ' + - 'Please run `gulp react:extract-errors` before building React.' - ); - }); - - it('should not warn in test env if the error message cannot be found', () => { - process.env.NODE_ENV = 'test'; - - spyOn(console, 'warn'); - transform("invariant(condition, 'a %s b', 'c');"); - - expect(console.warn.calls.count()).toBe(0); - - process.env.NODE_ENV = ''; - }); -}); diff --git a/scripts/error-codes/__tests__/evalToString-test.js b/scripts/error-codes/__tests__/evalToString-test.js deleted file mode 100644 index efc6b4bb695..00000000000 --- a/scripts/error-codes/__tests__/evalToString-test.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2013-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -var evalToString = require('../evalToString'); -var babylon = require('babylon'); - -var parse = (source) => babylon.parse( - `(${source});` -).program.body[0].expression; // quick way to get an exp node - -var parseAndEval = (source) => evalToString(parse(source)); - -describe('evalToString', () => { - it('should support StringLiteral', () => { - expect(parseAndEval(`'foobar'`)).toBe('foobar'); - expect(parseAndEval(`'yowassup'`)).toBe('yowassup'); - }); - - it('should support string concat (`+`)', () => { - expect(parseAndEval(`'foo ' + 'bar'`)).toBe('foo bar'); - }); - - it('should throw when it finds other types', () => { - expect(() => parseAndEval(`'foo ' + true`)).toThrowError(/Unsupported type/); - expect(() => parseAndEval(`'foo ' + 3`)).toThrowError(/Unsupported type/); - expect(() => parseAndEval(`'foo ' + null`)).toThrowError(/Unsupported type/); - expect(() => parseAndEval(`'foo ' + undefined`)).toThrowError(/Unsupported type/); - }); -}); diff --git a/scripts/error-codes/__tests__/invertObject-test.js b/scripts/error-codes/__tests__/invertObject-test.js index dff7c25035a..af047dc4212 100644 --- a/scripts/error-codes/__tests__/invertObject-test.js +++ b/scripts/error-codes/__tests__/invertObject-test.js @@ -1,16 +1,14 @@ /** - * Copyright (c) 2013-present, Facebook, Inc. - * All rights reserved. + * Copyright (c) Meta Platforms, Inc. and affiliates. * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ 'use strict'; -var invertObject = require('../invertObject'); +const invertObject = require('../invertObject'); -var objectValues = (target) => Object.keys(target).map((key) => target[key]); +const objectValues = target => Object.keys(target).map(key => target[key]); describe('invertObject', () => { it('should return an empty object for an empty input', () => { @@ -18,37 +16,49 @@ describe('invertObject', () => { }); it('should invert key-values', () => { - expect(invertObject({ - a: '3', - b: '4', - })).toEqual({ + expect( + invertObject({ + a: '3', + b: '4', + }) + ).toEqual({ 3: 'a', 4: 'b', }); }); - it('should take the last value when there\'re duplications in vals', () => { - expect(invertObject({ - a: '3', - b: '4', - c: '3', - })).toEqual({ + it('should take the last value when there are duplications in vals', () => { + expect( + invertObject({ + a: '3', + b: '4', + c: '3', + }) + ).toEqual({ 4: 'b', 3: 'c', }); }); it('should preserve the original order', () => { - expect(Object.keys(invertObject({ - a: '3', - b: '4', - c: '3', - }))).toEqual(['3', '4']); + expect( + Object.keys( + invertObject({ + a: '3', + b: '4', + c: '3', + }) + ) + ).toEqual(['3', '4']); - expect(objectValues(invertObject({ - a: '3', - b: '4', - c: '3', - }))).toEqual(['c', 'b']); + expect( + objectValues( + invertObject({ + a: '3', + b: '4', + c: '3', + }) + ) + ).toEqual(['c', 'b']); }); }); diff --git a/scripts/error-codes/__tests__/transform-error-messages.js b/scripts/error-codes/__tests__/transform-error-messages.js new file mode 100644 index 00000000000..c1058aede48 --- /dev/null +++ b/scripts/error-codes/__tests__/transform-error-messages.js @@ -0,0 +1,168 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +let babel = require('@babel/core'); +let devExpressionWithCodes = require('../transform-error-messages'); + +function transform(input, options = {}) { + return babel.transform(input, { + plugins: [[devExpressionWithCodes, options]], + }).code; +} + +let oldEnv; + +describe('error transform', () => { + beforeEach(() => { + oldEnv = process.env.NODE_ENV; + process.env.NODE_ENV = ''; + }); + + afterEach(() => { + process.env.NODE_ENV = oldEnv; + }); + + it('should replace error constructors', () => { + expect( + transform(` +new Error('Do not override existing functions.'); +`) + ).toMatchSnapshot(); + }); + + it('should replace error constructors (no new)', () => { + expect( + transform(` +Error('Do not override existing functions.'); +`) + ).toMatchSnapshot(); + }); + + it("should output FIXME for errors that don't have a matching error code", () => { + expect( + transform(` +Error('This is not a real error message.'); +`) + ).toMatchSnapshot(); + }); + + it( + "should output FIXME for errors that don't have a matching error " + + 'code, unless opted out with a comment', + () => { + // TODO: Since this only detects one of many ways to disable a lint + // rule, we should instead search for a custom directive (like + // no-minify-errors) instead of ESLint. Will need to update our lint + // rule to recognize the same directive. + expect( + transform(` +// eslint-disable-next-line react-internal/prod-error-codes +Error('This is not a real error message.'); +`) + ).toMatchSnapshot(); + } + ); + + it('should not touch other calls or new expressions', () => { + expect( + transform(` +new NotAnError(); +NotAnError(); +`) + ).toMatchSnapshot(); + }); + + it('should support interpolating arguments with template strings', () => { + expect( + transform(` +new Error(\`Expected \${foo} target to be an array; got \${bar}\`); +`) + ).toMatchSnapshot(); + }); + + it('should support interpolating arguments with concatenation', () => { + expect( + transform(` +new Error('Expected ' + foo + ' target to be an array; got ' + bar); +`) + ).toMatchSnapshot(); + }); + + it('should support error constructors with concatenated messages', () => { + expect( + transform(` +new Error(\`Expected \${foo} target to \` + \`be an array; got \${bar}\`); +`) + ).toMatchSnapshot(); + }); + + it('handles escaped backticks in template string', () => { + expect( + transform(` +new Error(\`Expected \\\`\$\{listener\}\\\` listener to be a function, instead got a value of \\\`\$\{type\}\\\` type.\`); +`) + ).toMatchSnapshot(); + }); + + it('handles ignoring errors that are comment-excluded inside ternary expressions', () => { + expect( + transform(` +let val = someBool + ? //eslint-disable-next-line react-internal/prod-error-codes + new Error('foo') + : someOtherBool + ? new Error('bar') + : //eslint-disable-next-line react-internal/prod-error-codes + new Error('baz'); +`) + ).toMatchSnapshot(); + }); + + it('handles ignoring errors that are comment-excluded outside ternary expressions', () => { + expect( + transform(` +//eslint-disable-next-line react-internal/prod-error-codes +let val = someBool + ? new Error('foo') + : someOtherBool + ? new Error('bar') + : new Error('baz'); +`) + ).toMatchSnapshot(); + }); + + it('handles deeply nested expressions', () => { + expect( + transform(` +let val = + (a, + (b, + // eslint-disable-next-line react-internal/prod-error-codes + new Error('foo'))); +`) + ).toMatchSnapshot(); + + expect( + transform(` +let val = + (a, + // eslint-disable-next-line react-internal/prod-error-codes + (b, new Error('foo'))); +`) + ).toMatchSnapshot(); + }); + + it('should support extra arguments to error constructor', () => { + expect( + transform(` +new Error(\`Expected \${foo} target to \` + \`be an array; got \${bar}\`, {cause: error}); +`) + ).toMatchSnapshot(); + }); +}); diff --git a/scripts/error-codes/codes.json b/scripts/error-codes/codes.json index fb8006fdf2b..d8c8e0b7685 100644 --- a/scripts/error-codes/codes.json +++ b/scripts/error-codes/codes.json @@ -1,5 +1,5 @@ { - "0": "React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.", + "0": "Encountered an invalid child; DOM elements are not valid children of React components.", "1": "update(): expected target of %s to be an array; got %s.", "2": "update(): expected spec of %s to be an array; got %s. Did you forget to wrap your parameter in an array?", "3": "update(): You provided a key path to update() that did not contain one of %s. Did you forget to include {%s: ...}?", @@ -9,61 +9,61 @@ "7": "Expected %s target to be an array; got %s", "8": "update(): expected spec of %s to be an array of arrays; got %s. Did you forget to wrap your parameters in an array?", "9": "update(): expected spec of %s to be a function; got %s.", - "10": "findAllInRenderedTree(...): instance must be a composite component", + "10": "instance must be a composite component", "11": "TestUtils.scryRenderedDOMComponentsWithClass expects a className as a second argument.", "12": "ReactShallowRenderer render(): Invalid component element.%s", "13": "ReactShallowRenderer render(): Shallow rendering works only with custom components, not primitives (%s). Instead of calling `.render(el)` and inspecting the rendered output, look at `el.props` directly instead.", "14": "TestUtils.Simulate expects a component instance and not a ReactElement.TestUtils.Simulate will not work if you are using shallow rendering.", - "15": "reactComponentExpect(...): instance must be a composite component", + "15": "instance must be a composite component", "16": "Do not override existing functions.", "17": "All native instances should have a tag.", "18": "Expected a component class, got %s.%s", "19": "Expect a native root tag, instead got %s", "20": "RawText \"%s\" must be wrapped in an explicit component.", - "21": "findNodeHandle(...): Argument is not a component (type: %s, keys: %s)", - "22": "findNodeHandle(...): Unable to find node handle for unmounted component.", + "21": "Argument is not a component (type: %s, keys: %s)", + "22": "Unable to find node handle for unmounted component.", "23": "onlyChild must be passed a children with exactly one child.", "24": "Mismatched list of contexts in callback queue", "25": "Trying to release an instance into a pool of a different type.", "26": "Unexpected node: %s", - "27": "Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction.", + "27": "Cannot initialize a transaction when there is already an outstanding transaction.", "28": "Transaction.closeAll(): Cannot close transaction when none are open.", - "29": "accumulate(...): Accumulated items must be not be null or undefined.", - "30": "accumulateInto(...): Accumulated items must not be null or undefined.", - "31": "Objects are not valid as a React child (found: %s).%s", + "29": "Accumulated items must be not be null or undefined.", + "30": "Accumulated items must not be null or undefined.", + "31": "Objects are not valid as a React child (found: %s). If you meant to render a collection of children, use an array instead.", "32": "Unable to find element with ID %s.", "33": "getNodeFromInstance: Invalid argument.", "34": "React DOM tree root should always have a node reference.", "35": "isAncestor: Invalid argument.", "36": "getParentInstance: Invalid argument.", - "37": "_registerComponent(...): Target container is not a DOM element.", + "37": "_Target container is not a DOM element.", "38": "parentComponent must be a valid React Component", "39": "ReactDOM.render(): Invalid component element.%s", - "40": "unmountComponentAtNode(...): Target container is not a DOM element.", - "41": "mountComponentIntoNode(...): Target container is not valid.", + "40": "Target container is not a DOM element.", + "41": "Target container is not valid.", "42": "You're trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\n%s", "43": "You're trying to render a component to the document but you didn't use server rendering. We can't do this without using server rendering due to cross-browser quirks. See ReactDOMServer.renderToString() for server rendering.", "44": "findDOMNode was called on an unmounted component.", "45": "Element appears to be neither ReactComponent nor DOMNode (keys: %s)", "46": "renderToString(): You must pass a valid ReactElement.", "47": "renderToStaticMarkup(): You must pass a valid ReactElement.", - "48": "injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.", + "48": "You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.", "49": "DOMProperty: Properties that have side effects must use property: %s", "50": "DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s", - "51": "dangerouslyRenderMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString for server rendering.", - "52": "dangerouslyRenderMarkup(...): Missing markup.", + "51": "Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString for server rendering.", + "52": "Missing markup.", "53": "Danger: Assigning to an already-occupied result index.", "54": "Danger: Did not assign to every index of resultList.", "55": "Danger: Expected markup to render %s nodes, but rendered %s.", - "56": "dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering.", - "57": "dangerouslyReplaceNodeWithMarkup(...): Missing markup.", - "58": "dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString().", - "59": "%s is a void element tag and must not have `children` or use `props.dangerouslySetInnerHTML`.%s", + "56": "Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering.", + "57": "Missing markup.", + "58": "Cannot replace markup of the node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString().", + "59": "%s is a void element tag and must not have `children` or use `props.dangerouslySetInnerHTML`.", "60": "Can only set one of `children` or `props.dangerouslySetInnerHTML`.", - "61": "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.", - "62": "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s", + "61": "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://react.dev/link/dangerously-set-inner-html for more information.", + "62": "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.", "63": "Must be mounted to trap events", - "64": "trapBubbledEvent(...): Requires node to be rendered.", + "64": "Requires node to be rendered.", "65": "Invalid tag: %s", "66": "<%s> tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg , , and ) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.", "67": "Missing closing comment for text component %s", @@ -82,9 +82,9 @@ "80": "mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.", "81": "mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.", "82": "%s.getInitialState(): must return an object or null", - "83": "createClass(...): Class specification must implement a `render` method.", + "83": "Class specification must implement a `render` method.", "84": "%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.", - "85": "setState(...): takes an object of state variables to update or a function which returns an object of state variables.", + "85": "takes an object of state variables to update or a function which returns an object of state variables.", "86": "SimpleEventPlugin: Unhandled event type, `%s`.", "87": "Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa.", "88": "Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink.", @@ -98,13 +98,13 @@ "96": "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.", "97": "EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.", "98": "EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.", - "99": "EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.", - "100": "EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.", + "99": "EventPluginRegistry: More than one plugin attempted to publish the same event name, `%s`.", + "100": "EventPluginRegistry: More than one plugin attempted to publish the same registration name, `%s`.", "101": "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.", "102": "EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.", - "103": "executeDirectDispatch(...): Invalid `event`.", + "103": "Invalid `event`.", "104": "ReactCompositeComponent: injectEnvironment() can only be called once.", - "105": "%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.", + "105": "A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.", "106": "%s.state: must be set to an object or null", "107": "%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", "108": "%s.getChildContext(): key \"%s\" is not defined in childContextTypes.", @@ -112,14 +112,14 @@ "110": "Stateless function components cannot have refs.", "111": "There is no registered component for the tag %s", "112": "getNextDescendantID(%s, %s): Received an invalid React DOM ID.", - "113": "getNextDescendantID(...): React has made an invalid assumption about the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.", + "113": "React has made an invalid assumption about the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.", "114": "getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s", - "115": "traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.", + "115": "Cannot traverse from and to the same ID, `%s`.", "116": "traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do not have a parent path.", "117": "traverseParentPath(%s, %s, ...): Detected an infinite loop while traversing the React DOM ID tree. This may be due to malformed IDs: %s", "118": "updateTextContent called on non-empty component.", - "119": "addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).", - "120": "removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).", + "119": "Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://react.dev/link/refs-must-have-owner).", + "120": "Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://react.dev/link/refs-must-have-owner).", "121": "performUpdateIfNecessary: Unexpected batch number (current %s, pending %s)", "122": "%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.", "123": "ReactUpdates: must inject a reconcile transaction class and batching strategy", @@ -136,12 +136,424 @@ "134": "Touch data should have been recorded on start", "135": "Cannot find single active touch", "136": "Attempted to update component `%s` that has already been unmounted (or failed to mount).", - "137": "%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s", + "137": "%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.", "138": "Touch object is missing identifier.", "139": "ReactTestRenderer: .update() can't be called after unmount.", "140": "Expected hook events to fire for the child before its parent includes it in onSetChildren().", "141": "Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren().", "142": "Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).", "143": "React.Children.only expected to receive a single React element child.", - "144": "React.PropTypes type checking code is stripped in production." + "144": "Item must have been set", + "145": "hostContainerInfo should be populated before getPublicInstance is called.", + "146": "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.", + "147": "Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.", + "148": "Expected ref to be a function or a string.", + "149": "Element ref was specified as a string (%s) but no owner was set. You may have multiple copies of React loaded. (details: https://react.dev/link/refs-must-have-owner).", + "150": "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.", + "151": "An iterable object provided no iterator.", + "152": "Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.", + "153": "Resuming work not yet implemented.", + "154": "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue.", + "155": "An indeterminate component should never have mounted. This error is likely caused by a bug in React. Please file an issue.", + "156": "Unknown unit of work tag (%s). This error is likely caused by a bug in React. Please file an issue.", + "157": "Invalid type of work. This error is likely caused by a bug in React. Please file an issue.", + "158": "There must be pending props for an initial mount. This error is likely caused by a bug in React. Please file an issue.", + "159": "There should always be pending or memoized props. This error is likely caused by a bug in React. Please file an issue.", + "160": "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.", + "161": "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.", + "162": "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.", + "163": "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.", + "164": "A coroutine cannot have host component children.", + "165": "Should be resolved by now. This error is likely caused by a bug in React. Please file an issue.", + "166": "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.", + "167": "An indeterminate component should have become determinate before completing. This error is likely caused by a bug in React. Please file an issue.", + "168": "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.", + "169": "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.", + "170": "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.", + "171": "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.", + "172": "The custom dialog was already injected.", + "173": "Injected showDialog() must be a function.", + "174": "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.", + "175": "Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.", + "176": "Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.", + "177": "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.", + "178": "Should have next effect. This error is likely caused by a bug in React. Please file an issue.", + "179": "Should have a pending commit. This error is likely caused by a bug in React. Please file an issue.", + "180": "Commit phase errors should be scheduled to recover with task priority. This error is likely caused by a bug in React. Please file an issue.", + "181": "Switch statement should be exhaustive. This error is likely caused by a bug in React. Please file an issue.", + "182": "performWork was called recursively. This error is likely caused by a bug in React. Please file an issue.", + "183": "Should have found an error boundary. This error is likely caused by a bug in React. Please file an issue.", + "184": "No error for given unit of work. This error is likely caused by a bug in React. Please file an issue.", + "185": "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.", + "186": "Task updates can only be scheduled as a nested update or inside batchedUpdates.", + "187": "flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.", + "188": "Unable to find node on an unmounted component.", + "189": "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.", + "190": "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.", + "191": "Invalid argument passed as callback. Expected a function. Instead received: %s", + "192": "React depends on requestAnimationFrame. Make sure that you load a polyfill in older browsers.", + "193": "The server renderer does not implement support for array children yet.", + "194": "Fiber needs to be injected to handle a fiber target for controlled events. This error is likely caused by a bug in React. Please file an issue.", + "195": "The internal instance must be a React host component. This error is likely caused by a bug in React. Please file an issue.", + "196": "Missing injection for fiber getContextForSubtree", + "197": "Injected invokeGuardedCallback() must be a function.", + "198": "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.", + "199": "Fiber owners should not show up in Stack stack traces.", + "200": "Target container is not a DOM element.", + "201": "ReactDOM.render(): Invalid component element. Instead of passing a string like 'div', pass React.createElement('div') or
.", + "202": "ReactDOM.render(): Invalid component element. Instead of passing a class like Foo, pass React.createElement(Foo) or .", + "203": "ReactDOM.render(): Invalid component element. This may be caused by unintentionally loading two independent copies of React.", + "204": "ReactDOM.render(): Invalid component element.", + "205": "renderToNodeStream(): Invalid component element.", + "206": "renderToStaticNodeStream(): Invalid component element.", + "207": "ReactDOMServer.renderToNodeStream(): The streaming API is not available in the browser. Use ReactDOMServer.renderToString() instead.", + "208": "ReactDOMServer.renderToStaticNodeStream(): The streaming API is not available in the browser. Use ReactDOMServer.renderToStaticMarkup() instead.", + "209": "renderToString(): Invalid component element.", + "210": "renderToStaticMarkup(): Invalid component element.", + "211": "Missing injection for fiber findDOMNode", + "212": "Missing injection for stack findDOMNode", + "213": "Element appears to be neither ReactComponent nor DOMNode. Keys: %s", + "214": "toTree() does not yet know how to handle nodes with tag=%s", + "215": "something went wrong", + "216": "Text children should already be flattened.", + "217": "ReactART does not support the type \"%s\"", + "218": "ReactART: Can not insert node before itself", + "219": "getInspectorDataForViewTag() is not available in production", + "220": "Container does not support insertBefore operation", + "221": "Tried to register two views with the same name %s", + "222": "View config not found for name %s", + "224": "Can't read from currently-mounting component. This error is likely caused by a bug in React. Please file an issue.", + "225": "Unexpected object passed to ReactTestInstance constructor (tag: %s). This is probably a bug in React.", + "226": "Unsupported component type %s in test renderer. This is probably a bug in React.", + "227": "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.", + "228": "TestUtils.Simulate expected a DOM node as the first argument but received a React element. Pass the DOM node you wish to simulate the event on instead. Note that TestUtils.Simulate will not work if you are using shallow rendering.", + "229": "TestUtils.Simulate expected a DOM node as the first argument but received a component instance. Pass the DOM node you wish to simulate the event on instead.", + "230": "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.unstable_createPortal).", + "231": "Expected `%s` listener to be a function, instead got a value of `%s` type.", + "232": "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).", + "233": "Unsupported top level event type \"%s\" dispatched", + "234": "Event cannot be both direct and bubbling: %s", + "235": "Persistent reconciler is disabled.", + "236": "Noop reconciler is disabled.", + "237": "Mutating reconciler is disabled.", + "238": "Task updates can only be scheduled as a nested update or inside batchedUpdates. This error is likely caused by a bug in React. Please file an issue.", + "239": "Measure not implemented yet", + "240": "Text components are not supported for now.", + "241": "Text components are not yet supported.", + "242": "%s: %s type `%s` is invalid; it must be a function, usually from the `prop-types` package, but received `%s`.", + "243": "renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.", + "244": "Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue.", + "245": "performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.", + "246": "Should be working on a root. This error is likely caused by a bug in React. Please file an issue.", + "247": "A call cannot have host component children.", + "248": "Not implemented.", + "249": "ReactShallowRenderer render(): Shallow rendering works only with custom components, but the provided element type was `%s`.", + "250": "batch.render: Cannot render a batch that already committed.", + "251": "batch.commit: Cannot commit a batch multiple times.", + "252": "The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.", + "253": "work.commit(): Cannot commit while already rendering. This likely means you attempted to commit from inside a lifecycle method.", + "254": "Element ref was specified as a string (%s) but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a functional component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://react.dev/link/refs-must-have-owner for more information.", + "255": "Expected ReactFbErrorUtils.invokeGuardedCallback to be a function.", + "257": "Portals are not currently supported by the server renderer. Render them conditionally so that they only appear on the client render.", + "258": "Unknown element-like object type: %s. This is likely a bug in React. Please file an issue.", + "259": "The experimental Call and Return types are not currently supported by the server renderer.", + "260": "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.", + "261": "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.", + "262": "Expired work should have completed. This error is likely caused by a bug in React. Please file an issue.", + "263": "dispatch: Cannot dispatch during the render phase.", + "264": "An error logging effect should not have been scheduled if no errors were captured. This error is likely caused by a bug in React. Please file an issue.", + "265": "This unit of work tag cannot capture errors. This error is likely caused by a bug in React. Please file an issue.", + "266": "A subscription must return an unsubscribe function.", + "267": "The argument must be a React element, but you passed %s.", + "268": "Argument appears to not be a ReactComponent. Keys: %s", + "269": "Profiler must specify an \"id\" string and \"onRender\" function as props", + "270": "The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue.", + "271": "Failed to replay rendering after an error. This is likely caused by a bug in React. Please file an issue with a reproducing case to help us find it.", + "273": "Nesting of within is not currently supported.", + "274": "Text strings must be rendered within a component.", + "275": "The current renderer does not support mutation. This error is likely caused by a bug in React. Please file an issue.", + "276": "React depends on requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://react.dev/link/react-polyfills", + "277": "Context.unstable_read(): Context can only be read while React is rendering, e.g. inside the render method or getDerivedStateFromProps.", + "278": "unstable_createRoot(...): Target container is not a DOM element.", + "279": "Trying to release an event instance into a pool of a different type.", + "280": "setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.", + "281": "Finished root should have a work-in-progress. This error is likely caused by a bug in React. Please file an issue.", + "282": "If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.", + "283": "Element type is invalid. Received a promise that resolves to: %s. Promise elements must resolve to a class or function.", + "284": "Expected ref to be a function, an object returned by React.createRef(), or undefined/null.", + "285": "The root failed to unmount after an error. This is likely a bug in React. Please file an issue.", + "286": "%s(...): the first argument must be a React class instance. Instead received: %s.", + "287": "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `schedule/tracking` module with `schedule/tracking-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://react.dev/link/profiling", + "288": "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `schedule/tracing` module with `schedule/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://react.dev/link/profiling", + "289": "Function components cannot have refs.", + "290": "Element ref was specified as a string (%s) but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://react.dev/link/refs-must-have-owner for more information.", + "292": "The matcher `toHaveYielded` expects an instance of React Test Renderer.\n\nTry: expect(Scheduler).toHaveYielded(expectedYields)", + "293": "Context can only be read while React is rendering, e.g. inside the render method or getDerivedStateFromProps.", + "294": "ReactDOMServer does not yet support Suspense.", + "295": "ReactDOMServer does not yet support lazy-loaded components.", + "297": "The matcher `unstable_toHaveYielded` expects an instance of React Test Renderer.\n\nTry: expect(ReactTestRenderer).unstable_toHaveYielded(expectedYields)", + "298": "Hooks can only be called inside the body of a function component.", + "299": "Target container is not a DOM element.", + "300": "Rendered fewer hooks than expected. This may be caused by an accidental early return statement.", + "301": "Too many re-renders. React limits the number of renders to prevent an infinite loop.", + "302": "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://react.dev/link/profiling", + "303": "ReactDOMServer did not find an internal fallback frame for Suspense. This is a bug in React. Please file an issue.", + "304": "Maximum number of concurrent React renderers exceeded. This can happen if you are not properly destroying the Readable provided by React. Ensure that you call .destroy() on it if you no longer want to read from it, and did not read to the end. If you use .pipe() this should be automatic.", + "305": "The current renderer does not support hydration. This error is likely caused by a bug in React. Please file an issue.", + "306": "Element type is invalid. Received a promise that resolves to: %s. Lazy element type must resolve to a class or function.%s", + "307": "Hooks can only be called inside the body of a function component. (https://react.dev/link/invalid-hook-call)", + "308": "Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().", + "309": "Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://react.dev/link/strict-mode-string-ref", + "310": "Rendered more hooks than during the previous render.", + "311": "Should have a queue. You are likely calling Hooks conditionally, which is not allowed. (https://react.dev/link/invalid-hook-call)", + "312": "Rendered more hooks than during the previous render", + "313": "Unknown priority level. This error is likely caused by a bug in React. Please file an issue.", + "314": "Pinged unknown suspense boundary type. This is probably a bug in React.", + "315": "Suspense boundaries are never on the root. This is probably a bug in React.", + "316": "Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.", + "317": "Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.", + "318": "A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.", + "319": "A dehydrated suspense boundary must commit before trying to render. This is probably a bug in React.", + "320": "Expected ReactFiberErrorDialog.showErrorDialog to be a function.", + "321": "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.", + "322": "forwardRef requires a render function but was given %s.", + "323": "React has blocked a javascript: URL as a security precaution.", + "326": "Expected a valid priority level", + "327": "Should not already be working.", + "328": "Should have a work-in-progress.", + "329": "Unknown root exit status.", + "330": "Should be working on an effect.", + "331": "Cannot flush passive effects while already rendering.", + "332": "Unknown priority level.", + "333": "This should have a parent host component initialized. This error is likely caused by a bug in React. Please file an issue.", + "334": "Accumulated items must not be null or undefined.", + "335": "ReactDOMServer does not yet support the event API.", + "338": "ReactDOMServer does not yet support the fundamental API.", + "340": "Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.", + "341": "We just came from a parent so we must have had a parent. This is a bug in React.", + "342": "A React component suspended while rendering, but no fallback UI was specified.\n\nAdd a component higher in the tree to provide a loading indicator or placeholder to display.", + "343": "ReactDOMServer does not yet support scope components.", + "344": "Expected prepareToHydrateHostSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.", + "345": "Root did not complete. This is a bug in React.", + "348": "ensureListeningTo(): received a container that was not an element node. This is likely a bug in React.", + "349": "Expected a work-in-progress root. This is a bug in React. Please file an issue.", + "350": "Cannot read from mutable source during the current render without tearing. This may be a bug in React. Please file an issue.", + "351": "Unsupported Server Component type: %s", + "352": "React Lazy Components are not yet supported on the server.", + "353": "A server block should never encode any other slots. This is a bug in React.", + "354": "getInspectorDataForViewAtPoint() is not available in production.", + "355": "The object passed back from useOpaqueIdentifier is meant to be passed through to attributes only. Do not read the value directly. (TODO: This feature was never released so we should be able to remove this error from the map.)", + "356": "Could not read the cache.", + "357": "The current renderer does not support React Scopes. This error is likely caused by a bug in React. Please file an issue.", + "358": "Invalid update priority: %s. This is a bug in React.", + "360": "Invalid lane: %s. This is a bug in React.", + "361": "The current renderer does not support test selectors. This error is likely caused by a bug in React. Please file an issue.", + "362": "Could not find React container within specified host subtree.", + "363": "Test selector API is not supported by this renderer.", + "364": "Invalid host root specified. Should be either a React container or a node with a testname attribute.", + "365": "Invalid selector type specified.", + "366": "ReactDOM.createEventHandle: setListener called on an target that did not have a corresponding root. This is likely a bug in React.", + "367": "ReactDOM.createEventHandle: setListener called on an element target that is not managed by React. Ensure React rendered the DOM element.", + "368": "ReactDOM.createEventHandle: setListener called on an invalid target. Provide a valid EventTarget or an element managed by React.", + "369": "ReactDOM.createEventHandle: setter called on an invalid target. Provide a valid EventTarget or an element managed by React.", + "370": "ReactDOM.createEventHandle: setter called with an invalid callback. The callback must be a function.", + "371": "Text string must be rendered within a component.\n\nText: %s", + "372": "Cannot call unstable_createEventHandle with \"%s\", as it is not an event known to React.", + "373": "This Hook is not supported in Server Components.", + "374": "Event handlers cannot be passed to Client Component props.%s\nIf you need interactivity, consider converting part of this to a Client Component.", + "375": "Functions cannot be passed directly to Client Components unless you explicitly expose it by marking it with \"use server\". Or maybe you meant to call this function rather than return it.%s", + "376": "Only global symbols received from Symbol.for(...) can be passed to Client Components. The symbol Symbol.for(%s) cannot be found among global symbols.%s", + "377": "BigInt (%s) is not yet supported in Client Component props.%s", + "378": "Type %s is not supported in Client Component props.%s", + "379": "Refs cannot be used in Server Components, nor passed to Client Components.", + "380": "Reading the cache is only supported while rendering.", + "381": "This feature is not supported by ReactSuspenseTestUtils.", + "382": "This query has received more parameters than the last time the same query was used. Always pass the exact number of parameters that the query needs.", + "383": "This query has received fewer parameters than the last time the same query was used. Always pass the exact number of parameters that the query needs.", + "384": "Refreshing the cache is not supported in Server Components.", + "385": "A mutable source was mutated while the %s component was rendering. This is not supported. Move any mutations into event handlers or effects.", + "386": "The current renderer does not support microtasks. This error is likely caused by a bug in React. Please file an issue.", + "387": "Should have a current fiber. This is a bug in React.", + "388": "Expected to find a bailed out fiber. This is a bug in React.", + "389": "There can only be one root segment. This is a bug in React.", + "390": "Aborted, errored or already flushed boundaries should not be flushed again. This is a bug in React.", + "391": "A previously unvisited boundary must have exactly one root segment. This is a bug in React.", + "392": "A root segment ID must have been assigned by now. This is a bug in React.", + "393": "Cache cannot be refreshed during server rendering.", + "394": "startTransition cannot be called during server rendering.", + "395": "An ID must have been assigned before we can complete the boundary.", + "396": "More boundaries or placeholders than we expected to ever emit.", + "397": "Unknown insertion mode. This is a bug in React.", + "398": "`dangerouslySetInnerHTML` does not work on