diff --git a/.circleci/config.yml b/.circleci/config.yml index c1bfaf61a1c88..1e0ad3c5ce870 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ version: 2.1 orbs: - win: circleci/windows@1.0.0 + win: circleci/windows@5.0 executors: linux-node: @@ -25,6 +25,13 @@ executors: EMSDK_NOTTY: "1" macos: xcode: "13.4.1" + resource_class: macos.x86.medium.gen2 + mac-arm64: + environment: + EMSDK_NOTTY: "1" + macos: + xcode: "14.2.0" + resource_class: macos.m1.medium.gen1 commands: download-chrome: @@ -35,9 +42,10 @@ commands: command: | # TODO: Make these part of the base image apt-get install libu2f-udev libvulkan1 - wget -O ~/chrome.deb https://dl.google.com/linux/direct/google-chrome-beta_current_amd64.deb + # wget -O ~/chrome.deb https://dl.google.com/linux/direct/google-chrome-beta_current_amd64.deb # If that download link breaks, temporarily use this URL instead: # wget -O ~/chrome.deb https://storage.googleapis.com/webassembly/chrome/google-chrome-stable_current_amd64.deb + wget -O ~/chrome.deb https://dl.google.com/linux/direct/google-chrome-unstable_current_amd64.deb dpkg -i ~/chrome.deb emsdk-env: description: "emsdk_env.sh" @@ -49,6 +57,10 @@ commands: # In order make our external version of emscripten use the emsdk # config we need to explicitly set EM_CONFIG here. echo "export EM_CONFIG=~/emsdk/.emscripten" >> $BASH_ENV + bootstrap: + description: "bootstrap" + steps: + - run: ./bootstrap npm-install: description: "npm ci" steps: @@ -86,8 +98,8 @@ commands: wget https://nodejs.org/dist/v${version}/node-v${version}-linux-x64.tar.xz fi tar xf node-v${version}-linux-x64.tar.xz - echo "NODE_JS = [os.path.expanduser('~/node-v${version}-linux-x64/bin/node')]" >> ~/emsdk/.emscripten - echo "JS_ENGINES = [NODE_JS]" >> ~/emsdk/.emscripten + echo "NODE_JS_TEST = [os.path.expanduser('~/node-v${version}-linux-x64/bin/node')]" >> ~/emsdk/.emscripten + echo "JS_ENGINES = [NODE_JS_TEST]" >> ~/emsdk/.emscripten echo "if os.path.exists(V8_ENGINE[0]): JS_ENGINES.append(V8_ENGINE)" >> ~/emsdk/.emscripten cat ~/emsdk/.emscripten echo "export PATH=\"$HOME/node-v${version}-linux-x64/bin:\$PATH\"" >> $BASH_ENV @@ -100,7 +112,7 @@ commands: description: "install canary version of node" steps: - install-node-version: - node_version: "20.0.0-v8-canary202302081604228b65" + node_version: "22.0.0-v8-canary20231108ff311d5a39" canary: true install-v8: description: "install v8 using jsvu" @@ -116,7 +128,7 @@ commands: export PATH="`pwd`/node-v15.14.0-linux-x64/bin:${PATH}" npm install jsvu -g jsvu --os=default --engines=v8 - build: + install-emsdk: description: "Install emsdk" steps: - run: @@ -126,7 +138,6 @@ commands: tar -C ~ -xf ~/emsdk-main.tar.gz mv ~/emsdk-main ~/emsdk cd ~/emsdk - ./emsdk update-tags ./emsdk install tot ./emsdk activate tot # Remove the emsdk version of emscripten to save space in the @@ -149,6 +160,7 @@ commands: echo "final .emscripten:" cat ~/emsdk/.emscripten - emsdk-env + - bootstrap - npm-install build-libs: description: "Build all libraries" @@ -158,6 +170,7 @@ commands: command: | ./emcc --clear-cache - pip-install + - run: apt-get install ninja-build - run: name: embuilder build ALL command: | @@ -206,6 +219,7 @@ commands: name: submodule update command: git submodule update --init - emsdk-env + - bootstrap - npm-install - pip-install upload-test-results: @@ -224,17 +238,31 @@ commands: type: string default: "" steps: + - when: + # We only set EMTEST_RETRY_FLAKY on pull requests. When we run + # normal CI jobs on branches like main we still want to be able to + # detect flakyness. + condition: ${CIRCLE_PULL_REQUEST} + steps: + set-retry-flaky-tests - run: name: run tests (<< parameters.title >>) command: | + env ./test/runner << parameters.test_targets >> - $EMSDK_PYTHON ./tools/check_clean.py + $EMSDK_PYTHON ./test/check_clean.py freeze-cache: description: "Freeze emscripten cache" steps: - run: name: Add EM_FROZEN_CACHE to bash env command: echo "export EM_FROZEN_CACHE=1" >> $BASH_ENV + set-retry-flaky-tests: + description: "Set EMTEST_RETRY_FLAKY" + steps: + - run: + name: Add EMTEST_RETRY_FLAKY to bash env + command: echo "export EMTEST_RETRY_FLAKY=2" >> $BASH_ENV run-tests-linux: description: "Runs emscripten tests" parameters: @@ -259,14 +287,68 @@ commands: test_targets: << parameters.test_targets >> title: << parameters.title >> - upload-test-results - test-firefox: + run-tests-chrome: + description: "Runs browser tests under chrome" + parameters: + test_targets: + description: "Test suites to run" + type: string + title: + description: "Name of given test suite" + type: string + default: "" + steps: + - prepare-for-tests + - download-chrome + - run: + name: run tests (<< parameters.title >>) + environment: + EMTEST_LACKS_SOUND_HARDWARE: "1" + EMTEST_DETECT_TEMPFILE_LEAKS: "0" + # --no-sandbox because we are running as root and chrome requires + # this flag for now: https://crbug.com/638180 + CHROME_FLAGS_BASE: "--no-first-run -start-maximized --no-sandbox --use-gl=swiftshader --user-data-dir=/tmp/chrome-emscripten-profile --enable-experimental-web-platform-features" + CHROME_FLAGS_HEADLESS: "--headless=new --remote-debugging-port=1234" + CHROME_FLAGS_WASM: "--enable-experimental-webassembly-features --js-flags=\"--experimental-wasm-memory64 --experimental-wasm-stack-switching --experimental-wasm-type-reflection\"" + CHROME_FLAGS_NOCACHE: "--disk-cache-dir=/dev/null --disk-cache-size=1 --media-cache-size=1 --disable-application-cache --incognito" + command: | + export EMTEST_BROWSER="/usr/bin/google-chrome $CHROME_FLAGS_BASE $CHROME_FLAGS_HEADLESS $CHROME_FLAGS_WASM $CHROME_FLAGS_NOCACHE" + # There are tests in the browser test suite that using libraries + # that are not included by "./embuilder build ALL". For example the + # PIC version of libSDL which is used by test_sdl2_misc_main_module + export EM_FROZEN_CACHE="" + test/runner << parameters.test_targets >> + setup-macos: + steps: + - run: + name: Install brew package dependencies + environment: + HOMEBREW_NO_AUTO_UPDATE: "1" + command: | + brew list cmake || brew install cmake + brew list ninja || brew install ninja + brew list python3 || brew install python3 + brew list pkg-config || brew install pkg-config + - checkout + - run: + name: submodule update + command: git submodule update --init + run-tests-firefox: description: "Runs emscripten tests under firefox" + parameters: + test_targets: + description: "Test suites to run" + type: string + title: + description: "Name of given test suite" + type: string + default: "" steps: - prepare-for-tests - run: name: download firefox command: | - wget -O ~/ff.tar.bz2 "https://download.mozilla.org/?product=firefox-devedition-latest-ssl&os=linux64&lang=en-US" + wget -O ~/ff.tar.bz2 "https://download.mozilla.org/?product=firefox-nightly-latest-ssl&os=linux64&lang=en-US" tar -C ~ -xf ~/ff.tar.bz2 - run: name: configure firefox @@ -275,19 +357,11 @@ commands: cat > ~/tmp-firefox-profile/user.js \<>) environment: GALLIUM_DRIVER: softpipe # TODO: use the default llvmpipe when it supports more extensions # TODO: Do GL testing when https://bugzil.la/1375585 (lack of WebGL @@ -307,37 +381,11 @@ commands: echo "-----" echo "Running browser tests" echo "-----" - test/runner browser skip:browser.test_sdl2_mouse skip:browser.test_html5_webgl_create_context skip:browser.test_webgl_offscreen_canvas_in_pthread skip:browser.test_webgl_offscreen_canvas_in_mainthread_after_pthread skip:browser.test_glut_glutget + test/runner << parameters.test_targets >> # posix and emrun suites are disabled because firefox errors on # "Firefox is already running, but is not responding." # TODO: find out a way to shut down and restart firefox - upload-test-results - test-chrome: - description: "Runs emscripten browser tests under chrome" - steps: - - prepare-for-tests - - download-chrome - - run: - name: run tests - environment: - EMTEST_LACKS_SOUND_HARDWARE: "1" - EMTEST_DETECT_TEMPFILE_LEAKS: "0" - # --no-sandbox because we are running as root and chrome requires - # this flag for now: https://crbug.com/638180 - CHROME_FLAGS_BASE: "--no-first-run -start-maximized --no-sandbox --use-gl=swiftshader --user-data-dir=/tmp/chrome-emscripten-profile --enable-experimental-web-platform-features" - CHROME_FLAGS_HEADLESS: "--headless --remote-debugging-port=1234" - CHROME_FLAGS_WASM: "--enable-experimental-webassembly-features" - CHROME_FLAGS_NOCACHE: "--disk-cache-dir=/dev/null --disk-cache-size=1 --media-cache-size=1 --disable-application-cache --incognito" - command: | - export EMTEST_BROWSER="/usr/bin/google-chrome $CHROME_FLAGS_BASE $CHROME_FLAGS_HEADLESS $CHROME_FLAGS_WASM $CHROME_FLAGS_NOCACHE" - # There are tests in the browser test suite that using libraries - # that are not included by "./embuilder build ALL". For example the - # PIC version of libSDL which is used by test_sdl2_misc_main_module - export EM_FROZEN_CACHE="" - test/runner emrun - # skip test_zzz_zzz_4gb_fail as it OOMs on the current bot - test/runner posixtest_browser.test_pthread_create_1_1 browser skip:browser.test_zzz_zzz_4gb_fail - - upload-test-results test-sockets-chrome: description: "Runs emscripten sockets tests under chrome" steps: @@ -351,8 +399,8 @@ commands: # --no-sandbox becasue we are running as root and chrome requires # this flag for now: https://crbug.com/638180 CHROME_FLAGS_BASE: "--no-first-run -start-maximized --no-sandbox --use-gl=swiftshader --user-data-dir=/tmp/chrome-emscripten-profile" - CHROME_FLAGS_HEADLESS: "--headless --remote-debugging-port=1234" - CHROME_FLAGS_WASM: "--enable-features=WebAssembly --enable-features=SharedArrayBuffer --disable-features=WebAssemblyTrapHandler --js-flags=\"--experimental-wasm-threads --harmony-sharedarraybuffer --no-wasm-disable-structured-cloning\"" + CHROME_FLAGS_HEADLESS: "--headless=new --remote-debugging-port=1234" + CHROME_FLAGS_WASM: "--enable-experimental-webassembly-features --js-flags=\"--experimental-wasm-memory64\"" CHROME_FLAGS_NOCACHE: "--disk-cache-dir=/dev/null --disk-cache-size=1 --media-cache-size=1 --disable-application-cache --incognito" command: | export EMTEST_BROWSER="/usr/bin/google-chrome $CHROME_FLAGS_BASE $CHROME_FLAGS_HEADLESS $CHROME_FLAGS_WASM $CHROME_FLAGS_NOCACHE" @@ -365,6 +413,7 @@ jobs: steps: - checkout - pip-install + - run: tools/maint/update_settings_docs.py --check - run: make -C site text - run: tools/maint/check_emcc_help_text.py - run: make -C site html @@ -403,12 +452,13 @@ jobs: resource_class: xlarge environment: EMCC_CORES: 16 + EMCC_USE_NINJA: 1 steps: - checkout - run: name: get wasmer command: | - wget https://github.com/wasmerio/wasmer/releases/download/0.11.0/wasmer-linux-amd64.tar.gz + wget https://github.com/wasmerio/wasmer/releases/download/v3.1.1/wasmer-linux-amd64.tar.gz tar -xf wasmer-linux-amd64.tar.gz mkdir ~/vms cp bin/wasmer ~/vms @@ -429,7 +479,7 @@ jobs: tar xvf libclang_rt.builtins-wasm32-wasi-11.0.tar.gz -C ~/wasi-sdk tar xvf wasi-sysroot-11.0.tar.gz -C ~/wasi-sdk/ - install-v8 - - build + - install-emsdk - build-libs - persist # Perhaps we don't need to run this suite with every commit. Consider moving this to FYI bot. @@ -440,6 +490,8 @@ jobs: test_targets: "posixtest" test-core0: executor: bionic + environment: + EMTEST_SKIP_NODE_CANARY: "1" steps: - run-tests-linux: test_targets: "core0" @@ -447,6 +499,7 @@ jobs: executor: bionic environment: EMTEST_BROWSER: "node" + EMTEST_SKIP_NODE_CANARY: "1" steps: - run-tests-linux: # also run a few asan tests. Run these with frozen_cache disabled @@ -463,11 +516,16 @@ jobs: asan.test_dyncall_specific_minimal_runtime asan.test_async_hello asan.test_dlfcn_basic - asan.test_async_hello_stack_switching + asan.test_async_hello_jspi asan.test_cubescript + asan.test_wasm_worker_hello + asan.test_externref_emjs_dynlink + asan.test_asyncify_longjmp + asan.test_pthread_run_on_main_thread lsan.test_stdio_locking lsan.test_dlfcn_basic - lsan.test_pthread_create" + lsan.test_pthread_create + lsan.test_pthread_exit_main_stub" - freeze-cache - run-tests: # also run a single test of EMTEST_BROWSER=node. @@ -480,6 +538,8 @@ jobs: - upload-test-results test-core3: executor: bionic + environment: + EMTEST_SKIP_NODE_CANARY: "1" steps: - run-tests-linux: frozen_cache: false @@ -488,43 +548,87 @@ jobs: title: "core3+extras" test_targets: " lto2.test_dylink_syslibs_all + lto2.test_float_builtins + lto0.test_exceptions_allowed_uncaught core3 core2g.test_externref corez.test_dylink_iostream core2ss.test_pthread_dylink core2ss.test_pthread_thread_local_storage core2s.test_dylink_syslibs_missing_assertions + core2s.test_module_wasm_memory wasm2js3.test_memorygrowth_2 - other.test_unistd_fstatfs_wasmfs wasmfs.test_hello_world - wasmfs.test_hello_world_standalone wasmfs.test_unistd_links* wasmfs.test_atexit_standalone wasmfs.test_emscripten_get_now wasmfs.test_dyncall_specific_minimal_runtime + wasmfs.test_fcntl_misc + wasmfs.test_readdir_rawfs wasmfs.test_utime wasmfs.test_unistd_unlink wasmfs.test_unistd_access wasmfs.test_unistd_close wasmfs.test_unistd_truncate wasmfs.test_readdir + wasmfs.test_readdir_unlink wasmfs.test_unistd_pipe + wasmfs.test_unistd_io + wasmfs.test_unistd_curdir + wasmfs.test_poll + wasmfs.test_fs_64bit + wasmfs.test_fs_write + wasmfs.test_fs_writev + wasmfs.test_fs_writev_rawfs + wasmfs.test_fs_writeFile + wasmfs.test_fs_writeFile_rawfs + wasmfs.test_fs_readv + wasmfs.test_fs_write + wasmfs.test_fs_readv_rawfs + wasmfs.test_fs_nodefs_nofollow + wasmfs.test_fs_nodefs_readdir + wasmfs.test_fs_nodefs_home + wasmfs.test_fs_nodefs_cloexec + wasmfs.test_fs_nodefs_cloexec_rawfs + wasmfs.test_fs_errorstack + wasmfs.test_fs_errorstack_rawfs + wasmfs.test_fs_emptyPath + wasmfs.test_webidl wasmfs.test_dlfcn_self wasmfs.test_dlfcn_unique_sig wasmfs.test_dylink_basics wasmfs.test_exit_status wasmfs.test_minimal_runtime_memorygrowth wasmfs.test_mmap_anon* + wasmfs.test_mount wasmfs.test_getcwd_with_non_ascii_name wasmfs.test_stat wasmfs.test_fstatat + wasmfs.test_futimens wasmfs.test_unistd_links_memfs - wasmfs.test_fcntl_open" + wasmfs.test_fcntl_open + wasmfs.test_fs_js_api + wasmfs.test_fs_llseek + wasmfs.test_fs_llseek_rawfs + wasmfs.test_freetype" test-wasm2js1: + environment: + EMTEST_SKIP_NODE_CANARY: "1" executor: bionic steps: - run-tests-linux: test_targets: "wasm2js1" + test-wasm64l: + environment: + EMTEST_SKIP_NODE_CANARY: "1" + executor: bionic + steps: + - run-tests-linux: + frozen_cache: false + # On older versions of node wasm64l.test_bigswitch uses a lot (~3.5Gb) + # of memory, so skip it here, but run it in test-wasm64 instead which + # has node canary installed. + test_targets: "wasm64l skip:wasm64l.test_bigswitch" test-wasm64: # We don't use `bionic` here since its tool old to run recent node versions: # `/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found` @@ -532,46 +636,127 @@ jobs: steps: - prepare-for-tests # The linux-python image uses /home/circleci rather than /root and jsvu - # hardcodes /root into its launcher scripts do we need to reinstall v8. + # hardcodes /root into its launcher scripts so we need to reinstall v8. - run: rm -rf $HOME/.jsvu - install-v8 - - run-tests: - title: "wasm64l" - test_targets: "wasm64l" - install-node-canary - run-tests: title: "wasm64" - test_targets: "wasm64" + test_targets: " + wasm64 + core_2gb.test_*em_asm* + core_2gb.test_*embind* + wasm64l.test_bigswitch + other.test_memory64_proxies + other.test_failing_growth_wasm64" + - upload-test-results + test-wasm64-4gb: + environment: + LANG: "C.UTF-8" + # Only run 2 tests at a time to avoid OOM (since each tests used >4gb) + EMCC_CORES: "2" + # We don't use `bionic` here since its too old to run recent node versions: + # `/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found` + executor: linux-python + steps: + - prepare-for-tests + # The linux-python image uses /home/circleci rather than /root and jsvu + # hardcodes /root into its launcher scripts so we need to reinstall v8. + - run: rm -rf $HOME/.jsvu + - install-v8 + - install-node-canary + - run-tests: + title: "wasm64_4gb" + test_targets: "wasm64_4gb" - upload-test-results + test-jsc: + executor: linux-python + steps: + - checkout + - run: + name: submodule update + command: git submodule update --init + - pip-install + - install-emsdk + - run: + name: install jsc + command: | + cd $HOME + wget https://nodejs.org/dist/v18.12.0/node-v18.12.0-linux-x64.tar.xz + tar -xf node-v18.12.0-linux-x64.tar.xz + export PATH="`pwd`/node-v18.12.0-linux-x64/bin:${PATH}" + npm install jsvu -g + jsvu --os=default --engines=javascriptcore + echo "JSC_ENGINE = [os.path.expanduser('~/.jsvu/bin/javascriptcore')]" >> ~/emsdk/.emscripten + echo "JS_ENGINES = [JSC_ENGINE]" >> ~/emsdk/.emscripten + - run-tests: + test_targets: " + core0.test_hello_argc + other.test_modularize_incoming + other.test_modularize_incoming_export_name" + test-spidermonkey: + executor: linux-python + steps: + - checkout + - run: + name: submodule update + command: git submodule update --init + - pip-install + - install-emsdk + - run: + name: install spidermonkey + command: | + cd $HOME + wget https://nodejs.org/dist/v18.12.0/node-v18.12.0-linux-x64.tar.xz + tar -xf node-v18.12.0-linux-x64.tar.xz + export PATH="`pwd`/node-v18.12.0-linux-x64/bin:${PATH}" + npm install jsvu -g + jsvu --os=default --engines=spidermonkey + echo "SPIDERMONKEY_ENGINE = [os.path.expanduser('~/.jsvu/bin/spidermonkey')]" >> ~/emsdk/.emscripten + echo "JS_ENGINES = [SPIDERMONKEY_ENGINE]" >> ~/emsdk/.emscripten + - run-tests: + test_targets: " + core0.test_hello_argc + core2.test_demangle_stacks_symbol_map" test-node-compat: - # We don't use `bionic` here since its tool old to run recent node versions: + # We don't use `bionic` here since its too old to run recent node versions: # `/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found` executor: linux-python + environment: + LANG: "C.UTF-8" + EMTEST_SKIP_V8: "1" steps: - checkout - run: name: submodule update command: git submodule update --init - pip-install - - build + - install-emsdk - install-node-canary - run-tests: - title: "selected subset" + title: "node (canary)" test_targets: " + other.test_deterministic other.test_gen_struct_info other.test_native_call_before_init other.test_node_unhandled_rejection - core2.test_hello_world" + core2.test_hello_world + core0.test_pthread_join_and_asyncify + core0.test_async_ccall_promise_jspi + core0.test_async_ccall_promise_exit_runtime_jspi + core0.test_cubescript_jspi" # Run some basic tests with the minimum version of node that we currently # support. - install-node-version: node_version: "10.19.0" - run-tests: - title: "selected subset" + title: "node (oldest / 10.19.0)" test_targets: " other.test_gen_struct_info other.test_native_call_before_init + other.test_js_optimizer_verbose other.test_node_unhandled_rejection + other.test_full_js_library* core2.test_hello_world" # Run a few test with the most recent version of node # In particular we have some tests that require node flags on older @@ -580,11 +765,13 @@ jobs: - run-tests: # Run tests that on older versions of node would require flags, but # those flags should not be injected on newer versions. - title: "selected subset" + title: "node (latest)" test_targets: "-v other.test_gen_struct_info other.test_native_call_before_init other.test_node_unhandled_rejection + other.test_js_optimizer_verbose + other.test_min_node_version other.test_node_emscripten_num_logical_cores core2.test_pthread_create core2.test_i64_invoke_bigint @@ -595,8 +782,10 @@ jobs: - upload-test-results test-other: executor: bionic + environment: + EMTEST_SKIP_NODE_CANARY: "1" steps: - - run: apt-get install ninja-build + - run: apt-get install ninja-build scons - run-tests-linux: # some native-dependent tests fail because of the lack of native # headers on emsdk-bundled clang @@ -604,11 +793,54 @@ jobs: test-browser-chrome: executor: bionic steps: - - test-chrome + - run-tests-chrome: + title: "browser" + # Skip test_4gb_fail as it OOMs on the current bot + test_targets: " + browser skip:browser.test_4gb_fail + " + test-browser-chrome-wasm64: + executor: bionic + steps: + - run-tests-chrome: + title: "browser64" + test_targets: "browser64" + test-browser-chrome-2gb: + executor: bionic + steps: + - run-tests-chrome: + title: "browser_2gb" + test_targets: "browser_2gb" + test-browser-chrome-wasm64-4gb: + executor: bionic + environment: + EMTEST_SKIP_NODE_CANARY: "1" + steps: + - run-tests-chrome: + title: "browser64_4gb" + test_targets: "browser64_4gb" test-browser-firefox: executor: bionic steps: - - test-firefox + - run-tests-firefox: + title: "browser" + # browser.test_sdl2_mouse and/or SDL2 should be fixed. The case happens + # to be failing here, and the root cause might be related with the + # initial position of the mouse pointer relative to the canvas. + # browser.test_html5_webgl_create_context is skipped because + # anti-aliasing is not well supported. + # browser.test_webgl_offscreen_canvas_in_pthread and + # browser.test_webgl_offscreen_canvas_in_mainthread_after_pthread + # are crashing Firefox (bugzil.la/1281796). The former case is + # further blocked by issue #6897. + test_targets: "browser skip:browser.test_sdl2_mouse skip:browser.test_html5_webgl_create_context skip:browser.test_webgl_offscreen_canvas_in_pthread skip:browser.test_webgl_offscreen_canvas_in_mainthread_after_pthread skip:browser.test_glut_glutget" + # TODO(sbc): Re-enable once we figure out why the emrun tests are + # locking up. + #test-browser-chrome-emrun: + # executor: bionic + # steps: + # - run-tests-chrome: + # test_targets: "emrun" test-sockets-chrome: executor: bionic steps: @@ -616,8 +848,9 @@ jobs: # windows and mac do not have separate build and test jobs, as they only run # a limited set of tests; it is simpler and faster to do it all in one job. test-windows: + working_directory: "~/path with spaces" executor: - name: win/vs2019 + name: win/server-2019 shell: bash.exe -eo pipefail environment: PYTHONUNBUFFERED: "1" @@ -629,63 +862,26 @@ jobs: EMTEST_SKIP_EH: "1" EMTEST_SKIP_WASM64: "1" EMTEST_SKIP_SIMD: "1" + EMTEST_SKIP_SCONS: "1" + EMTEST_SKIP_NODE_CANARY: "1" + EMTEST_BROWSER: "0" steps: - checkout - run: name: Install packages command: | - choco install cmake.portable ninja pkgconfiglite + choco install -y cmake.portable ninja pkgconfiglite - run: name: Add python to bash path command: echo "export PATH=\"$PATH:/c/Python27amd64/\"" >> $BASH_ENV - - build # note we do *not* build all libraries and freeze the cache; as we run # only limited tests here, it's more efficient to build on demand + - install-emsdk - pip-install: python: "$EMSDK_PYTHON" - run-tests: - title: "other subset" - test_targets: " - core0.test_dylink_basics - core2.test_sse1 - core2.test_ccall - core2.test_utf16 - core2.test_em_asm_unicode - core2.test_em_js - core2.test_em_js_pthreads - core2.test_unicode_js_library - other.test_reproduce - other.test_stack_overflow - other.test_dlmalloc_modes - other.test_c_preprocessor - other.test_prejs_unicode - other.test_em_js_side_module - other.test_es5_transpile - other.test_emcc_cflags - other.test_stdin - other.test_bad_triple - other.test_closure_externs - other.test_binaryen_debug - other.test_js_optimizer* - other.test_output_to_nowhere - other.test_emcc_dev_null - other.test_cmake* - other.test_system_include_paths - other.test_emar_response_file - other.test_special_chars_in_arguments - other.test_toolchain_profiler - other.test_realpath_nodefs - other.test_response_file_encoding - other.test_libc_progname - other.test_realpath - other.test_embed_file_dup - other.test_dot_a_all_contents_invalid - other.test_emcc_print_search_dirs - other.test_emcc_print_file_name - other.test_minimal_runtime_export_all_modularize - other.test_pkg_config* - other.test_pthreads_flag - other.test_sdl2_config" + title: "crossplatform tests" + test_targets: "--crossplatform-only" - upload-test-results # Run a single websockify-based test to ensure it works on windows. - run-tests: @@ -701,45 +897,50 @@ jobs: EMTEST_SKIP_V8: "1" EMTEST_SKIP_EH: "1" EMTEST_SKIP_WASM64: "1" - EMTEST_SKIP_SIMD: "1" + EMTEST_SKIP_SCONS: "1" EMCC_SKIP_SANITY_CHECK: "1" + # test_sse1 (the only @crossplatform native clang test) currently fails + # on the macOS bots). + EMTEST_LACKS_NATIVE_CLANG: "1" + EMTEST_SKIP_NODE_CANARY: "1" steps: - - run: - name: Install brew package dependencies - environment: - HOMEBREW_NO_AUTO_UPDATE: "1" - command: | - brew list cmake || brew install cmake - brew list ninja || brew install ninja - brew list python3 || brew install python3 - brew list pkg-config || brew install pkg-config + - setup-macos - attach_workspace: at: ~/ - - checkout - - run: - name: submodule update - command: git submodule update --init - run: name: Remove Linux binaries command: | rm -rf ~/emsdk ~/vms ~/.jsvu - - build # note we do *not* build all libraries and freeze the cache; as we run # only limited tests here, it's more efficient to build on demand + - install-emsdk - pip-install: python: "$EMSDK_PYTHON" - run-tests: - # skip other.test_stack_switching_size as we do not currently install - # d8 on mac - title: "other+extras" - test_targets: " - other - sockets.test_nodejs_sockets_echo* - core0.test_lua - core0.test_longjmp_standalone - core2.test_sse1 - skip:other.test_native_link_error_message - skip:other.test_stack_switching_size" + title: "crossplatform tests" + test_targets: "--crossplatform-only" + - upload-test-results + + test-mac-arm64: + executor: mac-arm64 + environment: + # We don't install d8 or modern node on the mac runner so we skip any + # tests that depend on those. + EMTEST_SKIP_V8: "1" + EMTEST_SKIP_EH: "1" + EMTEST_SKIP_WASM64: "1" + EMTEST_SKIP_SCONS: "1" + # Some native clang tests assume x86 clang (e.g. -sse2) + EMTEST_LACKS_NATIVE_CLANG: "1" + EMCC_SKIP_SANITY_CHECK: "1" + steps: + - setup-macos + - install-emsdk + # TODO: We can't currently do pip install here since numpy and other packages + # are currently missing arm64 macos binaries. + - run-tests: + title: "crossplatform tests" + test_targets: "--crossplatform-only" - upload-test-results workflows: @@ -768,6 +969,12 @@ workflows: - test-wasm64: requires: - build-linux + - test-wasm64-4gb: + requires: + - build-linux + - test-wasm64l: + requires: + - build-linux - test-wasm2js1: requires: - build-linux @@ -777,14 +984,26 @@ workflows: - test-browser-chrome: requires: - build-linux + - test-browser-chrome-2gb: + requires: + - build-linux + - test-browser-chrome-wasm64: + requires: + - build-linux + - test-browser-chrome-wasm64-4gb: + requires: + - build-linux - test-browser-firefox: requires: - build-linux - test-sockets-chrome: requires: - build-linux + - test-jsc + - test-spidermonkey - test-node-compat - test-windows + - test-mac-arm64 - test-mac: # The mac tester also uses the libraries built on the linux builder to # save total build time (this is fine because the libraries are wasm diff --git a/.clang-format b/.clang-format index 67b2920e310f9..a60db77c9266d 100644 --- a/.clang-format +++ b/.clang-format @@ -8,6 +8,7 @@ ConstructorInitializerIndentWidth: 2 SpaceAfterTemplateKeyword: false BinPackArguments: false BinPackParameters: false +WhitespaceSensitiveMacros: ['EM_ASM', 'EM_JS', 'EM_ASM_INT', 'EM_ASM_DOUBLE', 'EM_ASM_PTR', 'MAIN_THREAD_EM_ASM', 'MAIN_THREAD_EM_ASM_INT', 'MAIN_THREAD_EM_ASM_DOUBLE', 'MAIN_THREAD_EM_ASM_DOUBLE', 'MAIN_THREAD_ASYNC_EM_ASM'] --- Language: JavaScript BasedOnStyle: LLVM diff --git a/.eslintrc.yml b/.eslintrc.yml index b1702c9115eb3..d1e8a40d678b9 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -7,6 +7,7 @@ extends: parserOptions: ecmaVersion: 12 ignorePatterns: + - "out/" - "site/" - "cache/" - "third_party/" diff --git a/.flake8 b/.flake8 index 67bcf821fdb38..74d7233230b35 100644 --- a/.flake8 +++ b/.flake8 @@ -1,16 +1,16 @@ [flake8] ignore = E111,E114,E501,E261,E266,E121,E402,E241,W504,E741,B011,B023,U101 exclude = + ./node_modules/, # third-party code ./third_party/, # third-party code ./tools/filelock.py, # third-party code ./tools/scons/, # third-party code ./test/third_party/, # third-party code ./site/source/conf.py, - ./tools/debug/, ./system/lib/, # system libraries ./cache/, # download/built content .git -# The ports plugins have a lot of unused imports becuase +# The ports plugins have a lot of unused imports because # they need to implement the specific plugin APIs per-file-ignores = ./tools/ports/*.py: U100 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000000..6a2b5d37f4811 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,24 @@ +# This file contains a list of commits that are not likely what you +# are looking for in a blame, such as mass reformatting or renaming. +# You can set this file as a default ignore file for blame by running +# the following command. +# +# $ git config blame.ignoreRevsFile .git-blame-ignore-revs + +# Remove tabs and fix formatting in test/sse/. NFC (#18245) +3cd47cff5da467ae7ca2a29490d8b04af897023f + +# [embind docs] Reformat and cleanup whitespace. +9b1a5910c4f31cff4949541a42ac956ba45e4701 + +# [NFC] WasmFS: Run clang-format (#19995) +2384d4e16f5309a642481387edb3774913fab382 + +# Don't indent code inside C++ namespace in embind.h. NFC (#14098) +752f66a7434386b4a8ed6e0e6babdafc23d78047 + +# Remove indentation from C++ namespaces in embind code. NFC (#16400) +5dbf740fd2064c89bc1112897f960a49caa7b6d1 + +# Fix indentation in embind code. NFC (#17447) +14c106a0a8cbc539d6efe4a4e7b4ee7bbb73a0a6 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 701cafd448956..5ef53dcc0e773 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -19,3 +19,12 @@ along with its entire output. Even for runtime issues it helps a lot if you can include the full link command. Adding `-v` to the link command will show all of the sub-commands run which can help us diagnose your issue. + +Note: Where possible, please avoid attaching screen shots of code or console +logs. Instead, please include them as text so that they may be copied / +searched. To make code blocks more readable and syntax highlighted, please +escape them with three backticks before and after, like this: + +```cpp +int x = 20; +``` diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000..90e05c40d0459 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/archive.yml b/.github/workflows/archive.yml index f9bf26d522112..480bf446da5c9 100644 --- a/.github/workflows/archive.yml +++ b/.github/workflows/archive.yml @@ -15,13 +15,13 @@ jobs: archive: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: make dist run: | make dist version=`cat emscripten-version.txt | sed s/\"//g` echo "VERSION=$version" >> $GITHUB_ENV - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: emscripten-${{ env.VERSION }} path: emscripten-${{ env.VERSION }}.tar.bz2 diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 6bd21dfa895eb..2aabafe3c7fc7 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -19,15 +19,17 @@ jobs: security-events: write actions: read contents: read + # Needed to publish results + id-token: write steps: - name: "Checkout code" - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@c1aec4ac820532bab364f02a81873c555a0ba3a1 # v1.0.4 + uses: ossf/scorecard-action@80e868c13c90f172d68d1f4501dee99e2479f7af # v2.1.3 with: results_file: results.sarif results_format: sarif @@ -42,7 +44,7 @@ jobs: # Upload the results as artifacts (optional). - name: "Upload artifact" - uses: actions/upload-artifact@82c141cc518b40d92cc801eee768e7aafc9c2fa2 # v2.3.1 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: SARIF file path: results.sarif @@ -50,6 +52,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@5f532563584d71fdef14ee64d17bafb34f751ce5 # v1.0.26 + uses: github/codeql-action/upload-sarif@0b21cf2492b6b02c465a3e5d7c473717ad7721ba # v3.23.1 with: sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index 02aaa4dc30796..966eab3ea4729 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,9 @@ coverage.xml /.dotnet /.packages /artifacts + +# All the ps1 files are generated by bootstrap... +*.ps1 +# ...except the templates. +!/tools/run_python.ps1 +!/tools/run_python_compiler.ps1 diff --git a/.gitmodules b/.gitmodules index 391eaedc48e05..dae9c901f1a0b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "test/third_party/googletest"] path = test/third_party/googletest url = https://github.com/google/googletest +[submodule "test/third_party/wasi-test-suite"] + path = test/third_party/wasi-test-suite + url = https://github.com/khronosproject/wasi-test-suite diff --git a/.mypy.ini b/.mypy.ini index ec5da26d61cf1..6974ee7bb8f0c 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -2,6 +2,7 @@ mypy_path = third_party/,third_party/ply,third_party/websockify files = . exclude = (?x)( + cache | third_party | conf\.py | emrun\.py | diff --git a/.prettierrc.yml b/.prettierrc.yml index 32705ec1d0e72..127fb7d085709 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1,4 +1,3 @@ singleQuote: true bracketSpacing: false -arrowParens: avoid printWidth: 100 diff --git a/AUTHORS b/AUTHORS index 7e42decb1d5f3..312de41a8d90d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -592,3 +592,8 @@ a license to everyone to use it as detailed in LICENSE.) * Alexandra Cherdantseva * Michael Schmuki * Skye Gibney +* Piotr Wierciński +* 郑苏波 (Super Zheng) +* James Hu +* Jerry Zhuang +* Taisei Kon diff --git a/ChangeLog.md b/ChangeLog.md index 4ad279a87a730..75f7d15036dfa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -18,11 +18,415 @@ to browse the changes between the tags. See docs/process.md for more on how version tagging works. -3.1.34 (in development) +3.1.56 (in development) ----------------------- -- The prefered way to enable pthread is now to just the the standard `-pthread` +- emscripten will now generate an `unused-command-line-argument` warning if + a `-s` setting is specified more than once on the command line with + conflicting values. In this case the first setting is ignored. (#21464) + +3.1.55 - 03/01/24 +----------------- +- Update sdl2-mixer port from 2.6.0 to 2.8.0 +- In `STRICT` mode the `HEAPXX` symbols (such as `HEAP8` and `HEAP32`) are now + only exported on demand. This means that they must be added to + `EXPORTED_RUNTIME_METHODS` for them to appear on the `Module` object. For + now, this only effects users of `STRICT` mode. (#21439) +- Emscripten no longer supports `--memory-init-file` (i.e. extracting static + data into an external .mem file). This feature was only available under + wasm2js (`-sWASM=0`) anyway so this change will only affect users of this + setting. (#21217) +- `INITIAL_HEAP` setting is introduced to control the amount of initial + memory available for dynamic allocation without capping it. If you are + using `INITIAL_MEMORY`, consider switching to `INITIAL_HEAP`. Note that + it is currently not supported in all configurations (#21071). + +3.1.54 - 02/15/24 +----------------- +- SDL2 port updated from v2.24.2 to v2.26.0. (#21337) +- The `DEMANGLE_SUPPORT` setting and the associated `demangle` function are + now deprecated since Wasm stack traces always contain demangled symbols these + days. (#21346) +- The type of `EMSCRIPTEN_WEBGL_CONTEXT_HANDLE` was changed to unsigned and + the only valid error returned from `emscripten_webgl_create_context` is + now zero. This allows `EMSCRIPTEN_WEBGL_CONTEXT_HANDLE` to hold a pointer + to memory even in 2GB+ mode. Since `emscripten_webgl_create_context` never + returns anything except zero for its errors today this change should not + require any action. (#21268) +- Added `--use-port` option to `emcc`. This option allows ports to be enabled + by name and is designed to replace all existing `-sUSE_XXX` settings for + ports. You can use `--show-ports` to get the list of available ports that + can be used with this new option. (#21214) +- `--pre-js` and `--post-js` files can now opt into being run through the JS + preprocessor. This change was originally landed in #18525, but it got + reverted in #19006. Now it requires explicit opt-in by adding `#preprocess` to + the top of the JS file. This is useful as it allows things like `{{{ + POINTER_SIZE }}}` and `{{{ makeGetValue(..) }}}` to be used in pre/post JS + files, just like they can be in JS library files. (#21227) +- Added concept of contrib ports which are ports contributed by the wider + community and supported on a "best effort" basis. See + `tools/ports/contrib/README.md` for details.A first contrib port is + available via `--use-port=contrib.glfw3`: an emscripten port of glfw written + in C++ with many features like support for multiple windows. (#21244 and + #21276) +- Added concept of external ports which live outside emscripten and are + loaded on demand using the syntax `--use-port=/path/to/my_port.py` (#21316) +- `embuilder` can now build ports with options as well as external ports using + the same syntax introduced with `--use-port` + (ex: `embuilder sdl2_image:formats=png,jpg`) (#21345) +- Allow comments in response files. Any line starting with `#` is now ignored. + This is useful when listing exported symbols. (#21330) + +3.1.53 - 01/29/24 +----------------- +- The llvm version that emscripten uses was updated to 19.0.0 trunk. (#21165) + +3.1.52 - 01/19/24 +----------------- +- The core stack manipulation functions (`stackSave`, `stackRestore`, + `stackAlloc`) are no longer exported by default. Users of these function + now need to depend on them explicitly (either via `__deps` attributes or via + `-sEXPORTED_FUNCTIONS`). (#21075) +- Building with `pthreads+EXPORT_ES6` will now emit the worker file as + `NAME.worker.mjs` rather than `.js`. This is a necessary breaking change to + resolve other `pthreads+EXPORT_ES6` issues in Node.js (because Node.js is + affected by the suffix in some cases). (#21041) +- Include paths added by ports (e.g. `-sUSE_SDL=2`) now use `-isystem` rather + then `-I`. This means that files in user-specified include directories will + now take precedence over port includes. (#21014) +- Certain settings that only apply when generating JavaScript output will now + trigger a warning if used when generating only Wasm. +- Fix bug where `main` was mistakenly included in debug builds but not in + release builds. (#20971) +- Remove JAVA from the list of `.emscripten` config file settings. In the + past we used this to run the java version of closure compiler. If there are + folks who prefer to use the java version of closure compiler for some reason + it should be possible by adding `--platform=java` to `--closure-args` or + `EMCC_CLOSURE_ARGS` but emscripten will no longer do this automatically. + (#20919) +- The WORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG setting was + removed. This was a workaround from 2018 (#7459) that should no longer be + needed. (#20925) +- The `--default-obj-ext` command line flag was removed. (#20917) +- emcc will now treat `.bc` files as source files. These means that will get + compiled by clang before being passed to the linker. This matches the + behaviour of clang. (#20922) +- Emscripten now only supports browsers going back to certain versions. The + current set of minimum versions are: Chrome 32, Firefox 34, Safari 9. + Attempting to targets version older this using, for example + `MIN_CHROME_VERSION` will now result in build-time error. All of these + browser versions are at least 8 years old now so the hope is that nobody + is intending to target them today. (#20924) +- C++ objects passed into embind's val via constructors, methods, and call + function will not be automatically destroyed after the function call. This + makes the behavior consistent for invocations. +- The `SUPPORT_ERRNO` setting is now deprecated as it only controlled setting + errno from JS library functions and emscripten no longer requires this. + (#21074) + +3.1.51 - 12/13/23 +----------------- +- Support for explicitly targeting the legacy Internet Explorer or EdgeHTML + (edge version prior to the chromium-based edge) browsers via + `-sMIN_EDGE_VERSION/-sMIN_IE_VERSION` was removed. (#20881) +- Emscripten is now more strict about handling unsupported shared library + inputs. For example, under the old behaviour if a system shared library + such as `/usr/lib/libz.so` was passed to emscripten it would silently re-write + this to `-lz`, which would then search this a libz in its own sysroot. Now + this file is passed though the linker like any other input file and you will + see an `unknown file type` error from the linker (just like you would with the + native clang or gcc toolchains). (#20886) +- Support for explicitly targeting the legacy EdgeHTML browser (edge version + prior to the chromium-based edge) via `-sMIN_EDGE_VERSION` was removed. + Using `-sLEGACY_VM_SUPPORT` should still work if anyone still wanted to target + this or any other legacy browser. +- Breaking change: Using the `*glGetProcAddress()` family of functions now + requires passing a linker flag -sGL_ENABLE_GET_PROC_ADDRESS. This prevents + ports of native GL renderers from later accidentally attempting to activate + "dormant" features if web browser implementations gain new WebGL extensions in + the future, which `*glGetProcAddress()` is not able to support. (#20802) +- Added Hi DPI support to GLFW. When enabled, GLFW automatically accounts for + the `devicePixelRatio` browser property and changes the size of the canvas + accordingly (including dynamically if the canvas is moved from a 4K screen to + a 2K screen and vice-versa). `glfwGetFramebufferSize` now properly returns the + canvas size in pixels, while `glfwGetWindowSize` returns the canvas size is + screen size. By default, this feature is disabled. You can enable it before + creating a window by calling `glfwWindowHint(GLFW_SCALE_TO_MONITOR, + GLFW_TRUE)`. You can also dynamically change it after the window has been + created by calling `glfwSetWindowAttrib(window, GLFW_SCALE_TO_MONITOR, + GLFW_TRUE)`. (#20584) +- Transpilation to support older environments/browsers is now performed by babel + rather than closure compiler. This means that folks targeting older browsers + (e.g. `-sLEGACY_VM_SUPPORT`) do not need to ensure their code is closure + compliant. (#20879) + +3.1.50 - 11/29/23 +----------------- +- Add a port of mimalloc, a fast and scalable multithreaded allocator. To use + it, build with `-sMALLOC=mimalloc`. (#20651) +- When compiling, Emscripten will now invoke `clang` or `clang++` depending only + on whether `emcc` or `em++` was run. Previously it would determine which to + run based on individual file extensions. One side effect of this is that you + may now see a clang warning when building `.c` source files using `em++`: + `warning: treating 'c' input as 'c++' when in C++ mode`. This also means that + the `DEFAULT_TO_CXX` setting now only applies when linking and not when + compiling. (#20712) +- JavaScript library code can now use the full range of ES6 features and we rely + on closure compiler to transpile for ES5 when targeting older browsers. + For those that would rather perform transpilation separately outside of + emscripten you can use the `-sPOLYFILL=0` setting. (#20700) +- libcxx, libcxxabi, libunwind, and compiler-rt were updated to LLVM 17.0.4. + (#20705, #20707, and #20708) +- Remove `BENCHMARK` setting. That has not been used by the benchmark suite for + some time now (at least not by default), and is much less useful these days + given lazy compilation in VMs (which makes it impossible to truly benchmark + execution separately from compilation, which `BENCHMARK` hoped to do). +- Update GLFW handling of touch events to avoid sending duplicate mousedown and + and mouseup events. Maps touchmove to mousemove events for a single primary + touch. (#20805) + +3.1.49 - 11/14/23 +----------------- +- Many MEMORY64 fixes for browser and graphics APIs (#20678) +- The `glfwSetWindowSize` function no longer switches to fullscreen when the + width/height provided as parameters match the screen size. This behavior + now matches the behavior of SDL and glut. In order to switch to fullscreen, + the client code should invoke `Module.requestFullscreen(...)` from a user + triggered event otherwise the browser raises an error. (#20600) + +3.1.48 - 11/05/23 +----------------- +- The JS `assert` function is no longer available in release builds when + `-sSTRICT` is used. This should only affect users with custom JS library code + which doesn't use `#if ASSERTIONS` guards around their `assert` calls. This + behaviour matches that of `MINIMAL_RUNTIME`. (#20592) +- The minimum version of node required run the compiler was updated from + 10.19 to 16.20. This does not effect the node requirements of the generated + JavaScript code. (#20551) +- A new top-level `bootstrap` script was added. This script is for emscripten + developers and helps take a care of post-checkout tasks such as `npm install`. + If this script needs to be run (e.g. because package.json was changed, emcc + will exit with an error. (#19736) +- If exceptions are disabled, using `new` together with `std::nothrow` no + longer aborts if the allocation fails. Instead `nullptr` is returned now. + This does not change the behavior of regular usage of `new`. +- Default `MIN_CHROME_VERSION` was increased from 75 to 85 and default + `MIN_FIREFOX_VERSION` was increased from 68 to 79 to allow Emscripten + to use some ES2021 features for smaller JavaScript code size. (#20549) +- Emscripten now generates PowerShell wrappers for its CLIs. This allows to + sidestep some of the issues with legacy cmd.exe, but developers must + explicitly opt-in to running PowerShell scripts in system settings or + via the `Set-ExecutionPolicy` command. (#20416) +- `emscripten::val` now supports C++20 `co_await` operator for JavaScript + `Promise`s. (#20420) + +3.1.47 - 10/09/23 +----------------- +- The boost-headers port was updated to v1.83.0. +- The `noExitRuntime` global is now a JS library symbol that will only be + included as needed. User of `noExitRuntime` will now need to declare a + dependency on it. It will get implicitly included if `noExitRuntime` is part + of `INCOMING_MODULE_JS_API.` (which it is by default), or it can be added to + either `DEFAULT_LIBRARY_FUNCS_TO_INCLUDE` or `noExitRuntime`. (#20336) +- The egl, html5, sdl and webgpu libraries now support basic functionality with + `-sMEMORY64`. (#20276) +- Value types in `emscripten/html5.h` that correspond the WebIDL `long` type are + now represented as `int` rather than `long` types so that they are 32-bit wide + on both wasm32 and wasm64. (#20290) +- `EM_JS` and `EM_ASM` that are present in side module now have their syntax + validated at build time. (#20258) +- `MAIN_THREAD_EM_ASM_PTR` macro added for code that returns a pointer. This + mirrors the existing `EM_ASM_PTR`. (#20261) +- Emscripten now implements default POSIX signal handlers. These can + terminate or abort the program in response to `raise` cals. (#20257) +- `emscripten::val` now prevents accidental access to the underlying JavaScript + value from threads other than its owner. This already didn't work correctly + in majority of cases, but now it will throw a clear assertion failure. (#20344) +- `emscripten::val` can now be iterated over with a C++ range-based for loop. + (#20364) + +3.1.46 - 09/15/23 +----------------- +- The `wasmTable` global is now a JS library function that will only be included + as needed. Code that references `wasmTable` will no need to declare a + dependency on it. It can also be explicitly included using + `-sEXPORTED_RUNTIME_METHODS=wasmTable`. +- libunwind updated to LLVM 16.0.6. (#20088) +- The `--minify=0` command line flag will now preserve comments as well as + whitespace. This means the resulting output can then be run though closure + compiler or some other tool that gives comments semantic meaning. (#20121) +- `-sSTRICT` now implies `-sINCOMING_MODULE_JS_API=[]` which is generally good + for code size. If you `-sSTRICT` you now need to be explicit about the + incoming module APIs you are supplying. Users who supply symbols on the + incoming module but forget to include them in `-sINCOMING_MODULE_JS_API` + will see an error in debug builds so this change will not generate any + silent failures. +- JS library decorators such as `__deps` and `__async` are now type checked so + that errors are not silently ignored. +- The `USE_GLFW` settings now defaults to 0 rather than 2. This matches other + other settings such as `USE_SDL` that default to 0 these days and also matches + the existing behaviour for `MINIMAL_RUNTIME` and `STRICT` mode. + If you use GLFW you now need to explicitly opt into it using `-sUSE_GLFW` or + `-lglfw`. (#19939) +- A new settings `TABLE_BASE` was introduced that can be used to place static + function addresses (table slots) at a certain offset. This defaults to 1 + which is the previously fixed value. (#20149) +- Clang's error detection of unused variables `-Wunused-variable` improved, + which may require changes in user code (see #20169). + +3.1.45 - 08/23/23 +----------------- +- The function used to add symbols the JS library has been renamed from + `mergeInto`, to the more specific `addToLibrary`. This new function does not + require the passing of `LibraryManager.library` as a first argument. The old + `mergeInto` continues to exist for backwards compat. +- The `--log_html` option was removed from `emrun`. This option was already not + working with python3.8 or above so we hope is safe to say that nobody was + relying on it. + +3.1.44 - 07/25/23 +----------------- +- musl libc updated from v1.2.3 to v1.2.4. (#19812) +- The `EM_LOG_FUNC_PARAMS` flag to `emscripten_log`/`emscripten_get_callstack` + has been deprecated and no longer has any effect. It was based on a + long-deprecated JS API. (#19820) +- The internal `read_` and `readAsync` functions no longer handle data URIs. + (Higher-level functions are expected to handle that themselves, before calling.) + This only effects builds that use `-sSINGLE_FILE` or `--memory-init-file`. + (#19792) +- The `asm` property of the Module object (which held the raw exports of the + wasm module) has been removed. Internally, this is now accessed via the + `wasmExports` global. If necessary, it is possible to export `wasmExports` + on the Module object using `-sEXPORTED_RUNTIME_METHODS=wasmExports`. (#19816) +- Embind now supports generating TypeScript definition files using the + `--embind-emit-tsd ` option. + +3.1.43 - 07/10/23 +----------------- +- Handling i64 arguments and return values in JS functions is now much simpler + with the new `__i53abi` decorator. When this is set to true, i64 values are + automatically converted to JS numbers (i53) at the JS boundary. Parameters + outside of the i53 will show up as NaN in the JS code (#19711) +- EM_JS functions are now supported in side modules (#19705) + +3.1.42 - 06/22/23 +----------------- +- The default minimum Node version of Emscripten output was bumped from 10.19 to + 16.0. To run the output JS in an older version of node, you can use e.g. + `-sMIN_NODE_VERSION=101900` which will apply the previous minimum version of + 10.19.0. (#19192). +- The log message that emcc will sometime print (for example when auto-building + system libraries) can now be completely suppressed by running with + `EMCC_LOGGING=0`. +- Runtime dynamic linking symbols such as dlopen and dlsym will no longer cause + a linker error when building without `-sMAIN_MODULE`. Instead stub functions + will be included that fail at runtime. This matches the behaviour of other + libc functions that we don't implement. For those that prefer to get a linker + error we have the `-sALLOW_UNIMPLEMENTED_SYSCALLS` settings. (#19527) +- The `modifyFunction` helper in `parseTools.js` was renamed to + `modifyJSFunction` and its callback function no longer takes the name of the + function being modified. The name is not relevant for JS library functions + and can be safely ignored. +- JS library functions can now be implemented using ES6 arrow notation, which + can save to a few bytes on JS code size. (#19539) + +3.1.41 - 06/06/23 +----------------- +- A new setting (`CHECK_NULL_WRITES`) was added to disabled the checking of + address zero that is normally done when `STACK_OVERFLOW_CHECK` is enabled. + (#19487) +- compiler-rt updated to LLVM 16. (#19506) +- libcxx and libcxxabi updated to LLVM 16. (#) + +3.1.40 - 05/30/23 +----------------- +- The `_emscripten_out()`, `_emscripten_err()` and `_emscripten_dbg()` functions + declared in `emscripten/console.h` no longer have the underscore prefix and + are now documented. (#19445) + +3.1.39 - 05/18/23 +----------------- +- The JS `err()` function will now bind to `console.error` by default rather + than `console.warning`. For debugging/tracing/logging we recommend the + `dbg()` function instead. (#19326) +- The `WASM2C` options has been removed. All known users are using upstream wabt + these days anyhow. + +3.1.38 - 05/10/23 +----------------- +- The `dladdr` function will now always return an error rather than filling in + dummy values. (#19319) +- The restriction preventing the use of dynamic linking in combination with + `-sDYNAMIC_EXECUTION=0` was removed. This restriction was being enforced + unnecessarily since dynamic linking has not depended on `eval()` for a while + now. +- Remove extra code for falling back to long-deprecated BlobBuilder browser API + when Blob constructor is missing. This was a fix for an issue that has long + been fixed. (#19277) + +3.1.37 - 04/26/23 +----------------- +- The `EM_PYTHON_MULTIPROCESSING` environment variable no longer has any effect. + This was added a temporary fallback but should no longer be needed. (#19224) +- The old reverse dependency system based on `tools/deps_info.py` has been + removed and the existing `__deps` entries in JS library files can now be used + to express JS-to-native dependencies. As well being more precise, and + extensible via user-supplied JS libraries, this also speeds up link times + since we no longer need scan linker inputs using `llvm-nm`. It also + completely removes the need for the `REVERSE_DEPS` settings which has now + been deprecated. (#18905) +- Bump the default minimum Firefox version from 65 to 68 (#19191). +- Background pthreads no longer prevent a Node.js app from exiting. (#19073) + +3.1.36 - 04/16/23 +----------------- +- The `USES_DYNAMIC_ALLOC` setting has been deprecated. You can get the same + effect from `-sMALLOC=none`. (#19164) + +3.1.35 - 04/03/23 +----------------- +- The following JavaScript runtime functions were converted to JavaScript + library functions: + - UTF8ArrayToString + - UTF8ToString + - stringToUTF8Array + - stringToUTF8 + - lengthBytesUTF8 + + If you use any of these functions in your JS code you will now need to include + them explicitly in one of the following ways: + - Add them to a `__deps` entry in your JS library file (with leading $) + - Add them to `DEFAULT_LIBRARY_FUNCS_TO_INCLUDE` (with leading $) + - Add them to `EXPORTED_FUNCTIONS` (without leading $) + - Set `-sLEGACY_RUNTIME` to include all of them at once. +- `FS.loadFilesFromDB` and `FS.saveFilesToDB` were removed. We think it's + unlikely there were any users of these functions since there is now a separate + IDBFS filesystem for folks that want persistence. (#19049) +- `allocateUTF8` and `allocateUTF8OnStack` library function moved to + `library_legacy.js`. Prefer the more accurately named `stringToNewUTF8` and + `stringToUTF8OnStack`. (#19089) +- `SDL_image` port was updated to version 2.6.0. +- `-z` arguments are now passed directly to wasm-ld without the need for the + `-Wl,` prefix. This matches the behaviour of both clang and gcc. (#18956) +- Reverted #18525 which runs the JS pre-processor over files passed via + --pre-js and --post-js. It turned out this change caused issue for several + folks who had JS files with lines that start with `#` so can't be run through + the pre-processor. If folks want to re-enable this we can looks into ways to + make it conditional/optional. +- The `{{{ cDefine('name') }}}` helper macro can now be simplified to just `{{{ + cDefs.name }}}`. + +3.1.34 - 03/14/23 +----------------- +- Fix for using `EM_JS` functions defined in other object files. This was a bug + that was introduced when `LLD_REPORT_UNDEFINED` was enabled by default back in + 3.1.28. (#18928) +- The preferred way to enable pthreads is now to just use the standard `-pthread` flag. The `-sUSE_PTHREADS` setting still works but is marked as legacy and will generate a warning in `-sSTRICT` mode. +- When targeting node, and using `-sMODULARIZE`, we no longer internally catch + unhandled promise rejections or exit status code. That is to say the, + `NODEJS_CATCH_REJECTION` and `NODEJS_CATCH_EXIT` are no longer compatible + with `-sMODULARIZE`. 3.1.33 - 03/08/23 ----------------- @@ -41,6 +445,9 @@ See docs/process.md for more on how version tagging works. - The WasmFS OPFS backend is now faster in browsers that implement [`Atomics.waitAsync`](https://caniuse.com/mdn-javascript_builtins_atomics_waitasync). (#18861) +- The `emscripten_proxy_async_with_callback` API was replaced with a simpler + `emscripten_proxy_callback` API that takes a second callback to be called if + the worker thread dies before completing the proxied work. 3.1.32 - 02/17/23 ----------------- @@ -59,9 +466,6 @@ See docs/process.md for more on how version tagging works. - Synchronous proxying functions in emscripten/proxying.h now return errors instead of hanging forever when the worker thread dies before the proxied work is finished. -- The `emscripten_proxy_async_with_callback` API was replaced with a simpler - `emscripten_proxy_callback` API that takes a second callback to be called if - the worker thread dies before completing the proxied work. 3.1.31 - 01/26/23 ----------------- @@ -149,6 +553,7 @@ See docs/process.md for more on how version tagging works. occupy linear memory at all. The default for `DEFAULT_PTHREAD_STACK_SIZE` was also reduced from 2MB to 64KB to match. - Improved error messages for writing custom JS libraries. (#18266) +- EM_ASM code is now supported in side modules (#18228) 3.1.26 - 11/17/22 ----------------- @@ -190,7 +595,7 @@ See docs/process.md for more on how version tagging works. helps wasm builds since wasm traps on such type mismatches in indirect calls. We recommend that users enable it to prevent such errors (which can be hard to debug otherwise). The older (less strict) behavior is also still possible with - `-Wcast-function-type -Wno-cast-funtion-type-strict` (or + `-Wcast-function-type -Wno-cast-function-type-strict` (or `-Wno-error=cast-function-type-strict` if you want the warnings to be visible but not errors). See https://reviews.llvm.org/D134831 - libcxx and libcxxabi updated to LLVM 15. (#18113) @@ -512,7 +917,7 @@ See docs/process.md for more on how version tagging works. 3.1.2 - 01/20/2022 ------------------ - A new setting, `POLYFILL`, was added which is on by default but can be disabled - (via `-sNO_POLYFILL`) to prevent emscripten from outputing needed polyfills. + (via `-sNO_POLYFILL`) to prevent emscripten from outputting needed polyfills. For default browser targets, no polyfills are needed so this option only has meaning when targeting older browsers. - `EVAL_CTORS` has been rewritten and improved. The main differences from before @@ -824,7 +1229,7 @@ See docs/process.md for more on how version tagging works. - When building with `-s MAIN_MODULE` emscripten will now error on undefined symbol by default. This matches the behvious of clang/gcc/msvc. This requires that your side modules be present on the command line. If you do not - specify your side modules on the command line (either direcly or via + specify your side modules on the command line (either directly or via `RUNTIME_LINKED_LIBS`) you may need to add `-s WARN_ON_UNDEFINED_SYMBOLS=0` to avoid errors about symbol that are missing at link time (but present in your side modules provided at runtime). We hope that this case is not common and @@ -929,7 +1334,7 @@ See docs/process.md for more on how version tagging works. 2.0.15: 03/05/2021 ------------------ -- Calls to `newlocale` (and `new std::locale` in C++) with arbirary names will +- Calls to `newlocale` (and `new std::locale` in C++) with arbitrary names will now succeed. This is the behaviour of musl libc which emscripten had previously inadvertently disabled. - System libraries are now compiled with debug info (`-g`). This doesn't @@ -946,7 +1351,7 @@ See docs/process.md for more on how version tagging works. 2.0.14: 02/14/2021 ------------------ - Add new setting: `REVERSE_DEPS`. This can be used to control how emscripten - decides which reverse dependecies to include. See `settings.js` for more + decides which reverse dependencies to include. See `settings.js` for more information. The default setting ('auto') is the traditional way emscripten has worked in the past so there should be no change unless this options is actually used. This option partially replaces the `EMCC_ONLY_FORCED_STDLIBS` @@ -1102,7 +1507,7 @@ See docs/process.md for more on how version tagging works. - Add new `COMPILER_WRAPPER` settings (with corresponding `EM_COMPILER_WRAPPER` environment variable. This replaces the existing `EMMAKEN_COMPILER` environment variable which is deprecated, but still works for the time being. - The main differences is that `EM_COMPILER_WRAPPER` only wrapps the configured + The main differences is that `EM_COMPILER_WRAPPER` only wraps the configured version of clang rather than replacing it. - ASAN_SHADOW_SIZE is deprecated. When using AddressSanitizer, the correct amount of shadow memory will now be calculated automatically. @@ -1114,7 +1519,7 @@ See docs/process.md for more on how version tagging works. - Fix a rare pthreads main thread deadlock (that worsened in 2.0.2, but existed before). (#12318) - The WebAssembly table is now created and exported by the generated wasm - module rather then constructed by the JS glue code. This is an implemention + module rather then constructed by the JS glue code. This is an implementation detail that should not affect most users, but reduces code size. (#12296) - Add `getentropy` in `sys/random.h`, and use that from libc++'s `random_device`. This is more efficient, see #12240. @@ -1262,7 +1667,7 @@ See docs/process.md for more on how version tagging works. `EM_FOO` this should be enough. - Running emscripten under python2 is now deprecated. It will show up as a warning (which can be disabled with `-Wno-deprecated`). Please update to - python3 as we hope to remove support completely in the next releaase. + python3 as we hope to remove support completely in the next release. 1.39.20: 07/20/2020 ------------------- @@ -2454,7 +2859,7 @@ v1.36.10: 9/24/2016 - Improved support for --proxy-to-worker build mode. - Improved GLES3 support for glGet() features that WebGL2 does not have. (#4514) - Added support for implementation defined glReadPixels() format. - - Improved WebGL 2 support with closure compilter. (#4554) + - Improved WebGL 2 support with closure compiler. (#4554) - Implemented support for nanosleep() when building in pthreads mode (#4578) - Added support for llvm_ceil_f64 and llvm_floor_f64 intrinsics. - Full list of changes: @@ -2488,7 +2893,7 @@ v1.36.8: 8/20/2016 options for wasm. - Added new emprofile.py script which can be used to profile toolchain wide performance. (#4491) - - Added new linker flag --output-eol, which specifices what kind of line + - Added new linker flag --output-eol, which specifies what kind of line endings to generate to the output files. (#4492) - Fixed a Windows bug where aborting execution with Ctrl-C might hang Emscripten to an infinite loop instead. (#4494) @@ -3379,7 +3784,7 @@ v1.30.2: 4/1/2015 v1.30.1: 3/24/2015 ------------------ - - Upgraded LLVM+Clang from vrsion 3.5 to version 3.6. + - Upgraded LLVM+Clang from version 3.5 to version 3.6. - Full list of changes: - Emscripten: https://github.com/emscripten-core/emscripten/compare/1.30.0...1.30.1 - Emscripten-LLVM: https://github.com/emscripten-core/emscripten-fastcomp/compare/1.30.0...1.30.1 @@ -4124,7 +4529,7 @@ v1.21.4: 7/17/2014 runtime. - Have runtime mkdir() function call normalize the path to be created before creation. - - Fixed an issue with omitting the third paramter in cwrap() call (#2511). + - Fixed an issue with omitting the third parameter in cwrap() call (#2511). - Fixed an issue where mouse event handling would throw an exception if the page did not contain a canvas object. - Fixed a GL initialization problem when user has extended Array with custom @@ -4150,7 +4555,7 @@ v1.21.3: 7/10/2014 - Added implementations for SDL function SDL_AudioQuit and SDL_VideoQuit. - Fix an issue with the optimizeShifts optimization enabled in previous version. - Fixed the -s RELOOPER command line parameter to work. - - Fixed a bug where building the system libc migt result in a compiler deadlock + - Fixed a bug where building the system libc might result in a compiler deadlock on Windows. - Removed emcc from trying to link in .dll files as static libraries on Windows. @@ -4928,7 +5333,7 @@ v1.7.0: 10/23/2013 - Several compiler stability fixes. - Adds a JavaScript implementation of cxa_demangle function for demangling call stack traces at runtime for easier debugging. - - GL context MSAA antialising is now DISABLED by default, to make the GL + - GL context MSAA antialiasing is now DISABLED by default, to make the GL behavior consistent with desktop usage. - Added support to SDL, GLUT and GLFW libraries to specify MSAA on/off at startup. - Implemented glColor4ubv in GL emulation mode. diff --git a/Makefile b/Makefile index 7d0c2deaf2449..8065e8a8cf9c9 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ dist: $(DISTFILE) install: @rm -rf $(DESTDIR) ./tools/install.py $(DESTDIR) - npm install --prefix $(DESTDIR) + npm install --omit=dev --prefix $(DESTDIR) # Create an distributable archive of emscripten suitable for use # by end users. This archive excludes node_modules as it can include native diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000000..60079f1ecda6f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# Security Policy + +If you have discovered a security vulnerability in this project, please report it +privately. **Do not disclose it as a public issue.** This gives us time to work with you +to fix the issue before public exposure, reducing the chance that the exploit will be +used before a patch is released. + +Please submit the report as a [security bug on the Chromium tracker](https://bugs.chromium.org/p/chromium/issues/entry?template=Security%20Bug). + +Please provide the following information in your report: + +- A description of the vulnerability and its impact +- How to reproduce the issue +- Make it clear that it's an Emscripten bug. + +We ask that you give us 90 days to work on a fix before public exposure. diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000000000..eef0f00c6730f --- /dev/null +++ b/bootstrap @@ -0,0 +1,35 @@ +#!/bin/sh +# Copyright 2020 The Emscripten Authors. All rights reserved. +# Emscripten is available under two separate licenses, the MIT license and the +# University of Illinois/NCSA Open Source License. Both these licenses can be +# found in the LICENSE file. +# +# Entry point for running python scripts on UNIX systems. +# +# Automatically generated by `create_entry_points.py`; DO NOT EDIT. +# +# To make modifications to this file, edit `tools/run_python.sh` and then run +# `tools/maint/create_entry_points.py` + +# $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal +# of cpython used in cross compilation via setup.py. +unset _PYTHON_SYSCONFIGDATA_NAME + +if [ -z "$PYTHON" ]; then + PYTHON=$EMSDK_PYTHON +fi + +if [ -z "$PYTHON" ]; then + PYTHON=$(command -v python3 2> /dev/null) +fi + +if [ -z "$PYTHON" ]; then + PYTHON=$(command -v python 2> /dev/null) +fi + +if [ -z "$PYTHON" ]; then + echo 'unable to find python in $PATH' + exit 1 +fi + +exec "$PYTHON" -E "$0.py" "$@" diff --git a/bootstrap.bat b/bootstrap.bat new file mode 100644 index 0000000000000..83edd646f7918 --- /dev/null +++ b/bootstrap.bat @@ -0,0 +1,86 @@ +:: Entry point for running python scripts on windows systems. +:: +:: Automatically generated by `create_entry_points.py`; DO NOT EDIT. +:: +:: To make modifications to this file, edit `tools/run_python.bat` and then run +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. + +:: All env. vars specified in this file are to be local only to this script. +@setlocal +:: -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal +:: of cpython used in cross compilation via setup.py. +@set _PYTHON_SYSCONFIGDATA_NAME= +@set EM_PY=%EMSDK_PYTHON% +@if "%EM_PY%"=="" ( + set EM_PY=python +) + +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + +:: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a +:: shared stdin handle from the parent process, and that parent process stdin handle is in +:: a certain state, running python.exe might hang here. To work around this, if +:: EM_WORKAROUND_PYTHON_BUG_34780 is defined, invoke python with '< NUL' stdin to avoid +:: sharing the parent's stdin handle to it, avoiding the hang. + +:: On Windows 7, the compiler batch scripts are observed to exit with a non-zero errorlevel, +:: even when the python executable above did succeed and quit with errorlevel 0 above. +:: On Windows 8 and newer, this issue has not been observed. It is possible that this +:: issue is related to the above python bug, but this has not been conclusively confirmed, +:: so using a separate env. var EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG to enable the known +:: workaround this issue, which is to explicitly quit the calling process with the previous +:: errorlevel from the above command. + +:: Also must use goto to jump to the command dispatch, since we cannot invoke emcc from +:: inside a if() block, because if a cmdline param would contain a char '(' or ')', that +:: would throw off the parsing of the cmdline arg. +@if "%EM_WORKAROUND_PYTHON_BUG_34780%"=="" ( + @if "%EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG%"=="" ( + goto NORMAL + ) else ( + goto NORMAL_EXIT + ) +) else ( + @if "%EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG%"=="" ( + goto MUTE_STDIN + ) else ( + goto MUTE_STDIN_EXIT + ) +) + +:NORMAL_EXIT +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* +@exit %ERRORLEVEL% + +:MUTE_STDIN +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL +@exit /b %ERRORLEVEL% + +:MUTE_STDIN_EXIT +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL +@exit %ERRORLEVEL% + +:NORMAL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/bootstrap.py b/bootstrap.py new file mode 100755 index 0000000000000..695ae528b212b --- /dev/null +++ b/bootstrap.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Bootstrap script for emscripten developers / git users. + +After checking out emscripten there are certain steps that need to be +taken before it can be used. This script enumerates and automates +these steps and is able to run just the steps that are needed based +on the timestamps of various input files (kind of like a dumb version +of a Makefile). +""" +import argparse +import os +import shutil +import sys + +__rootdir__ = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, __rootdir__) + +STAMP_DIR = os.path.join(__rootdir__, 'out') + +from tools import shared, utils + +actions = [ + ('npm packages', ['package.json'], [shutil.which('npm'), 'ci']), + ('create entry points', [ + 'tools/maint/create_entry_points.py', + 'tools/maint/run_python.bat', + 'tools/maint/run_python.sh', + 'tools/maint/run_python.ps1', + ], + [sys.executable, 'tools/maint/create_entry_points.py']), + ('git submodules', ['test/third_party/posixtestsuite/'], [shutil.which('git'), 'submodule', 'update', '--init']), +] + + +def get_stamp_file(action_name): + return os.path.join(STAMP_DIR, action_name.replace(' ', '_') + '.stamp') + + +def check_deps(name, deps): + stamp_file = get_stamp_file(name) + if not os.path.exists(stamp_file): + return False + for dep in deps: + dep = utils.path_from_root(dep) + if os.path.getmtime(dep) > os.path.getmtime(stamp_file): + return False + return True + + +def check(): + for name, deps, _ in actions: + if not check_deps(name, deps): + utils.exit_with_error(f'emscripten setup is not complete ("{name}" is out-of-date). Run `bootstrap` to update') + + +def main(args): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('-v', '--verbose', action='store_true', help='verbose', default=False) + parser.add_argument('-n', '--dry-run', action='store_true', help='dry run', default=False) + args = parser.parse_args() + + for name, deps, cmd in actions: + if check_deps(name, deps): + print('Up-to-date: %s' % name) + continue + print('Out-of-date: %s' % name) + stamp_file = get_stamp_file(name) + if args.dry_run: + print(' (skipping: dry run) -> %s' % ' '.join(cmd)) + return + print(' -> %s' % ' '.join(cmd)) + shared.run_process(cmd, cwd=utils.path_from_root()) + utils.safe_ensure_dirs(STAMP_DIR) + utils.write_file(stamp_file, 'Timestamp file created by bootstrap.py') + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/cmake/Modules/Platform/Emscripten.cmake b/cmake/Modules/Platform/Emscripten.cmake index df22f859c2898..1dd8a3efcba8e 100644 --- a/cmake/Modules/Platform/Emscripten.cmake +++ b/cmake/Modules/Platform/Emscripten.cmake @@ -6,7 +6,7 @@ # line parameters: # cmake -DCMAKE_TOOLCHAIN_FILE=/cmake/Modules/Platform/Emscripten.cmake # -DCMAKE_BUILD_TYPE= -# -G "Unix Makefiles" (Linux and OSX) +# -G "Unix Makefiles" (Linux and macOS) # -G "MinGW Makefiles" (Windows) # # Note, pass in here ONLY the path to the file, not the filename 'CMakeLists.txt' itself. @@ -217,10 +217,16 @@ set(EMSCRIPTEN_SYSROOT "${_emcache_output}/sysroot") list(APPEND CMAKE_FIND_ROOT_PATH "${EMSCRIPTEN_SYSROOT}") list(APPEND CMAKE_SYSTEM_PREFIX_PATH /) -if ($ENV{CFLAGS} MATCHES "MEMORY64") +if (${CMAKE_C_FLAGS} MATCHES "MEMORY64") set(CMAKE_LIBRARY_ARCHITECTURE "wasm64-emscripten") + set(CMAKE_SIZEOF_VOID_P 8) + set(CMAKE_C_SIZEOF_DATA_PTR 8) + set(CMAKE_CXX_SIZEOF_DATA_PTR 8) else() set(CMAKE_LIBRARY_ARCHITECTURE "wasm32-emscripten") + set(CMAKE_SIZEOF_VOID_P 4) + set(CMAKE_C_SIZEOF_DATA_PTR 4) + set(CMAKE_CXX_SIZEOF_DATA_PTR 4) endif() if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) @@ -290,66 +296,36 @@ set(CMAKE_SIZEOF_INT 4) set(CMAKE_SIZEOF_UNSIGNED_LONG 4) set(CMAKE_SIZEOF_UNSIGNED_INT 4) set(CMAKE_SIZEOF_LONG 4) -set(CMAKE_SIZEOF_VOID_P 4) set(CMAKE_SIZEOF_FLOAT 4) set(CMAKE_SIZEOF_DOUBLE 8) -set(CMAKE_C_SIZEOF_DATA_PTR 4) -set(CMAKE_CXX_SIZEOF_DATA_PTR 4) set(CMAKE_HAVE_LIMITS_H 1) set(CMAKE_HAVE_UNISTD_H 1) set(CMAKE_HAVE_PTHREAD_H 1) set(CMAKE_HAVE_SYS_PRCTL_H 1) set(CMAKE_WORDS_BIGENDIAN 0) +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") set(CMAKE_DL_LIBS) function(em_validate_asmjs_after_build target) message(WARNING "em_validate_asmjs_after_build no longer exists") endfunction() -# A global counter to guarantee unique names for js library files. -set(link_js_counter 1) - # Internal function: Do not call from user CMakeLists.txt files. Use one of # em_link_js_library()/em_link_pre_js()/em_link_post_js() instead. -function(em_add_tracked_link_flag target flagname) - +function(em_add_link_deps target flagname) # User can input list of JS files either as a single list, or as variable # arguments to this function, so iterate over varargs, and treat each item in # varargs as a list itself, to support both syntax forms. foreach(jsFileList ${ARGN}) foreach(jsfile ${jsFileList}) - # If the user edits the JS file, we want to relink the emscripten - # application, but unfortunately it is not possible to make a link step - # depend directly on a source file. Instead, we must make a dummy no-op - # build target on that source file, and make the project depend on - # that target. - - # Sanitate the source .js filename to a good symbol name to use as a dummy - # filename. - get_filename_component(jsname "${jsfile}" NAME) - string(REGEX REPLACE "[/:\\\\.\ ]" "_" dummy_js_target ${jsname}) - set(dummy_lib_name ${target}_${link_js_counter}_${dummy_js_target}) - set(dummy_c_name "${CMAKE_BINARY_DIR}/${dummy_js_target}_tracker.c") - - # Create a new static library target that with a single dummy .c file. - add_library(${dummy_lib_name} STATIC ${dummy_c_name}) - # Make the dummy .c file depend on the .js file we are linking, so that if - # the .js file is edited, the dummy .c file, and hence the static library - # will be rebuild (no-op). This causes the main application to be - # relinked, which is what we want. This approach was recommended by - # http://www.cmake.org/pipermail/cmake/2010-May/037206.html - add_custom_command(OUTPUT ${dummy_c_name} COMMAND ${CMAKE_COMMAND} -E touch ${dummy_c_name} DEPENDS ${jsfile}) - target_link_libraries(${target} ${dummy_lib_name}) - - # Link the js-library to the target - # When a linked library starts with a "-" cmake will just add it to the - # linker command line as it is. The advantage of doing it this way is - # that the js-library will also be automatically linked to targets that - # depend on this target. - get_filename_component(js_file_absolute_path "${jsfile}" ABSOLUTE ) - target_link_libraries(${target} "${flagname} \"${js_file_absolute_path}\"") - - math(EXPR link_js_counter "${link_js_counter} + 1") + get_target_property(linkdeps ${target} LINK_DEPENDS) + if(linkdeps STREQUAL "linkdeps-NOTFOUND") + set(linkdeps "") + endif() + get_filename_component(jsfile_abs "${jsfile}" ABSOLUTE ) + set_target_properties(${target} PROPERTIES LINK_DEPENDS "${linkdeps};${jsfile_abs}") + target_link_libraries(${target} "${flagname} \"${jsfile_abs}\"") endforeach() endforeach() endfunction() @@ -361,52 +337,23 @@ endfunction() # between the linked .js files and the main project, so that editing the .js # file will cause the target project to be relinked. function(em_link_js_library target) - em_add_tracked_link_flag(${target} "--js-library" ${ARGN}) + em_add_link_deps(${target} "--js-library" ${ARGN}) endfunction() # This function is identical to em_link_js_library(), except the .js files will # be added with '--pre-js file.js' command line flag, which is generally used to # add some preamble .js code to a generated output file. function(em_link_pre_js target) - em_add_tracked_link_flag(${target} "--pre-js" ${ARGN}) + em_add_link_deps(${target} "--pre-js" ${ARGN}) endfunction() # This function is identical to em_link_js_library(), except the .js files will # be added with '--post-js file.js' command line flag, which is generally used # to add some postamble .js code to a generated output file. function(em_link_post_js target) - em_add_tracked_link_flag(${target} "--post-js" ${ARGN}) + em_add_link_deps(${target} "--post-js" ${ARGN}) endfunction() -# Experimental support for targeting generation of Visual Studio project files -# (vs-tool) of Emscripten projects for Windows. To use this, pass the -# combination -G "Visual Studio 10" -DCMAKE_TOOLCHAIN_FILE=Emscripten.cmake -if ("${CMAKE_GENERATOR}" MATCHES "^Visual Studio.*") - # By default, CMake generates VS project files with a - # true directive. - # This causes VS to attempt to invoke rc.exe during the build, which will fail - # since app manifests are meaningless for Emscripten. To disable this, add - # the following linker flag. This flag will not go to emcc, since the Visual - # Studio CMake generator will swallow it. - set(EMSCRIPTEN_VS_LINKER_FLAGS "/MANIFEST:NO") - # CMake is hardcoded to write a ClCompile directive - # $(IntDir) in all VS project files it - # generates. This makes VS pass emcc a -o param that points to a directory - # instead of a file, which causes emcc autogenerate the output filename. - # CMake is hardcoded to assume all object files have the suffix .obj, so - # adjust the emcc-autogenerated default suffix name to match. - set(EMSCRIPTEN_VS_LINKER_FLAGS "${EMSCRIPTEN_VS_LINKER_FLAGS} --default-obj-ext .obj") - # Also hint CMake that it should not hardcode generation. - # Requires a custom CMake build for this to work (ignored on others) - # See http://www.cmake.org/Bug/view.php?id=14673 and https://github.com/juj/CMake - set(CMAKE_VS_NO_DEFAULT_OBJECTFILENAME 1) - - # Apply and cache Emscripten Visual Studio IDE-specific linker flags. - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EMSCRIPTEN_VS_LINKER_FLAGS}" CACHE STRING "") -endif() - if (NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR) find_program(NODE_JS_EXECUTABLE NAMES nodejs node) if(NODE_JS_EXECUTABLE) diff --git a/docs/emcc.txt b/docs/emcc.txt index 37b5347a4cba4..e2a7903e51959 100644 --- a/docs/emcc.txt +++ b/docs/emcc.txt @@ -80,12 +80,12 @@ Options that are modified or new in *emcc* are listed below: "-Os" [compile+link] Like "-O3", but focuses more on code size (and may - make tradeoffs with speed). This can affect both wasm and + make tradeoffs with speed). This can affect both Wasm and JavaScript. "-Oz" [compile+link] Like "-Os", but reduces code size even further, and - may take longer to run. This can affect both wasm and JavaScript. + may take longer to run. This can affect both Wasm and JavaScript. Note: @@ -98,7 +98,7 @@ Options that are modified or new in *emcc* are listed below: Note: - If no value is specifed it will default to "1". + If no value is specified it will default to "1". Note: @@ -147,11 +147,14 @@ Options that are modified or new in *emcc* are listed below: * The specified file path must be absolute, not relative. + * The file may contain comments where the first character of the + line is "'#'". + Note: Options can be specified as a single argument with or without a space between the "-s" and option name. e.g. "-sFOO" or "-s - FOO". + FOO". It's highly recommended you use the notation without space. "-g" [compile+link] Preserve debug information. @@ -166,17 +169,27 @@ Options that are modified or new in *emcc* are listed below: Preserve debug information, but in a separate file on the side. This is the same as "-g", but the main file will contain no debug info. Instead, debug info will be present in a file on the side, in - "FILENAME" if provided, otherwise the same as the wasm file but + "FILENAME" if provided, otherwise the same as the Wasm file but with suffix ".debug.wasm". While the main file contains no debug info, it does contain a URL to where the debug file is, so that devtools can find it. You can use "-sSEPARATE_DWARF_URL=URL" to customize that location (this is useful if you want to host it on a different server, for example). +"-gsplit-dwarf" + Enable debug fission, which creates split DWARF object files + alongside the wasm object files. This option must be used together + with "-c". + "-gsource-map" - When linking, generate a source map using LLVM debug information - (which must be present in object files, i.e., they should have been - compiled with "-g"). + [link] Generate a source map using LLVM debug information (which + must be present in object files, i.e., they should have been + compiled with "-g"). When this option is provided, the **.wasm** + file is updated to have a "sourceMappingURL" section. The resulting + URL will have format: "" + "" + ".map". + "" defaults to being empty (which means the source map is + served from the same directory as the Wasm file). It can be changed + using --source-map-base. "-g" [compile+link] Controls the level of debuggability. Each level @@ -216,7 +229,7 @@ Options that are modified or new in *emcc* are listed below: to the compiler. "--emit-symbol-map" - [link] Save a map file between function indexes in the wasm and + [link] Save a map file between function indexes in the Wasm and function names. By storing the names on a file on the side, you can avoid shipping the names, and can still reconstruct meaningful stack traces by translating the indexes back to the names. @@ -258,10 +271,6 @@ Options that are modified or new in *emcc* are listed below: before the closure-compiled code runs, because then it will reuse that variable. - * If closure compiler hits an out-of-memory, try adjusting - "JAVA_HEAP_SIZE" in the environment (for example, to 4096m for - 4GB). - * Closure is only run if JavaScript opts are being done ("-O2" or above). @@ -375,10 +384,8 @@ Options that are modified or new in *emcc* are listed below: specified using the "-o" option. "--source-map-base " - [link] The URL for the location where WebAssembly source maps will - be published. When this option is provided, the **.wasm** file is - updated to have a "sourceMappingURL" section. The resulting URL - will have format: "" + "" + ".map". + [link] The base URL for the location where WebAssembly source maps + will be published. Must be used with -gsource-map. "--minify 0" [same as -g1 if passed at compile time, otherwise applies at link] @@ -402,6 +409,11 @@ Options that are modified or new in *emcc* are listed below: [link] Links against embind library. Deprecated: Use "-lembind" instead. +"--embind-emit-tsd " + [link] Generate a TypeScript definition file from the exported + embind bindings. The program will be instrumented and run in node + in order to to generate the file. + "--ignore-dynamic-linking" [link] Tells the compiler to ignore dynamic linking (the user will need to manually link to the shared libraries later on). @@ -457,6 +469,16 @@ Options that are modified or new in *emcc* are listed below: By default this will also clear any download ports since the ports directory is usually within the cache directory. +"--use-port=" + [compile+link] Use the specified port. If you need to use more than + one port you can use this option multiple times (ex: "--use- + port=sdl2 --use-port=bzip2"). A port can have options separated by + ":" (ex: "--use-port=sdl2_image:formats=png,jpg"). To use an + external port, you provide the path to the port directly (ex: "-- + use-port=/path/to/my_port.py"). To get more information about a + port, use the "help" option (ex: "--use-port=sdl2_image:help"). To + get the list of available ports, use "--show-ports". + "--clear-ports" [general] Manually clears the local copies of ports from the Emscripten Ports repos (sdl2, etc.). This also clears the cache, to @@ -471,49 +493,6 @@ Options that are modified or new in *emcc* are listed below: Ports repos. After this operation is complete, this process will exit. -"--memory-init-file 0|1" - [link] Specifies whether to emit a separate memory initialization - file. - - Note: - - Note that this is only relevant when *not* emitting wasm, as - wasm embeds the memory init data in the wasm binary. - - Possible values are: - - * "0": Do not emit a separate memory initialization file. - Instead keep the static initialization inside the generated - JavaScript as text. This is the default setting if compiling - with -O0 or -O1 link-time optimization flags. - - * "1": Emit a separate memory initialization file in binary - format. This is more efficient than storing it as text inside - JavaScript, but does mean you have another file to publish. - The binary file will also be loaded asynchronously, which - means "main()" will not be called until the file is downloaded - and applied; you cannot call any C functions until it arrives. - This is the default setting when compiling with -O2 or higher. - - Note: - - The safest way to ensure that it is safe to call C functions - (the initialisation file has loaded) is to call a notifier - function from "main()". - - Note: - - If you assign a network request to - "Module.memoryInitializerRequest" (before the script runs), - then it will use that request instead of automatically - starting a download for you. This is beneficial in that you - can, in your HTML, fire off a request for the memory init - file before the script actually arrives. For this to work, - the network request should be an XMLHttpRequest with - responseType set to "'arraybuffer'". (You can also put any - other object here, all it must provide is a ".response" - property containing an ArrayBuffer.) - "-Wwarn-absolute-paths" [compile+link] Enables warnings about the use of absolute paths in "-I" and "-L" command line directives. This is used to warn against @@ -556,13 +535,6 @@ Options that are modified or new in *emcc* are listed below: the user's home directory ("~/.emscripten"). This can be overridden using the "EM_CONFIG" environment variable. -"--default-obj-ext <.ext>" - [compile] Specifies the output suffix to use when compiling with - "-c" in the absence of "-o". For example, when compiling multiple - sources files with "emcc -c *.c" the compiler will normally output - files with the ".o" extension, but "--default-obj-ext .obj" can be - used to instead generate files with the *.obj* extension. - "--valid-abspath " [compile+link] Note an allowed absolute path, which we should not warn about (absolute include paths normally are warned about, since @@ -584,16 +556,11 @@ Options that are modified or new in *emcc* are listed below: WebAssembly). * **.wasm** : WebAssembly without JavaScript support code - ("standalone wasm"; this enables "STANDALONE_WASM"). + ("standalone Wasm"; this enables "STANDALONE_WASM"). These rules only apply when linking. When compiling to object code (See *-c* below) the name of the output file is irrelevant. - Note: - - If "--memory-init-file" is used, a **.mem** file will be created - in addition to the generated **.js** and/or **.html** file. - "-c" [compile] Tells *emcc* to emit an object file which can then be linked with other object files to produce an executable. diff --git a/docs/packaging.md b/docs/packaging.md index 785e5dfa8dd63..e15bd27ccbee3 100644 --- a/docs/packaging.md +++ b/docs/packaging.md @@ -55,8 +55,7 @@ To see how our CI builds things, the relevant script is In general, the repos you need to build are LLVM and Binaryen (as emscripten itself doesn't have any binaries to build). -When packaging build results, you need the following executables (when using -the wasm backend): +When packaging build results, you need the following executables: * From LLVM: * clang diff --git a/docs/process.md b/docs/process.md index 136b0c309f2af..0c3b23b1062d7 100644 --- a/docs/process.md +++ b/docs/process.md @@ -1,5 +1,8 @@ # Development Processes +More information can be found in the [Contribution +section](https://emscripten.org/docs/contributing/contributing.html) of the +webside. ## Landing PRs @@ -26,6 +29,10 @@ should pass after each commit). When landing multiple commits in such a scenario, use the "rebase" option, to avoid a merge commit. + * Add `NFC` to the end of the PR title for Non-Functional Changes (i.e., + changes that do not add/modify functionality, such as internal refactoring). + * Add a `[prefix]` to start of the PR title to signify the subsystem or area + that the PR targets. e.g. `[test] Update foo test` or `[ports] Fix zlib port` ## Coding Style @@ -88,6 +95,11 @@ How: [emscripten-releases][releases_repo] repo. When this CL is committed, let the resulting SHA be ``. An example of this CL is https://chromium-review.googlesource.com/c/emscripten-releases/+/3781978. + After landing the CL, wait for a couple hours before proceeding because + building and archiving for the new commit will take some time. Check + https://ci.chromium.org/p/emscripten-releases/g/main/console to see if the + commit has passed "Archive Binaries" phase for all three platforms and + additionally "Archive Binaries (arm64)" for Mac. 1. Run [`scripts/create_release.py`][create_release_emsdk] in the emsdk repository. When we do both an LTO and a non-LTO release, run: ``` @@ -107,8 +119,8 @@ How: name release. Running this [`scripts/create_release.py`][create_release_emsdk] script will update [emscripten-releases-tags.json][emscripten_releases_tags], adding a new - version. The script will create a new git branch that can be uploaded as a - PR. An example of this PR is emscripten-core/emsdk#1071. + version. The script will create a new local git branch and push it up to + ``origin``. An example of this PR is emscripten-core/emsdk#1071. 1. [Tag][emsdk_tags] the `emsdk` repo with the new version number, on the commit that does the update, after it lands on main. 1. [Tag][emscripten_tags] the `emscripten` repo with the new version number, on @@ -158,6 +170,18 @@ You will need the specific sphinx version installed, which you can do using need to add `~/.local/bin` to your path, if pip installs to there). +### Building and viewing the Website locally + +To build the site locally for testing purposes you only need a subset of the +`update_docs.py` command just mentioned above. Specifically: + +1. Run `pip3` to install python dependencies, as described above. +2. Run `make -C site html`. +3. Run a local webserver on the outout of that command, e.g., + `python3 -m http.server 8000 -d site/build/html`. +4. Browse to `http://localhost:8000/` (assuming you use port 8000 as above). + + ## Updating the `emcc.py` help text `emcc --help` output is generated from the main documentation under `site/`, @@ -174,6 +198,99 @@ updating `emcc.rst` in a PR, the following should be done: See notes above on installing sphinx. +## Updating the LLVM libraries + +We maintain our ports of compiler-rt, libcxx, libcxxabi, and libunwind under +https://github.com/emscripten-core/emscripten/tree/main/system/lib from +[the upstream LLVM repository][llvm_repo] and periodically update them to a newer +version when a new LLVM release comes out. + +We maintain [a fork of LLVM][llvm_emscripten_fork] for library updates, where we +create a branch for each new LLVM major release. For example, the branch for +LLVM 16 is +https://github.com/emscripten-core/llvm-project/tree/emscripten-libs-16. We +create a new branch for a major version update and reuse the existing branch for +a minor version update. We mostly do updates per LLVM major release. + +To update our libraries to a newer LLVM release: + +1. If you are updating an existing branch the first step is to run + [`push_llvm_changes.py`][push_llvm_changes_emscripten] to make sure the + current branch is up-to-date with the current emscripten codebase. + ``` + ./system/lib/push_llvm_changes.py + ``` + (The existing library branch should be checked out in your Emscripten's LLVM + fork directory.) + An example of such PR is emscripten-core/llvm-project#5. + + If you are creating a new branch, first make sure the previous/existing + branch is up-to-date using + [`push_llvm_changes.py`][push_llvm_changes_emscripten]. Then + create the new branch and cherry-pick all the emscripten-specific changes + from the old branch, resolving any conflicts that might arise. + + In either case, once that branch is up-to-date use the update scripts to copy + the llvm branch contents into the emscripten tree. Its important in both + cases to run [`push_llvm_changes.py`][push_llvm_changes_emscripten] first to + ensure that no emscripten changes are lost in the process. +1. Create a PR to merge new LLVM release tag in the upstream repo into our new + library branch. For example, if we want to merge `llvmorg-16.0.6` tag into + our `emscripten-libs-16` branch, you can do + ``` + git co emscripten-libs-16 + git remote add upstream git@github.com:llvm/llvm-project.git + git fetch --tags upstream + git merge llvmorg-16.0.6 + ``` + An example of such PR is emscripten-core/llvm-project#3. +1. Now we have merged all the changes to our LLVM fork branch, pull those + changes with the new version back into the Emscripten repo. You can use + [`update_compiler_rt.py`][update_compiler_rt_emscripten], + [`update_libcxx.py`][update_libcxx_emscripten], + [`update_libcxxabi.py`][update_libcxxabi_emscripten], + [`update_libunwind.py`][update_libunwind_emscripten] for that. For example, + ``` + ./system/lib/update_comiler_rt.py + ``` + (The library branch should be checked out in your Emscripten's LLVM fork + directory.) + An example of such PR is emscripten-core/emscripten#19515. + + +## Updating musl + +We maintain our musl in +https://github.com/emscripten-core/emscripten/tree/main/system/lib/libc/musl. +We maintain a fork of musl in https://github.com/emscripten-core/musl for +updates and periodically update it to a newer version. + +The process for updating musl is similar to that of updating the LLVM libraries. +To update our libraries to a newer musl release: + +1. If you are updating an existing branch the first step is to run + [`push_musl_changes.py`][push_musl_changes_emscripten] to make sure the + current branch is up-to-date with the current emscripten codebase. + + If you are creating a new branch, first make sure the previous/existing + branch is up-to-date using + [`push_musl_changes.py`][push_musl_changes_emscripten]. Then + create the new branch and cherry-pick all the emscripten-specific changes + from the old branch, resolving any conflicts that might arise. +1. Create a PR to merge new mrelease tag in the upstream repo into our new + library branch. For example, if we want to merge musl's `v1.2.4` tag into our + `merge-v1.2.4` branch, you can do + ``` + git co merge-v1.2.4 + git remote add upstream git://git.musl-libc.org/musl + git fetch --tags upstream + git merge v1.2.4 + ``` +1. Now we have merged all the changes to our musl fork branch, pull those + changes with the new version back into the Emscripten repo. You can use + [`update_musl.py`][update_musl_emscripten] for that. + + [site_repo]: https://github.com/kripken/emscripten-site [releases_repo]: https://chromium.googlesource.com/emscripten-releases [waterfall]: https://ci.chromium.org/p/emscripten-releases/g/main/console @@ -190,3 +307,12 @@ See notes above on installing sphinx. [flake8]: https://github.com/emscripten-core/emscripten/blob/main/.flake8 [mypy]: https://github.com/emscripten-core/emscripten/blob/main/.mypy [update_docs]: https://github.com/emscripten-core/emscripten/blob/main/tools/maint/update_docs.py +[llvm_repo]: https://github.com/llvm/llvm-project +[llvm_emscripten_fork]: https://github.com/emscripten-core/llvm-project +[push_llvm_changes_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/push_llvm_changes.py +[push_musl_changes_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/push_musl_changes.py +[update_compiler_rt_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/update_compiler_rt.py +[update_libcxx_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/update_libcxx.py +[update_libcxxabi_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/update_libcxxabi.py +[update_libunwind_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/update_libunwind.py +[update_musl_emscripten]: https://github.com/emscripten-core/emscripten/blob/main/system/lib/update_musl.py diff --git a/em++.bat b/em++.bat index cc5e8d3cfd59c..68026fe148de5 100644 --- a/em++.bat +++ b/em++.bat @@ -5,6 +5,9 @@ :: To make modifications to this file, edit `tools/run_python_compiler.bat` and :: then run `tools/create_entry_points.py` +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. + :: All env. vars specified in this file are to be local only to this script. @setlocal :: -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal @@ -15,13 +18,34 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: If _EMCC_CCACHE is not set, do a regular invocation of the python compiler driver. :: Otherwise remove the ccache env. var, and then reinvoke this script with ccache enabled. @if "%_EMCC_CCACHE%"=="" ( - set CMD="%EM_PY%" -E "%~dp0\%~n0.py" + set CMD="%EM_PY%" -E "%MYDIR%%~n0.py" ) else ( set _EMCC_CCACHE= - set CMD=ccache "%~dp0\%~n0.bat" + set CMD=ccache "%MYDIR%%~n0.bat" ) :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a diff --git a/em++.py b/em++.py index 874cacaed8704..4134eb1331ede 100755 --- a/em++.py +++ b/em++.py @@ -6,8 +6,9 @@ import sys import emcc +from tools import shared -emcc.run_via_emxx = True +shared.run_via_emxx = True if __name__ == '__main__': try: diff --git a/em-config b/em-config index 1a3a1c9691685..eef0f00c6730f 100755 --- a/em-config +++ b/em-config @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/em-config.bat b/em-config.bat index 84872e7a0b933..83edd646f7918 100644 --- a/em-config.bat +++ b/em-config.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emar b/emar index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emar +++ b/emar @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emar.bat b/emar.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emar.bat +++ b/emar.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emar.py b/emar.py index 23147feb1f2dd..061fc5d4ce927 100755 --- a/emar.py +++ b/emar.py @@ -4,11 +4,10 @@ # University of Illinois/NCSA Open Source License. Both these licenses can be # found in the LICENSE file. -"""Wrapper scripte around `llvm-ar`. +"""Wrapper script around `llvm-ar`. """ import sys from tools import shared -cmd = [shared.LLVM_AR] + sys.argv[1:] -sys.exit(shared.run_process(cmd, stdin=sys.stdin, check=False).returncode) +shared.exec_process([shared.LLVM_AR] + sys.argv[1:]) diff --git a/embuilder b/embuilder index 1a3a1c9691685..eef0f00c6730f 100755 --- a/embuilder +++ b/embuilder @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/embuilder.bat b/embuilder.bat index 84872e7a0b933..83edd646f7918 100644 --- a/embuilder.bat +++ b/embuilder.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/embuilder.py b/embuilder.py index 7e2178ffad55d..9684670b4eb7a 100755 --- a/embuilder.py +++ b/embuilder.py @@ -13,6 +13,7 @@ """ import argparse +import fnmatch import logging import sys import time @@ -22,12 +23,14 @@ from tools import shared from tools import system_libs from tools import ports +from tools import utils from tools.settings import settings -import emscripten +from tools.system_libs import USE_NINJA # Minimal subset of targets used by CI systems to build enough to useful MINIMAL_TASKS = [ + 'libbulkmemory', 'libcompiler_rt', 'libcompiler_rt-wasm-sjlj', 'libc', @@ -45,7 +48,6 @@ 'libc++-noexcept', 'libal', 'libdlmalloc', - 'libdlmalloc-noerrno', 'libdlmalloc-tracing', 'libdlmalloc-debug', 'libembind', @@ -55,19 +57,24 @@ 'libemmalloc-memvalidate', 'libemmalloc-verbose', 'libemmalloc-memvalidate-verbose', + 'libmimalloc', + 'libmimalloc-mt', 'libGL', + 'libGL-getprocaddr', 'libhtml5', 'libsockets', 'libstubs', 'libstubs-debug', - 'struct_info', - 'libstandalonewasm', + 'libstandalonewasm-nocatch', 'crt1', 'crt1_proxy_main', + 'crtbegin', 'libunwind-except', 'libnoexit', 'sqlite3', 'sqlite3-mt', + 'libwebgpu', + 'libwebgpu_cpp', ] # Additional tasks on top of MINIMAL_TASKS that are necessary for PIC testing on @@ -86,16 +93,22 @@ 'libc++-mt-noexcept', 'libdlmalloc-mt', 'libGL-emu', - 'libGL-mt', + 'libGL-emu-webgl2-getprocaddr', + 'libGL-mt-getprocaddr', + 'libGL-mt-emu', + 'libGL-mt-emu-webgl2-getprocaddr', + 'libGL-mt-emu-webgl2-ofb-getprocaddr', 'libsockets_proxy', 'libsockets-mt', 'crtbegin', 'libsanitizer_common_rt', 'libubsan_rt', 'libwasm_workers_stub-debug', - 'libwebgpu_cpp', 'libfetch', + 'libfetch-mt', 'libwasmfs', + 'libwasmfs-debug', + 'libwasmfs_no_fs', 'giflib', ] @@ -109,12 +122,13 @@ def get_help(): - all_tasks = get_system_tasks()[1] + PORTS + all_tasks = get_all_tasks() all_tasks.sort() return ''' Available targets: - build / clear %s + build / clear + %s Issuing 'embuilder build ALL' causes each task to be built. ''' % '\n '.join(all_tasks) @@ -149,14 +163,17 @@ def build_port(port_name): def get_system_tasks(): system_libraries = system_libs.Library.get_all_variations() system_tasks = list(system_libraries.keys()) - # This is needed to build the generated_struct_info.json file. - # It is not a system library, but it needs to be built before - # running with FROZEN_CACHE. - system_tasks += ['struct_info'] - return system_libraries, system_tasks +def get_all_tasks(): + return get_system_tasks()[1] + PORTS + + +def handle_port_error(target, message): + utils.exit_with_error(f'error building port `{target}` | {message}') + + def main(): all_build_start_time = time.time() @@ -173,25 +190,29 @@ def main(): help='show build commands') parser.add_argument('--wasm64', action='store_true', help='use wasm64 architecture') - parser.add_argument('operation', help='currently only "build" and "clear" are supported') - parser.add_argument('targets', nargs='+', help='see below') + parser.add_argument('operation', choices=['build', 'clear', 'rebuild']) + parser.add_argument('targets', nargs='*', help='see below') args = parser.parse_args() - if args.operation not in ('build', 'clear'): - shared.exit_with_error('unfamiliar operation: ' + args.operation) + if args.operation != 'rebuild' and len(args.targets) == 0: + shared.exit_with_error('no build targets specified') + + if args.operation == 'rebuild' and not USE_NINJA: + shared.exit_with_error('"rebuild" operation is only valid when using Ninja') # process flags # Check sanity so that if settings file has changed, the cache is cleared here. # Otherwise, the cache will clear in an emcc process, which is invoked while building # a system library into the cache, causing trouble. + cache.setup() shared.check_sanity() if args.lto: settings.LTO = args.lto if args.verbose: - shared.PRINT_STAGES = True + shared.PRINT_SUBPROCS = True if args.pic: settings.RELOCATABLE = 1 @@ -205,31 +226,46 @@ def main(): if args.force: do_clear = True + system_libraries, system_tasks = get_system_tasks() + # process tasks auto_tasks = False - tasks = args.targets - system_libraries, system_tasks = get_system_tasks() - if 'SYSTEM' in tasks: - tasks = system_tasks - auto_tasks = True - elif 'USER' in tasks: - tasks = PORTS - auto_tasks = True - elif 'MINIMAL' in tasks: - tasks = MINIMAL_TASKS - auto_tasks = True - elif 'MINIMAL_PIC' in tasks: - tasks = MINIMAL_PIC_TASKS - auto_tasks = True - elif 'ALL' in tasks: - tasks = system_tasks + PORTS - auto_tasks = True + task_targets = dict.fromkeys(args.targets) # use dict to keep targets order + + # substitute + predefined_tasks = { + 'SYSTEM': system_tasks, + 'USER': PORTS, + 'MINIMAL': MINIMAL_TASKS, + 'MINIMAL_PIC': MINIMAL_PIC_TASKS, + 'ALL': system_tasks + PORTS, + } + for name, tasks in predefined_tasks.items(): + if name in task_targets: + task_targets[name] = tasks + auto_tasks = True + + # flatten tasks + tasks = [] + for name, targets in task_targets.items(): + if targets is None: + # Use target name as task + if '*' in name: + tasks.extend(fnmatch.filter(get_all_tasks(), name)) + else: + tasks.append(name) + else: + # There are some ports that we don't want to build as part + # of ALL since the are not well tested or widely used: + if 'cocos2d' in targets: + targets.remove('cocos2d') + + # Use targets from predefined_tasks + tasks.extend(targets) + if auto_tasks: - # There are some ports that we don't want to build as part - # of ALL since the are not well tested or widely used: - skip_tasks = ['cocos2d'] - tasks = [x for x in tasks if x not in skip_tasks] print('Building targets: %s' % ' '.join(tasks)) + for what in tasks: for old, new in legacy_prefixes.items(): if what.startswith(old): @@ -244,22 +280,26 @@ def main(): if do_clear: library.erase() if do_build: - library.build(deterministic_paths=True) + if USE_NINJA: + library.generate() + else: + library.build(deterministic_paths=True) elif what == 'sysroot': if do_clear: cache.erase_file('sysroot_install.stamp') if do_build: system_libs.ensure_sysroot() - elif what == 'struct_info': - if do_clear: - emscripten.clear_struct_info() - if do_build: - emscripten.generate_struct_info() elif what in PORTS: if do_clear: clear_port(what) if do_build: build_port(what) + elif ':' in what or what.endswith('.py'): + name = ports.handle_use_port_arg(settings, what, lambda message: handle_port_error(what, message)) + if do_clear: + clear_port(name) + if do_build: + build_port(name) else: logger.error('unfamiliar build target: ' + what) return 1 @@ -267,7 +307,10 @@ def main(): time_taken = time.time() - start_time logger.info('...success. Took %s(%.2fs)' % (('%02d:%02d mins ' % (time_taken // 60, time_taken % 60) if time_taken >= 60 else ''), time_taken)) - if len(tasks) > 1: + if USE_NINJA and args.operation != 'clear': + system_libs.build_deferred() + + if len(tasks) > 1 or USE_NINJA: all_build_time_taken = time.time() - all_build_start_time logger.info('Built %d targets in %s(%.2fs)' % (len(tasks), ('%02d:%02d mins ' % (all_build_time_taken // 60, all_build_time_taken % 60) if all_build_time_taken >= 60 else ''), all_build_time_taken)) diff --git a/emcc.bat b/emcc.bat index cc5e8d3cfd59c..68026fe148de5 100644 --- a/emcc.bat +++ b/emcc.bat @@ -5,6 +5,9 @@ :: To make modifications to this file, edit `tools/run_python_compiler.bat` and :: then run `tools/create_entry_points.py` +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. + :: All env. vars specified in this file are to be local only to this script. @setlocal :: -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal @@ -15,13 +18,34 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: If _EMCC_CCACHE is not set, do a regular invocation of the python compiler driver. :: Otherwise remove the ccache env. var, and then reinvoke this script with ccache enabled. @if "%_EMCC_CCACHE%"=="" ( - set CMD="%EM_PY%" -E "%~dp0\%~n0.py" + set CMD="%EM_PY%" -E "%MYDIR%%~n0.py" ) else ( set _EMCC_CCACHE= - set CMD=ccache "%~dp0\%~n0.bat" + set CMD=ccache "%MYDIR%%~n0.bat" ) :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a diff --git a/emcc.py b/emcc.py old mode 100755 new mode 100644 index 1f0353b6be2c4..a55c37282011b --- a/emcc.py +++ b/emcc.py @@ -22,45 +22,40 @@ from tools.toolchain_profiler import ToolchainProfiler -import base64 -import glob -import hashlib import json import logging import os import re import shlex -import shutil -import stat import sys import time import tarfile -from enum import Enum, unique, auto +from enum import Enum, auto, unique from subprocess import PIPE -from urllib.parse import quote -import emscripten -from tools import shared, system_libs, utils, ports, filelock +from tools import shared, system_libs, utils, ports from tools import colored_logger, diagnostics, building -from tools.shared import unsuffixed, unsuffixed_basename, WINDOWS, safe_copy -from tools.shared import run_process, read_and_preprocess, exit_with_error, DEBUG -from tools.shared import do_replace, strip_prefix +from tools.shared import unsuffixed, unsuffixed_basename, get_file_suffix +from tools.shared import run_process, exit_with_error, DEBUG +from tools.shared import in_temp, OFormat +from tools.shared import DYNAMICLIB_ENDINGS from tools.response_file import substitute_response_files -from tools.minimal_runtime_shell import generate_minimal_runtime_html -import tools.line_endings -from tools import feature_matrix -from tools import deps_info -from tools import js_manipulation -from tools import wasm2c -from tools import webassembly from tools import config from tools import cache -from tools.settings import user_settings, settings, MEM_SIZE_SETTINGS, COMPILE_TIME_SETTINGS -from tools.utils import read_file, write_file, read_binary, delete_file +from tools.settings import default_setting, user_settings, settings, MEM_SIZE_SETTINGS, COMPILE_TIME_SETTINGS +from tools.utils import read_file, removeprefix logger = logging.getLogger('emcc') +# In git checkouts of emscripten `bootstrap.py` exists to run post-checkout +# steps. In packaged versions (e.g. emsdk) this file does not exist (because +# it is excluded in tools/install.py) and these steps are assumed to have been +# run already. +if os.path.exists(utils.path_from_root('.git')) and os.path.exists(utils.path_from_root('bootstrap.py')): + import bootstrap + bootstrap.check() + # endings = dot + a suffix, compare against result of shared.suffix() C_ENDINGS = ['.c', '.i'] CXX_ENDINGS = ['.cppm', '.pcm', '.cpp', '.cxx', '.cc', '.c++', '.CPP', '.CXX', '.C', '.CC', '.C++', '.ii'] @@ -70,160 +65,29 @@ SPECIAL_ENDINGLESS_FILENAMES = [os.devnull] C_ENDINGS += SPECIAL_ENDINGLESS_FILENAMES # consider the special endingless filenames like /dev/null to be C -SOURCE_ENDINGS = C_ENDINGS + CXX_ENDINGS + OBJC_ENDINGS + OBJCXX_ENDINGS + ['.ll', '.S'] - -EXECUTABLE_ENDINGS = ['.wasm', '.html', '.js', '.mjs', '.out', ''] -DYNAMICLIB_ENDINGS = ['.dylib', '.so'] # Windows .dll suffix is not included in this list, since those are never linked to directly on the command line. -STATICLIB_ENDINGS = ['.a'] +SOURCE_ENDINGS = C_ENDINGS + CXX_ENDINGS + OBJC_ENDINGS + OBJCXX_ENDINGS + ['.bc', '.ll', '.S'] ASSEMBLY_ENDINGS = ['.s'] HEADER_ENDINGS = ['.h', '.hxx', '.hpp', '.hh', '.H', '.HXX', '.HPP', '.HH'] -# Supported LLD flags which we will pass through to the linker. -SUPPORTED_LINKER_FLAGS = ( - '--start-group', '--end-group', - '-(', '-)', - '--whole-archive', '--no-whole-archive', - '-whole-archive', '-no-whole-archive' -) - -# Unsupported LLD flags which we will ignore. -# Maps to true if the flag takes an argument. -UNSUPPORTED_LLD_FLAGS = { - # macOS-specific linker flag that libtool (ltmain.sh) will if macOS is detected. - '-bind_at_load': False, - # wasm-ld doesn't support soname or other dynamic linking flags (yet). Ignore them - # in order to aid build systems that want to pass these flags. - '-soname': True, - '-allow-shlib-undefined': False, - '-rpath': True, - '-rpath-link': True, - '-version-script': True, -} - -DEFAULT_ASYNCIFY_IMPORTS = [ - 'emscripten_sleep', 'emscripten_wget', 'emscripten_wget_data', 'emscripten_idb_load', - 'emscripten_idb_store', 'emscripten_idb_delete', 'emscripten_idb_exists', - 'emscripten_idb_load_blob', 'emscripten_idb_store_blob', 'SDL_Delay', - 'emscripten_scan_registers', 'emscripten_lazy_load_code', - 'emscripten_fiber_swap', '__load_secondary_module', - 'wasi_snapshot_preview1.fd_sync', '__wasi_fd_sync', '_emval_await', - '_dlopen_js', '__asyncjs__*' -] - -DEFAULT_ASYNCIFY_EXPORTS = [ - 'main', - '__main_argc_argv', - # Embind's async template wrapper functions. These functions are usually in - # the function pointer table and not called from exports, but we need to name - # them so the JSPI pass can find and convert them. - '_ZN10emscripten8internal5async*' -] - -# Target options -final_js = None - -UBSAN_SANITIZERS = { - 'alignment', - 'bool', - 'builtin', - 'bounds', - 'enum', - 'float-cast-overflow', - 'float-divide-by-zero', - 'function', - 'implicit-unsigned-integer-truncation', - 'implicit-signed-integer-truncation', - 'implicit-integer-sign-change', - 'integer-divide-by-zero', - 'nonnull-attribute', - 'null', - 'nullability-arg', - 'nullability-assign', - 'nullability-return', - 'object-size', - 'pointer-overflow', - 'return', - 'returns-nonnull-attribute', - 'shift', - 'signed-integer-overflow', - 'unreachable', - 'unsigned-integer-overflow', - 'vla-bound', - 'vptr', - 'undefined', - 'undefined-trap', - 'implicit-integer-truncation', - 'implicit-integer-arithmetic-value-change', - 'implicit-conversion', - 'integer', - 'nullability', -} - # These symbol names are allowed in INCOMING_MODULE_JS_API but are not part of the # default set. EXTRA_INCOMING_JS_API = [ 'fetchSettings' ] -VALID_ENVIRONMENTS = ('web', 'webview', 'worker', 'node', 'shell') SIMD_INTEL_FEATURE_TOWER = ['-msse', '-msse2', '-msse3', '-mssse3', '-msse4.1', '-msse4.2', '-msse4', '-mavx'] SIMD_NEON_FLAGS = ['-mfpu=neon'] -COMPILE_ONLY_FLAGS = {'--default-obj-ext'} LINK_ONLY_FLAGS = { '--bind', '--closure', '--cpuprofiler', '--embed-file', '--emit-symbol-map', '--emrun', '--exclude-file', '--extern-post-js', '--extern-pre-js', '--ignore-dynamic-linking', '--js-library', - '--js-transform', '--memory-init-file', '--oformat', '--output_eol', + '--js-transform', '--oformat', '--output_eol', '--post-js', '--pre-js', '--preload-file', '--profiling-funcs', '--proxy-to-worker', '--shell-file', '--source-map-base', '--threadprofiler', '--use-preload-plugins' } -# this function uses the global 'final' variable, which contains the current -# final output file. if a method alters final, and calls this method, then it -# must modify final globally (i.e. it can't receive final as a param and -# return it) -# TODO: refactor all this, a singleton that abstracts over the final output -# and saving of intermediates -def save_intermediate(name, suffix='js'): - if not DEBUG: - return - if not final_js: - logger.debug(f'(not saving intermediate {name} because not generating JS)') - return - building.save_intermediate(final_js, f'{name}.{suffix}') - - -def save_intermediate_with_wasm(name, wasm_binary): - if not DEBUG: - return - save_intermediate(name) # save the js - building.save_intermediate(wasm_binary, name + '.wasm') - - -def base64_encode(b): - b64 = base64.b64encode(b) - return b64.decode('ascii') - - -def align_to_wasm_page_boundary(address): - page_size = webassembly.WASM_PAGE_SIZE - return ((address + (page_size - 1)) // page_size) * page_size - - -@unique -class OFormat(Enum): - # Output a relocatable object file. We use this - # today for `-r` and `-shared`. - OBJECT = auto() - WASM = auto() - JS = auto() - MJS = auto() - HTML = auto() - BARE = auto() - - @unique class Mode(Enum): PREPROCESS_ONLY = auto() @@ -245,17 +109,18 @@ def __init__(self, args): self.lib_dirs = [] self.forced_stdlibs = [] + def add_link_flag(self, i, f): + if f.startswith('-L'): + self.lib_dirs.append(f[2:]) -def add_link_flag(state, i, f): - if f.startswith('-L'): - state.lib_dirs.append(f[2:]) - - state.link_flags.append((i, f)) + self.link_flags.append((i, f)) class EmccOptions: def __init__(self): + self.target = '' self.output_file = None + self.no_minify = False self.post_link = False self.executable = False self.compiler_wrapper = None @@ -273,15 +138,15 @@ def __init__(self): self.embed_files = [] self.exclude_files = [] self.ignore_dynamic_linking = False - self.shell_path = utils.path_from_root('src/shell.html') + self.shell_path = None self.source_map_base = '' + self.emit_tsd = '' + self.embind_emit_tsd = '' self.emrun = False self.cpu_profiler = False self.memory_profiler = False - self.memory_init_file = None self.use_preload_cache = False self.use_preload_plugins = False - self.default_object_extension = '.o' self.valid_abspaths = [] # Specifies the line ending format to use for all generated text files. # Defaults to using the native EOL on each platform (\r\n on Windows, \n on @@ -293,14 +158,6 @@ def __init__(self): self.reproduce = None -def will_metadce(): - # The metadce JS parsing code does not currently support the JS that gets generated - # when assertions are enabled. - if settings.ASSERTIONS: - return False - return settings.OPT_LEVEL >= 3 or settings.SHRINK_LEVEL >= 1 - - def create_reproduce_file(name, args): def make_relative(filename): filename = os.path.normpath(os.path.abspath(filename)) @@ -362,45 +219,6 @@ def make_relative(filename): reproduce_file.add(rsp_name, os.path.join(root, 'response.txt')) -def setup_environment_settings(): - # Environment setting based on user input - environments = settings.ENVIRONMENT.split(',') - if any([x for x in environments if x not in VALID_ENVIRONMENTS]): - exit_with_error(f'Invalid environment specified in "ENVIRONMENT": {settings.ENVIRONMENT}. Should be one of: {",".join(VALID_ENVIRONMENTS)}') - - settings.ENVIRONMENT_MAY_BE_WEB = not settings.ENVIRONMENT or 'web' in environments - settings.ENVIRONMENT_MAY_BE_WEBVIEW = not settings.ENVIRONMENT or 'webview' in environments - settings.ENVIRONMENT_MAY_BE_NODE = not settings.ENVIRONMENT or 'node' in environments - settings.ENVIRONMENT_MAY_BE_SHELL = not settings.ENVIRONMENT or 'shell' in environments - - # The worker case also includes Node.js workers when pthreads are - # enabled and Node.js is one of the supported environments for the build to - # run on. Node.js workers are detected as a combination of - # ENVIRONMENT_IS_WORKER and ENVIRONMENT_IS_NODE. - settings.ENVIRONMENT_MAY_BE_WORKER = \ - not settings.ENVIRONMENT or \ - 'worker' in environments or \ - (settings.ENVIRONMENT_MAY_BE_NODE and settings.PTHREADS) - - if not settings.ENVIRONMENT_MAY_BE_WORKER and settings.PROXY_TO_WORKER: - exit_with_error('If you specify --proxy-to-worker and specify a "-sENVIRONMENT=" directive, it must include "worker" as a target! (Try e.g. -sENVIRONMENT=web,worker)') - - if not settings.ENVIRONMENT_MAY_BE_WORKER and settings.SHARED_MEMORY: - exit_with_error('When building with multithreading enabled and a "-sENVIRONMENT=" directive is specified, it must include "worker" as a target! (Try e.g. -sENVIRONMENT=web,worker)') - - -def minify_whitespace(): - return settings.OPT_LEVEL >= 2 and settings.DEBUG_LEVEL == 0 - - -def embed_memfile(options): - return (settings.SINGLE_FILE or - (settings.WASM2JS and not options.memory_init_file and - (not settings.MAIN_MODULE and - not settings.SIDE_MODULE and - not settings.GENERATE_SOURCE_MAP))) - - def expand_byte_size_suffixes(value): """Given a string with KB/MB size suffixes, such as "32MB", computes how many bytes that is and returns it as an integer. @@ -417,11 +235,6 @@ def expand_byte_size_suffixes(value): return value -def default_setting(name, new_default): - if name not in user_settings: - setattr(settings, name, new_default) - - def apply_user_settings(): """Take a map of users settings {NAME: VALUE} and apply them to the global settings object. @@ -446,8 +259,8 @@ def apply_user_settings(): filename = None if value and value[0] == '@': - filename = strip_prefix(value, '@') - if not os.path.exists(filename): + filename = removeprefix(value, '@') + if not os.path.isfile(filename): exit_with_error('%s: file not found parsing argument: %s=%s' % (filename, key, value)) value = read_file(filename).strip() else: @@ -462,7 +275,7 @@ def apply_user_settings(): try: value = parse_value(value, expected_type) except Exception as e: - exit_with_error('a problem occurred in evaluating the content after a "-s", specifically "%s=%s": %s', key, value, str(e)) + exit_with_error(f'error parsing "-s" setting "{key}={value}": {e}') setattr(settings, user_key, value) @@ -475,167 +288,6 @@ def apply_user_settings(): settings.LTO = 0 if value else 'full' -def is_ar_file_with_missing_index(archive_file): - # We parse the archive header outselves because llvm-nm --print-armap is slower and less - # reliable. - # See: https://github.com/emscripten-core/emscripten/issues/10195 - archive_header = b'!\n' - file_header_size = 60 - - with open(archive_file, 'rb') as f: - header = f.read(len(archive_header)) - if header != archive_header: - # This is not even an ar file - return False - file_header = f.read(file_header_size) - if len(file_header) != file_header_size: - # We don't have any file entires at all so we don't consider the index missing - return False - - name = file_header[:16].strip() - # If '/' is the name of the first file we have an index - return name != b'/' - - -def ensure_archive_index(archive_file): - # Fastcomp linking works without archive indexes. - if not settings.AUTO_ARCHIVE_INDEXES: - return - if is_ar_file_with_missing_index(archive_file): - diagnostics.warning('emcc', '%s: archive is missing an index; Use emar when creating libraries to ensure an index is created', archive_file) - diagnostics.warning('emcc', '%s: adding index', archive_file) - run_process([shared.LLVM_RANLIB, archive_file]) - - -def generate_js_symbols(): - # Runs the js compiler to generate a list of all symbols available in the JS - # libraries. This must be done separately for each linker invokation since the - # list of symbols depends on what settings are used. - # TODO(sbc): Find a way to optimize this. Potentially we could add a super-set - # mode of the js compiler that would generate a list of all possible symbols - # that could be checked in. - emscripten.generate_struct_info() - _, forwarded_data = emscripten.compile_javascript(symbols_only=True) - # When running in symbols_only mode compiler.js outputs a flat list of C symbols. - return json.loads(forwarded_data) - - -@ToolchainProfiler.profile_block('JS symbol generation') -def get_all_js_syms(): - # Avoiding using the cache when generating struct info since - # this step is performed while the cache is locked. - if DEBUG or settings.BOOTSTRAPPING_STRUCT_INFO or config.FROZEN_CACHE: - return generate_js_symbols() - - # We define a cache hit as when the settings and `--js-library` contents are - # identical. - # Ignore certain settings that can are no relevant to library deps. Here we - # skip PRE_JS_FILES/POST_JS_FILES which don't effect the library symbol list - # and can contain full paths to temporary files. - skip_settings = {'PRE_JS_FILES', 'POST_JS_FILES'} - input_files = [json.dumps(settings.external_dict(skip_keys=skip_settings), sort_keys=True, indent=2)] - for jslib in sorted(glob.glob(utils.path_from_root('src') + '/library*.js')): - input_files.append(read_file(jslib)) - for jslib in settings.JS_LIBRARIES: - if not os.path.isabs(jslib): - jslib = utils.path_from_root('src', jslib) - input_files.append(read_file(jslib)) - content = '\n'.join(input_files) - content_hash = hashlib.sha1(content.encode('utf-8')).hexdigest() - - def build_symbol_list(filename): - """Only called when there is no existing symbol list for a given content hash. - """ - library_syms = generate_js_symbols() - lines = [] - - for name, deps in library_syms.items(): - if deps: - lines.append('%s: %s' % (name, ','.join(deps))) - else: - lines.append(name) - write_file(filename, '\n'.join(lines) + '\n') - - # We need to use a separate lock here for symbol lists because, unlike with system libraries, - # it's normally for these file to get pruned as part of normal operation. This means that it - # can be deleted between the `cache.get()` then the `read_file`. - with filelock.FileLock(cache.get_path(cache.get_path('symbol_lists.lock'))): - filename = cache.get(f'symbol_lists/{content_hash}.txt', build_symbol_list) - lines = read_file(filename).splitlines() - library_syms = {} - for line in lines: - if ':' in line: - name, deps = line.split(':') - library_syms[name] = deps.strip().split(',') - else: - library_syms[line] = [] - - # Limit of the overall size of the cache to 100 files. - # This code will get test coverage since a full test run of `other` or `core` - # generates ~1000 unique symbol lists. - cache_limit = 500 - root = cache.get_path('symbol_lists') - if len(os.listdir(root)) > cache_limit: - files = [] - for f in os.listdir(root): - f = os.path.join(root, f) - files.append((f, os.path.getmtime(f))) - files.sort(key=lambda x: x[1]) - # Delete all but the newest N files - for f, _ in files[:-cache_limit]: - delete_file(f) - - return library_syms - - -def filter_link_flags(flags, using_lld): - def is_supported(f): - if using_lld: - for flag, takes_arg in UNSUPPORTED_LLD_FLAGS.items(): - # lld allows various flags to have either a single -foo or double --foo - if f.startswith(flag) or f.startswith('-' + flag): - diagnostics.warning('linkflags', 'ignoring unsupported linker flag: `%s`', f) - # Skip the next argument if this linker flag takes and argument and that - # argument was not specified as a separately (i.e. it was specified as - # single arg containing an `=` char.) - skip_next = takes_arg and '=' not in f - return False, skip_next - return True, False - else: - if f in SUPPORTED_LINKER_FLAGS: - return True, False - # Silently ignore -l/-L flags when not using lld. If using lld allow - # them to pass through the linker - if f.startswith('-l') or f.startswith('-L'): - return False, False - diagnostics.warning('linkflags', 'ignoring unsupported linker flag: `%s`', f) - return False, False - - results = [] - skip_next = False - for f in flags: - if skip_next: - skip_next = False - continue - keep, skip_next = is_supported(f[1]) - if keep: - results.append(f) - - return results - - -def fix_windows_newlines(text): - # Avoid duplicating \r\n to \r\r\n when writing out text. - if WINDOWS: - text = text.replace('\r\n', '\n') - return text - - -def read_js_files(files): - contents = '\n'.join(read_file(f) for f in files) - return fix_windows_newlines(contents) - - def cxx_to_c_compiler(cxx): # Convert C++ compiler name into C compiler name dirname, basename = os.path.split(cxx) @@ -643,150 +295,6 @@ def cxx_to_c_compiler(cxx): return os.path.join(dirname, basename) -def should_run_binaryen_optimizer(): - # run the binaryen optimizer in -O2+. in -O0 we don't need it obviously, while - # in -O1 we don't run it as the LLVM optimizer has been run, and it does the - # great majority of the work; not running the binaryen optimizer in that case - # keeps -O1 mostly-optimized while compiling quickly and without rewriting - # DWARF etc. - return settings.OPT_LEVEL >= 2 - - -def get_binaryen_passes(): - passes = [] - optimizing = should_run_binaryen_optimizer() - # safe heap must run before post-emscripten, so post-emscripten can apply the sbrk ptr - if settings.SAFE_HEAP: - passes += ['--safe-heap'] - if settings.MEMORY64 == 2: - passes += ['--memory64-lowering'] - # sign-ext is enabled by default by llvm. If the target browser settings don't support - # this we lower it away here using a binaryen pass. - if not feature_matrix.caniuse(feature_matrix.Feature.SIGN_EXT): - logger.debug('lowering sign-ext feature due to incompatiable target browser engines') - passes += ['--signext-lowering'] - if optimizing: - passes += ['--post-emscripten'] - if settings.SIDE_MODULE: - passes += ['--pass-arg=post-emscripten-side-module'] - if optimizing: - passes += [building.opt_level_to_str(settings.OPT_LEVEL, settings.SHRINK_LEVEL)] - # when optimizing, use the fact that low memory is never used (1024 is a - # hardcoded value in the binaryen pass) - if optimizing and settings.GLOBAL_BASE >= 1024: - passes += ['--low-memory-unused'] - if settings.AUTODEBUG: - # adding '--flatten' here may make these even more effective - passes += ['--instrument-locals'] - passes += ['--log-execution'] - passes += ['--instrument-memory'] - if settings.LEGALIZE_JS_FFI: - # legalize it again now, as the instrumentation may need it - passes += ['--legalize-js-interface'] - passes += building.js_legalization_pass_flags() - if settings.EMULATE_FUNCTION_POINTER_CASTS: - # note that this pass must run before asyncify, as if it runs afterwards we only - # generate the byn$fpcast_emu functions after asyncify runs, and so we wouldn't - # be able to further process them. - passes += ['--fpcast-emu'] - if settings.ASYNCIFY == 1: - passes += ['--asyncify'] - if settings.MAIN_MODULE or settings.SIDE_MODULE: - passes += ['--pass-arg=asyncify-relocatable'] - if settings.ASSERTIONS: - passes += ['--pass-arg=asyncify-asserts'] - if settings.ASYNCIFY_ADVISE: - passes += ['--pass-arg=asyncify-verbose'] - if settings.ASYNCIFY_IGNORE_INDIRECT: - passes += ['--pass-arg=asyncify-ignore-indirect'] - passes += ['--pass-arg=asyncify-imports@%s' % ','.join(settings.ASYNCIFY_IMPORTS)] - - # shell escaping can be confusing; try to emit useful warnings - def check_human_readable_list(items): - for item in items: - if item.count('(') != item.count(')'): - logger.warning('emcc: ASYNCIFY list contains an item without balanced parentheses ("(", ")"):') - logger.warning(' ' + item) - logger.warning('This may indicate improper escaping that led to splitting inside your names.') - logger.warning('Try using a response file. e.g: -sASYNCIFY_ONLY=@funcs.txt. The format is a simple') - logger.warning('text file, one line per function.') - break - - if settings.ASYNCIFY_REMOVE: - check_human_readable_list(settings.ASYNCIFY_REMOVE) - passes += ['--pass-arg=asyncify-removelist@%s' % ','.join(settings.ASYNCIFY_REMOVE)] - if settings.ASYNCIFY_ADD: - check_human_readable_list(settings.ASYNCIFY_ADD) - passes += ['--pass-arg=asyncify-addlist@%s' % ','.join(settings.ASYNCIFY_ADD)] - if settings.ASYNCIFY_ONLY: - check_human_readable_list(settings.ASYNCIFY_ONLY) - passes += ['--pass-arg=asyncify-onlylist@%s' % ','.join(settings.ASYNCIFY_ONLY)] - elif settings.ASYNCIFY == 2: - passes += ['--jspi'] - passes += ['--pass-arg=jspi-imports@%s' % ','.join(settings.ASYNCIFY_IMPORTS)] - passes += ['--pass-arg=jspi-exports@%s' % ','.join(settings.ASYNCIFY_EXPORTS)] - if settings.SPLIT_MODULE: - passes += ['--pass-arg=jspi-split-module'] - - if settings.BINARYEN_IGNORE_IMPLICIT_TRAPS: - passes += ['--ignore-implicit-traps'] - # normally we can assume the memory, if imported, has not been modified - # beforehand (in fact, in most cases the memory is not even imported anyhow, - # but it is still safe to pass the flag), and is therefore filled with zeros. - # the one exception is dynamic linking of a side module: the main module is ok - # as it is loaded first, but the side module may be assigned memory that was - # previously used. - if optimizing and not settings.SIDE_MODULE: - passes += ['--zero-filled-memory'] - # LLVM output always has immutable initial table contents: the table is - # fixed and may only be appended to at runtime (that is true even in - # relocatable mode) - if optimizing: - passes += ['--pass-arg=directize-initial-contents-immutable'] - - if settings.BINARYEN_EXTRA_PASSES: - # BINARYEN_EXTRA_PASSES is comma-separated, and we support both '-'-prefixed and - # unprefixed pass names - extras = settings.BINARYEN_EXTRA_PASSES.split(',') - passes += [('--' + p) if p[0] != '-' else p for p in extras if p] - - return passes - - -def make_js_executable(script): - src = read_file(script) - cmd = config.NODE_JS - if settings.MEMORY64 == 1: - cmd += shared.node_memory64_flags() - elif settings.WASM_BIGINT: - cmd += shared.node_bigint_flags() - if len(cmd) > 1 or not os.path.isabs(cmd[0]): - # Using -S (--split-string) here means that arguments to the executable are - # correctly parsed. We don't do this by default because old versions of env - # don't support -S. - cmd = '/usr/bin/env -S ' + shared.shlex_join(cmd) - else: - cmd = shared.shlex_join(cmd) - logger.debug('adding `#!` to JavaScript file: %s' % cmd) - # add shebang - with open(script, 'w') as f: - f.write('#!%s\n' % cmd) - f.write(src) - try: - os.chmod(script, stat.S_IMODE(os.stat(script).st_mode) | stat.S_IXUSR) # make executable - except OSError: - pass # can fail if e.g. writing the executable to /dev/null - - -def do_split_module(wasm_file, options): - os.rename(wasm_file, wasm_file + '.orig') - args = ['--instrument'] - if options.requested_debug: - # Tell wasm-split to preserve function names. - args += ['-g'] - building.run_binaryen_command('wasm-split', wasm_file + '.orig', outfile=wasm_file, args=args) - - def is_dash_s_for_emcc(args, i): # -s OPT=VALUE or -s OPT or -sOPT are all interpreted as emscripten flags. # -s by itself is a linker option (alias for --strip-all) @@ -795,93 +303,11 @@ def is_dash_s_for_emcc(args, i): return False arg = args[i + 1] else: - arg = strip_prefix(args[i], '-s') + arg = removeprefix(args[i], '-s') arg = arg.split('=')[0] return arg.isidentifier() and arg.isupper() -def filter_out_dynamic_libs(options, inputs): - - # Filters out "fake" dynamic libraries that are really just intermediate object files. - def check(input_file): - if get_file_suffix(input_file) in DYNAMICLIB_ENDINGS and not building.is_wasm_dylib(input_file): - if not options.ignore_dynamic_linking: - diagnostics.warning('emcc', 'ignoring dynamic library %s because not compiling to JS or HTML, remember to link it when compiling to JS or HTML at the end', os.path.basename(input_file)) - return False - else: - return True - - return [f for f in inputs if check(f)] - - -def filter_out_duplicate_dynamic_libs(inputs): - seen = set() - - # Filter out duplicate "fake" shared libraries (intermediate object files). - # See test_core.py:test_redundant_link - def check(input_file): - if get_file_suffix(input_file) in DYNAMICLIB_ENDINGS and not building.is_wasm_dylib(input_file): - abspath = os.path.abspath(input_file) - if abspath in seen: - return False - seen.add(abspath) - return True - - return [f for f in inputs if check(f)] - - -def process_dynamic_libs(dylibs, lib_dirs): - extras = [] - seen = set() - to_process = dylibs.copy() - while to_process: - dylib = to_process.pop() - dylink = webassembly.parse_dylink_section(dylib) - for needed in dylink.needed: - if needed in seen: - continue - path = find_library(needed, lib_dirs) - if path: - extras.append(path) - seen.add(needed) - else: - exit_with_error(f'{os.path.normpath(dylib)}: shared library dependency not found: `{needed}`') - to_process.append(path) - - dylibs += extras - for dylib in dylibs: - exports = webassembly.get_exports(dylib) - exports = set(e.name for e in exports) - settings.SIDE_MODULE_EXPORTS.extend(sorted(exports)) - - imports = webassembly.get_imports(dylib) - imports = [i.field for i in imports if i.kind in (webassembly.ExternType.FUNC, webassembly.ExternType.GLOBAL, webassembly.ExternType.TAG)] - # For now we ignore `invoke_` functions imported by side modules and rely - # on the dynamic linker to create them on the fly. - # TODO(sbc): Integrate with metadata.invokeFuncs that comes from the - # main module to avoid creating new invoke functions at runtime. - imports = set(imports) - imports = set(i for i in imports if not i.startswith('invoke_')) - strong_imports = sorted(imports.difference(exports)) - logger.debug('Adding symbols requirements from `%s`: %s', dylib, imports) - - mangled_imports = [shared.asmjs_mangle(e) for e in sorted(imports)] - mangled_strong_imports = [shared.asmjs_mangle(e) for e in strong_imports] - settings.SIDE_MODULE_IMPORTS.extend(mangled_imports) - settings.EXPORT_IF_DEFINED.extend(sorted(imports)) - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE.extend(sorted(imports)) - building.user_requested_exports.update(mangled_strong_imports) - - -def unmangle_symbols_from_cmdline(symbols): - def unmangle(x): - return x.replace('.', ' ').replace('#', '&').replace('?', ',') - - if type(symbols) is list: - return [unmangle(x) for x in symbols] - return unmangle(symbols) - - def parse_s_args(args): settings_changes = [] for i in range(len(args)): @@ -891,7 +317,7 @@ def parse_s_args(args): key = args[i + 1] args[i + 1] = '' else: - key = strip_prefix(args[i], '-s') + key = removeprefix(args[i], '-s') args[i] = '' # If not = is specified default to 1 @@ -914,47 +340,6 @@ def parse_s_args(args): return (settings_changes, newargs) -def emsdk_cflags(user_args): - cflags = ['--sysroot=' + cache.get_sysroot(absolute=True)] - - def array_contains_any_of(hay, needles): - for n in needles: - if n in hay: - return True - - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER) or array_contains_any_of(user_args, SIMD_NEON_FLAGS): - if '-msimd128' not in user_args and '-mrelaxed-simd' not in user_args: - exit_with_error('Passing any of ' + ', '.join(SIMD_INTEL_FEATURE_TOWER + SIMD_NEON_FLAGS) + ' flags also requires passing -msimd128 (or -mrelaxed-simd)!') - cflags += ['-D__SSE__=1'] - - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[1:]): - cflags += ['-D__SSE2__=1'] - - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[2:]): - cflags += ['-D__SSE3__=1'] - - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[3:]): - cflags += ['-D__SSSE3__=1'] - - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[4:]): - cflags += ['-D__SSE4_1__=1'] - - # Handle both -msse4.2 and its alias -msse4. - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[5:]): - cflags += ['-D__SSE4_2__=1'] - - if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[7:]): - cflags += ['-D__AVX__=1'] - - if array_contains_any_of(user_args, SIMD_NEON_FLAGS): - cflags += ['-D__ARM_NEON__=1'] - - if not settings.USE_SDL: - cflags += ['-Xclang', '-iwithsysroot' + os.path.join('/include', 'fakesdl')] - - return cflags + ['-Xclang', '-iwithsysroot' + os.path.join('/include', 'compat')] - - def get_target_flags(): return ['-target', shared.get_llvm_target()] @@ -1010,6 +395,7 @@ def get_cflags(user_args, is_cxx): # Flags we pass to the compiler when building C/C++ code # We add these to the user's flags (newargs), but not when building .s or .S assembly files cflags = get_clang_flags(user_args) + cflags.append('--sysroot=' + cache.get_sysroot(absolute=True)) if settings.EMSCRIPTEN_TRACING: cflags.append('-D__EMSCRIPTEN_TRACING__=1') @@ -1038,23 +424,44 @@ def get_cflags(user_args, is_cxx): ports.add_cflags(cflags, settings) - if '-nostdinc' in user_args: - return cflags + def array_contains_any_of(hay, needles): + for n in needles: + if n in hay: + return True - cflags += emsdk_cflags(user_args) - return cflags + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER) or array_contains_any_of(user_args, SIMD_NEON_FLAGS): + if '-msimd128' not in user_args and '-mrelaxed-simd' not in user_args: + exit_with_error('passing any of ' + ', '.join(SIMD_INTEL_FEATURE_TOWER + SIMD_NEON_FLAGS) + ' flags also requires passing -msimd128 (or -mrelaxed-simd)!') + cflags += ['-D__SSE__=1'] + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[1:]): + cflags += ['-D__SSE2__=1'] -def get_file_suffix(filename): - """Parses the essential suffix of a filename, discarding Unix-style version - numbers in the name. For example for 'libz.so.1.2.8' returns '.so'""" - if filename in SPECIAL_ENDINGLESS_FILENAMES: - return filename - while filename: - filename, suffix = os.path.splitext(filename) - if not suffix[1:].isdigit(): - return suffix - return '' + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[2:]): + cflags += ['-D__SSE3__=1'] + + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[3:]): + cflags += ['-D__SSSE3__=1'] + + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[4:]): + cflags += ['-D__SSE4_1__=1'] + + # Handle both -msse4.2 and its alias -msse4. + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[5:]): + cflags += ['-D__SSE4_2__=1'] + + if array_contains_any_of(user_args, SIMD_INTEL_FEATURE_TOWER[7:]): + cflags += ['-D__AVX__=1'] + + if array_contains_any_of(user_args, SIMD_NEON_FLAGS): + cflags += ['-D__ARM_NEON__=1'] + + if '-nostdinc' not in user_args: + if not settings.USE_SDL: + cflags += ['-Xclang', '-iwithsysroot' + os.path.join('/include', 'fakesdl')] + cflags += ['-Xclang', '-iwithsysroot' + os.path.join('/include', 'compat')] + + return cflags def get_library_basename(filename): @@ -1068,106 +475,11 @@ def get_library_basename(filename): return filename -def get_secondary_target(target, ext): - # Depending on the output format emscripten creates zero or more secondary - # output files (e.g. the .wasm file when creating JS output, or the - # .js and the .wasm file when creating html output. - # Thus function names the secondary output files, while ensuring they - # never collide with the primary one. - base = unsuffixed(target) - if get_file_suffix(target) == ext: - base += '_' - return base + ext - - -def in_temp(name): - temp_dir = shared.get_emscripten_temp_dir() - return os.path.join(temp_dir, os.path.basename(name)) - - -def dedup_list(lst): - # Since we require python 3.6, that ordering of dictionaries is guaranteed - # to be insertion order so we can use 'dict' here but not 'set'. - return list(dict.fromkeys(lst)) - - -def move_file(src, dst): - logging.debug('move: %s -> %s', src, dst) - if os.path.isdir(dst): - exit_with_error(f'cannot write output file `{dst}`: Is a directory') - src = os.path.abspath(src) - dst = os.path.abspath(dst) - if src == dst: - return - if dst == os.devnull: - return - shutil.move(src, dst) - - -# Returns the subresource location for run-time access -def get_subresource_location(path, data_uri=None): - if data_uri is None: - data_uri = settings.SINGLE_FILE - if data_uri: - # if the path does not exist, then there is no data to encode - if not os.path.exists(path): - return '' - data = base64.b64encode(utils.read_binary(path)) - return 'data:application/octet-stream;base64,' + data.decode('ascii') - else: - return os.path.basename(path) - - -@ToolchainProfiler.profile_block('package_files') -def package_files(options, target): - rtn = [] - logger.debug('setting up files') - file_args = ['--from-emcc'] - if options.preload_files: - file_args.append('--preload') - file_args += options.preload_files - if options.embed_files: - file_args.append('--embed') - file_args += options.embed_files - if options.exclude_files: - file_args.append('--exclude') - file_args += options.exclude_files - if options.use_preload_cache: - file_args.append('--use-preload-cache') - if settings.LZ4: - file_args.append('--lz4') - if options.use_preload_plugins: - file_args.append('--use-preload-plugins') - if not settings.ENVIRONMENT_MAY_BE_NODE: - file_args.append('--no-node') - if options.embed_files: - if settings.MEMORY64: - file_args += ['--wasm64'] - object_file = in_temp('embedded_files.o') - file_args += ['--obj-output=' + object_file] - rtn.append(object_file) - - cmd = [shared.FILE_PACKAGER, shared.replace_suffix(target, '.data')] + file_args - if options.preload_files: - # Preloading files uses --pre-js code that runs before the module is loaded. - file_code = shared.check_call(cmd, stdout=PIPE).stdout - js_manipulation.add_files_pre_js(options.pre_js, file_code) - else: - # Otherwise, we are embedding files, which does not require --pre-js code, - # and instead relies on a static constrcutor to populate the filesystem. - shared.check_call(cmd) - - return rtn - - -run_via_emxx = False - - # # Main run() function # def run(args): - if run_via_emxx: + if shared.run_via_emxx: clang = shared.CLANG_CXX else: clang = shared.CLANG_CC @@ -1194,8 +506,6 @@ def run(args): # Strip args[0] (program name) args = args[1:] - misc_temp_files = shared.get_temp_files() - # Handle some global flags # read response files very early on @@ -1221,6 +531,13 @@ def run(args): ''') return 0 + ## Process argument and setup the compiler + state = EmccState(args) + options, newargs = phase_parse_arguments(state) + + if not shared.SKIP_SUBPROCS: + shared.check_sanity() + if '--version' in args: print(version_string()) print('''\ @@ -1230,10 +547,6 @@ def run(args): ''') return 0 - if '-dumpmachine' in args: - print(shared.get_llvm_target()) - return 0 - if '-dumpversion' in args: # gcc's doc states "Print the compiler version [...] and don't do anything else." print(shared.EMSCRIPTEN_VERSION) return 0 @@ -1241,10 +554,10 @@ def run(args): if '--cflags' in args: # fake running the command, to see the full args we pass to clang args = [x for x in args if x != '--cflags'] - with misc_temp_files.get_file(suffix='.o') as temp_target: + with shared.get_temp_files().get_file(suffix='.o') as temp_target: input_file = 'hello_world.c' compiler = shared.EMCC - if run_via_emxx: + if shared.run_via_emxx: compiler = shared.EMXX cmd = [compiler, utils.path_from_root('test', input_file), '-v', '-c', '-o', temp_target] + args proc = run_process(cmd, stderr=PIPE, check=False) @@ -1252,27 +565,19 @@ def run(args): print(proc.stderr) exit_with_error('error getting cflags') lines = [x for x in proc.stderr.splitlines() if clang in x and input_file in x] + if not lines: + exit_with_error(f'unable to parse output of `{cmd}`:\n{proc.stderr}') parts = shlex.split(lines[0].replace('\\', '\\\\')) parts = [x for x in parts if x not in ['-c', '-o', '-v', '-emit-llvm'] and input_file not in x and temp_target not in x] print(shared.shlex_join(parts[1:])) return 0 - passthrough_flags = ['-print-search-dirs', '-print-libgcc-file-name'] - if any(a in args for a in passthrough_flags) or any(a.startswith('-print-file-name=') for a in args): - return run_process([clang] + args + get_cflags(args, run_via_emxx), check=False).returncode - - ## Process argument and setup the compiler - state = EmccState(args) - options, newargs = phase_parse_arguments(state) - - shared.check_sanity() - if 'EMMAKEN_NO_SDK' in os.environ: exit_with_error('EMMAKEN_NO_SDK is no longer supported. The standard -nostdlib and -nostdinc flags should be used instead') if 'EMMAKEN_COMPILER' in os.environ: exit_with_error('`EMMAKEN_COMPILER` is no longer supported.\n' + - 'Please use the `LLVM_ROOT` and/or `COMPILER_WRAPPER` config settings instread') + 'Please use the `LLVM_ROOT` and/or `COMPILER_WRAPPER` config settings instead') if 'EMMAKEN_CFLAGS' in os.environ: exit_with_error('`EMMAKEN_CFLAGS` is no longer supported, please use `EMCC_CFLAGS` instead') @@ -1286,104 +591,54 @@ def run(args): newargs, input_files = phase_setup(options, state, newargs) + if '-dumpmachine' in newargs or '-print-target-triple' in newargs or '--print-target-triple' in newargs: + print(shared.get_llvm_target()) + return 0 + + if '-print-search-dirs' in newargs or '--print-search-dirs' in newargs: + print(f'programs: ={config.LLVM_ROOT}') + print(f'libraries: ={cache.get_lib_dir(absolute=True)}') + return 0 + + if '-print-libgcc-file-name' in newargs or '--print-libgcc-file-name' in newargs: + settings.limit_settings(None) + compiler_rt = system_libs.Library.get_usable_variations()['libcompiler_rt'] + print(compiler_rt.get_path(absolute=True)) + return 0 + + print_file_name = [a for a in newargs if a.startswith('-print-file-name=') or a.startswith('--print-file-name=')] + if print_file_name: + libname = print_file_name[-1].split('=')[1] + system_libpath = cache.get_lib_dir(absolute=True) + fullpath = os.path.join(system_libpath, libname) + if os.path.isfile(fullpath): + print(fullpath) + else: + print(libname) + return 0 + if options.reproduce: create_reproduce_file(options.reproduce, args) if state.mode == Mode.POST_LINK_ONLY: - settings.limit_settings(None) - target, wasm_target = phase_linker_setup(options, state, newargs) - process_libraries(state, []) if len(input_files) != 1: exit_with_error('--post-link requires a single input file') - phase_post_link(options, state, input_files[0][1], wasm_target, target) + # Delay import of link.py to avoid processing this file when only compiling + from tools import link + link.run_post_link(input_files[0][1], options, state, newargs) return 0 ## Compile source code to object files linker_inputs = phase_compile_inputs(options, state, newargs, input_files) - if state.mode != Mode.COMPILE_AND_LINK: + if state.mode == Mode.COMPILE_AND_LINK: + # Delay import of link.py to avoid processing this file when only compiling + from tools import link + return link.run(linker_inputs, options, state, newargs) + else: logger.debug('stopping after compile phase') - for flag in state.link_flags: - diagnostics.warning('unused-command-line-argument', "argument unused during compilation: '%s'" % flag[1]) - for f in linker_inputs: - diagnostics.warning('unused-command-line-argument', "%s: linker input file unused because linking not done" % f[1]) - - return 0 - - # We have now passed the compile phase, allow reading/writing of all settings. - settings.limit_settings(None) - - if options.output_file and options.output_file.startswith('-'): - exit_with_error(f'invalid output filename: `{options.output_file}`') - - target, wasm_target = phase_linker_setup(options, state, newargs) - - # Link object files using wasm-ld or llvm-link (for bitcode linking) - linker_arguments = phase_calculate_linker_inputs(options, state, linker_inputs) - - # Embed and preload files - if len(options.preload_files) or len(options.embed_files): - linker_arguments += package_files(options, target) - - settings.PRE_JS_FILES = [os.path.abspath(f) for f in options.pre_js] - settings.POST_JS_FILES = [os.path.abspath(f) for f in options.post_js] - - if options.oformat == OFormat.OBJECT: - logger.debug(f'link_to_object: {linker_arguments} -> {target}') - building.link_to_object(linker_arguments, target) - logger.debug('stopping after linking to object file') return 0 - js_syms = {} - if not settings.SIDE_MODULE: - js_syms = get_all_js_syms() - deps_info.append_deps_info(js_syms) - - phase_calculate_system_libraries(state, linker_arguments, linker_inputs, newargs) - - phase_link(linker_arguments, wasm_target, js_syms) - - # Special handling for when the user passed '-Wl,--version'. In this case the linker - # does not create the output file, but just prints its version and exits with 0. - if '--version' in linker_arguments: - return 0 - - # TODO(sbc): In theory we should really run the whole pipeline even if the output is - # /dev/null, but that will take some refactoring - if target == os.devnull: - return 0 - - # Perform post-link steps (unless we are running bare mode) - if options.oformat != OFormat.BARE: - phase_post_link(options, state, wasm_target, wasm_target, target) - - return 0 - - -@ToolchainProfiler.profile_block('calculate linker inputs') -def phase_calculate_linker_inputs(options, state, linker_inputs): - using_lld = not (options.oformat == OFormat.OBJECT and settings.LTO) - state.link_flags = filter_link_flags(state.link_flags, using_lld) - - # Decide what we will link - process_libraries(state, linker_inputs) - - linker_args = [val for _, val in sorted(linker_inputs + state.link_flags)] - - # If we are linking to an intermediate object then ignore other - # "fake" dynamic libraries, since otherwise we will end up with - # multiple copies in the final executable. - if options.oformat == OFormat.OBJECT or options.ignore_dynamic_linking: - linker_args = filter_out_dynamic_libs(options, linker_args) - else: - linker_args = filter_out_duplicate_dynamic_libs(linker_args) - - if settings.MAIN_MODULE: - dylibs = [a for a in linker_args if building.is_wasm_dylib(a)] - process_dynamic_libs(dylibs, state.lib_dirs) - - return linker_args - def normalize_boolean_setting(name, value): # boolean NO_X settings are aliases for X @@ -1391,7 +646,7 @@ def normalize_boolean_setting(name, value): # and we can't just flip them, so leave them as-is to be # handled in a special way later) if name.startswith('NO_') and value in ('0', '1'): - name = strip_prefix(name, 'NO_') + name = removeprefix(name, 'NO_') value = str(1 - int(value)) return name, value @@ -1408,10 +663,13 @@ def phase_parse_arguments(state): # warnings are properly printed during arg parse. newargs = diagnostics.capture_warnings(newargs) + if not diagnostics.is_enabled('deprecated'): + settings.WARN_DEPRECATED = 0 + for i in range(len(newargs)): - if newargs[i] in ('-l', '-L', '-I'): - # Scan for individual -l/-L/-I arguments and concatenate the next arg on - # if there is no suffix + if newargs[i] in ('-l', '-L', '-I', '-z'): + # Scan for flags that can be written as either one or two arguments + # and normalize them to the single argument form. newargs[i] += newargs[i + 1] newargs[i + 1] = '' @@ -1426,6 +684,9 @@ def phase_parse_arguments(state): for s in settings_changes: key, value = s.split('=', 1) key, value = normalize_boolean_setting(key, value) + old_value = user_settings.get(key) + if old_value and old_value != value: + diagnostics.warning('unused-command-line-argument', f'-s{key} specified multiple times. Ignoring previous value (`{old_value}`)') user_settings[key] = value # STRICT is used when applying settings so it needs to be applied first before @@ -1450,12 +711,8 @@ def phase_setup(options, state, newargs): """ if settings.RUNTIME_LINKED_LIBS: - diagnostics.warning('deprecated', 'RUNTIME_LINKED_LIBS is deprecated; you can simply list the libraries directly on the commandline now') newargs += settings.RUNTIME_LINKED_LIBS - if settings.STRICT: - default_setting('DEFAULT_TO_CXX', 0) - # Find input files # These three arrays are used to store arguments of different types for @@ -1476,13 +733,14 @@ def phase_setup(options, state, newargs): continue arg = newargs[i] - if arg in ('-MT', '-MF', '-MJ', '-MQ', '-D', '-U', '-o', '-x', + if arg in {'-MT', '-MF', '-MJ', '-MQ', '-D', '-U', '-o', '-x', '-Xpreprocessor', '-include', '-imacros', '-idirafter', '-iprefix', '-iwithprefix', '-iwithprefixbefore', '-isysroot', '-imultilib', '-A', '-isystem', '-iquote', '-install_name', '-compatibility_version', '-current_version', '-I', '-L', '-include-pch', - '-Xlinker', '-Xclang'): + '-undefined', '-target', + '-Xlinker', '-Xclang', '-z'}: skip = True if not arg.startswith('-'): @@ -1496,52 +754,31 @@ def phase_setup(options, state, newargs): file_suffix = get_file_suffix(arg) if file_suffix in HEADER_ENDINGS: has_header_inputs = True - if file_suffix in STATICLIB_ENDINGS and not building.is_ar(arg): - if building.is_bitcode(arg): - message = f'{arg}: File has a suffix of a static library {STATICLIB_ENDINGS}, but instead is an LLVM bitcode file! When linking LLVM bitcode files use .bc or .o.' - else: - message = arg + ': Unknown format, not a static library!' - exit_with_error(message) - if file_suffix in DYNAMICLIB_ENDINGS and not building.is_bitcode(arg) and not building.is_wasm(arg): - # For shared libraries that are neither bitcode nor wasm, assuming its local native - # library and attempt to find a library by the same name in our own library path. - # TODO(sbc): Do we really need this feature? See test_other.py:test_local_link - libname = strip_prefix(get_library_basename(arg), 'lib') - flag = '-l' + libname - diagnostics.warning('map-unrecognized-libraries', f'unrecognized file type: `{arg}`. Mapping to `{flag}` and hoping for the best') - add_link_flag(state, i, flag) - else: - input_files.append((i, arg)) + input_files.append((i, arg)) elif arg.startswith('-L'): - add_link_flag(state, i, arg) - newargs[i] = '' + state.add_link_flag(i, arg) elif arg.startswith('-l'): - add_link_flag(state, i, arg) - newargs[i] = '' + state.add_link_flag(i, arg) + elif arg == '-z': + state.add_link_flag(i, newargs[i]) + state.add_link_flag(i + 1, newargs[i + 1]) + elif arg.startswith('-z'): + state.add_link_flag(i, newargs[i]) elif arg.startswith('-Wl,'): # Multiple comma separated link flags can be specified. Create fake # fractional indices for these: -Wl,a,b,c,d at index 4 becomes: # (4, a), (4.25, b), (4.5, c), (4.75, d) link_flags_to_add = arg.split(',')[1:] for flag_index, flag in enumerate(link_flags_to_add): - add_link_flag(state, i + float(flag_index) / len(link_flags_to_add), flag) - newargs[i] = '' + state.add_link_flag(i + float(flag_index) / len(link_flags_to_add), flag) elif arg == '-Xlinker': - add_link_flag(state, i + 1, newargs[i + 1]) - newargs[i] = '' - newargs[i + 1] = '' + state.add_link_flag(i + 1, newargs[i + 1]) elif arg == '-s': - # -s and some other compiler flags are normally passed onto the linker - # TODO(sbc): Pass this and other flags through when using lld - # link_flags.append((i, arg)) - newargs[i] = '' + state.add_link_flag(i, newargs[i]) elif arg == '-': input_files.append((i, arg)) newargs[i] = '' - if not input_files and not state.link_flags: - exit_with_error('no input files') - newargs = [a for a in newargs if a] # SSEx is implemented on top of SIMD128 instruction set, but do not pass SSE flags to LLVM @@ -1572,25 +809,6 @@ def phase_setup(options, state, newargs): diagnostics.warning( 'unused-command-line-argument', "linker flag ignored during compilation: '%s'" % arg) - if state.has_dash_c: - if '-emit-llvm' in newargs: - options.default_object_extension = '.bc' - elif state.has_dash_S: - if '-emit-llvm' in newargs: - options.default_object_extension = '.ll' - else: - options.default_object_extension = '.s' - elif '-M' in newargs or '-MM' in newargs: - options.default_object_extension = '.mout' # not bitcode, not js; but just dependency rule of the input file - - if options.output_file and len(input_files) > 1: - exit_with_error('cannot specify -o with -c/-S/-E/-M and multiple source files') - else: - for arg in state.orig_args: - if any(arg.startswith(f) for f in COMPILE_ONLY_FLAGS): - diagnostics.warning( - 'unused-command-line-argument', - "compiler flag ignored during linking: '%s'" % arg) if settings.MAIN_MODULE or settings.SIDE_MODULE: settings.RELOCATABLE = 1 @@ -1610,6 +828,9 @@ def phase_setup(options, state, newargs): if '-mbulk-memory' not in newargs: newargs += ['-mbulk-memory'] + if settings.SHARED_MEMORY: + settings.BULK_MEMORY = 1 + if 'DISABLE_EXCEPTION_CATCHING' in user_settings and 'EXCEPTION_CATCHING_ALLOWED' in user_settings: # If we get here then the user specified both DISABLE_EXCEPTION_CATCHING and EXCEPTION_CATCHING_ALLOWED # on the command line. This is no longer valid so report either an error or a warning (for @@ -1630,7 +851,7 @@ def phase_setup(options, state, newargs): # -fwasm-exceptions takes care of enabling them, so users aren't supposed to # pass them explicitly, regardless of their values if 'DISABLE_EXCEPTION_CATCHING' in user_settings or 'DISABLE_EXCEPTION_THROWING' in user_settings: - diagnostics.warning('emcc', 'You no longer need to pass DISABLE_EXCEPTION_CATCHING or DISABLE_EXCEPTION_THROWING when using Wasm exceptions') + diagnostics.warning('emcc', 'you no longer need to pass DISABLE_EXCEPTION_CATCHING or DISABLE_EXCEPTION_THROWING when using Wasm exceptions') settings.DISABLE_EXCEPTION_CATCHING = 1 settings.DISABLE_EXCEPTION_THROWING = 1 @@ -1643,7 +864,12 @@ def phase_setup(options, state, newargs): if settings.DISABLE_EXCEPTION_THROWING and not settings.DISABLE_EXCEPTION_CATCHING: exit_with_error("DISABLE_EXCEPTION_THROWING was set (probably from -fno-exceptions) but is not compatible with enabling exception catching (DISABLE_EXCEPTION_CATCHING=0). If you don't want exceptions, set DISABLE_EXCEPTION_CATCHING to 1; if you do want exceptions, don't link with -fno-exceptions") + if options.target.startswith('wasm64'): + default_setting('MEMORY64', 1) + if settings.MEMORY64: + if options.target.startswith('wasm32'): + exit_with_error('wasm32 target is not compatible with -sMEMORY64') diagnostics.warning('experimental', '-sMEMORY64 is still experimental. Many features may not work.') # Wasm SjLj cannot be used with Emscripten EH @@ -1668,1262 +894,39 @@ def phase_setup(options, state, newargs): else: settings.SUPPORT_LONGJMP = 'emscripten' - return (newargs, input_files) - - -def setup_pthreads(target): - if settings.RELOCATABLE: - # phtreads + dyanmic linking has certain limitations - if settings.SIDE_MODULE: - diagnostics.warning('experimental', '-sSIDE_MODULE + pthreads is experimental') - elif settings.MAIN_MODULE: - diagnostics.warning('experimental', '-sMAIN_MODULE + pthreads is experimental') - elif settings.LINKABLE: - diagnostics.warning('experimental', '-sLINKABLE + pthreads is experimental') - if settings.ALLOW_MEMORY_GROWTH: - diagnostics.warning('pthreads-mem-growth', '-pthread + ALLOW_MEMORY_GROWTH may run non-wasm code slowly, see https://github.com/WebAssembly/design/issues/1271') - - default_setting('DEFAULT_PTHREAD_STACK_SIZE', settings.STACK_SIZE) - - # Functions needs to be exported from the module since they are used in worker.js - settings.REQUIRED_EXPORTS += [ - 'emscripten_dispatch_to_thread_', - '_emscripten_thread_free_data', - 'emscripten_main_runtime_thread_id', - 'emscripten_main_thread_process_queued_calls', - '_emscripten_run_in_main_runtime_thread_js', - 'emscripten_stack_set_limits', - ] - - if settings.MAIN_MODULE: - settings.REQUIRED_EXPORTS += [ - '_emscripten_dlsync_self', - '_emscripten_dlsync_self_async', - '_emscripten_proxy_dlsync', - '_emscripten_proxy_dlsync_async', - '__dl_seterr', - ] - - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ - '$exitOnMainThread', - ] - # Some symbols are required by worker.js. - # Because emitDCEGraph only considers the main js file, and not worker.js - # we have explicitly mark these symbols as user-exported so that they will - # kept alive through DCE. - # TODO: Find a less hacky way to do this, perhaps by also scanning worker.js - # for roots. - worker_imports = [ - '__emscripten_thread_init', - '__emscripten_thread_exit', - '__emscripten_thread_crashed', - '__emscripten_thread_mailbox_await', - '__emscripten_tls_init', - '_pthread_self', - 'checkMailbox', - ] - settings.EXPORTED_FUNCTIONS += worker_imports - building.user_requested_exports.update(worker_imports) - - # set location of worker.js - settings.PTHREAD_WORKER_FILE = unsuffixed_basename(target) + '.worker.js' - - if settings.MINIMAL_RUNTIME: - building.user_requested_exports.add('exit') - - # All proxying async backends will need this. - if settings.WASMFS: - settings.REQUIRED_EXPORTS += ['emscripten_proxy_finish'] - # TODO: Remove this once we no longer need the heartbeat hack in - # wasmfs/thread_utils.h - settings.REQUIRED_EXPORTS += ['emscripten_proxy_execute_queue'] - - # pthread stack setup and other necessary utilities - def include_and_export(name): - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$' + name] - settings.EXPORTED_FUNCTIONS += [name] - - include_and_export('establishStackSpace') - include_and_export('invokeEntryPoint') - include_and_export('PThread') - if not settings.MINIMAL_RUNTIME: - # keepRuntimeAlive does not apply to MINIMAL_RUNTIME. - settings.EXPORTED_RUNTIME_METHODS += ['keepRuntimeAlive', 'ExitStatus', 'wasmMemory'] - - if settings.MODULARIZE: - if not settings.EXPORT_ES6 and settings.EXPORT_NAME == 'Module': - exit_with_error('pthreads + MODULARIZE currently require you to set -sEXPORT_NAME=Something (see settings.js) to Something != Module, so that the .worker.js file can work') - - # MODULARIZE+PTHREADS mode requires extra exports out to Module so that worker.js - # can access them: - - # general threading variables: - settings.EXPORTED_RUNTIME_METHODS += ['PThread'] - - # To keep code size to minimum, MINIMAL_RUNTIME does not utilize the global ExitStatus - # object, only regular runtime has it. - if not settings.MINIMAL_RUNTIME: - settings.EXPORTED_RUNTIME_METHODS += ['ExitStatus'] - - -@ToolchainProfiler.profile_block('linker_setup') -def phase_linker_setup(options, state, newargs): - autoconf = os.environ.get('EMMAKEN_JUST_CONFIGURE') or 'conftest.c' in state.orig_args or 'conftest.cpp' in state.orig_args - if autoconf: - # configure tests want a more shell-like style, where we emit return codes on exit() - settings.EXIT_RUNTIME = 1 - # use node.js raw filesystem access, to behave just like a native executable - settings.NODERAWFS = 1 - # Add `#!` line to output JS and make it executable. - options.executable = True - - system_libpath = '-L' + str(cache.get_lib_dir(absolute=True)) - add_link_flag(state, sys.maxsize, system_libpath) - - if settings.OPT_LEVEL >= 1: - default_setting('ASSERTIONS', 0) - - if options.emrun: - options.pre_js.append(utils.path_from_root('src/emrun_prejs.js')) - options.post_js.append(utils.path_from_root('src/emrun_postjs.js')) - # emrun mode waits on program exit - settings.EXIT_RUNTIME = 1 - - if options.cpu_profiler: - options.post_js.append(utils.path_from_root('src/cpuprofiler.js')) - - if not settings.RUNTIME_DEBUG: - settings.RUNTIME_DEBUG = (settings.LIBRARY_DEBUG or - settings.GL_DEBUG or - settings.DYLINK_DEBUG or - settings.OPENAL_DEBUG or - settings.SYSCALL_DEBUG or - settings.WEBSOCKET_DEBUG or - settings.SOCKET_DEBUG or - settings.FETCH_DEBUG or - settings.EXCEPTION_DEBUG or - settings.PTHREADS_DEBUG or - settings.ASYNCIFY_DEBUG) - - if options.memory_profiler: - settings.MEMORYPROFILER = 1 - - if settings.PTHREADS_PROFILING: - if not settings.ASSERTIONS: - exit_with_error('PTHREADS_PROFILING only works with ASSERTIONS enabled') - options.post_js.append(utils.path_from_root('src/threadprofiler.js')) - - options.extern_pre_js = read_js_files(options.extern_pre_js) - options.extern_post_js = read_js_files(options.extern_post_js) - - # TODO: support source maps with js_transform - if options.js_transform and settings.GENERATE_SOURCE_MAP: - logger.warning('disabling source maps because a js transform is being done') - settings.GENERATE_SOURCE_MAP = 0 - - # options.output_file is the user-specified one, target is what we will generate - if options.output_file: - target = options.output_file - # check for the existence of the output directory now, to avoid having - # to do so repeatedly when each of the various output files (.mem, .wasm, - # etc) are written. This gives a more useful error message than the - # IOError and python backtrace that users would otherwise see. - dirname = os.path.dirname(target) - if dirname and not os.path.isdir(dirname): - exit_with_error("specified output file (%s) is in a directory that does not exist" % target) - elif autoconf: - # Autoconf expects the executable output file to be called `a.out` - target = 'a.out' - elif settings.SIDE_MODULE: - target = 'a.out.wasm' - else: - target = 'a.out.js' - - final_suffix = get_file_suffix(target) - - if settings.EXTRA_EXPORTED_RUNTIME_METHODS: - diagnostics.warning('deprecated', 'EXTRA_EXPORTED_RUNTIME_METHODS is deprecated, please use EXPORTED_RUNTIME_METHODS instead') - settings.EXPORTED_RUNTIME_METHODS += settings.EXTRA_EXPORTED_RUNTIME_METHODS - - # If no output format was specified we try to deduce the format based on - # the output filename extension - if not options.oformat and (options.relocatable or (options.shared and not settings.SIDE_MODULE)): - # Until we have a better story for actually producing runtime shared libraries - # we support a compatibility mode where shared libraries are actually just - # object files linked with `wasm-ld --relocatable` or `llvm-link` in the case - # of LTO. - if final_suffix in EXECUTABLE_ENDINGS: - diagnostics.warning('emcc', '-shared/-r used with executable output suffix. This behaviour is deprecated. Please remove -shared/-r to build an executable or avoid the executable suffix (%s) when building object files.' % final_suffix) - else: - if options.shared: - diagnostics.warning('emcc', 'linking a library with `-shared` will emit a static object file. This is a form of emulation to support existing build systems. If you want to build a runtime shared library use the SIDE_MODULE setting.') - options.oformat = OFormat.OBJECT - - if not options.oformat: - if settings.SIDE_MODULE or final_suffix == '.wasm': - options.oformat = OFormat.WASM - elif final_suffix == '.mjs': - options.oformat = OFormat.MJS - elif final_suffix == '.html': - options.oformat = OFormat.HTML - else: - options.oformat = OFormat.JS + # SDL2 requires eglGetProcAddress() to work. + # NOTE: if SDL2 is updated to not rely on eglGetProcAddress(), this can be removed + if settings.USE_SDL == 2 or settings.USE_SDL_MIXER == 2 or settings.USE_SDL_GFX == 2: + default_setting('GL_ENABLE_GET_PROC_ADDRESS', 1) - if options.oformat == OFormat.MJS: - settings.EXPORT_ES6 = 1 - settings.MODULARIZE = 1 - - if options.oformat in (OFormat.WASM, OFormat.BARE): - # If the user asks directly for a wasm file then this *is* the target - wasm_target = target - else: - # Otherwise the wasm file is produced alongside the final target. - wasm_target = get_secondary_target(target, '.wasm') - - if settings.SAFE_HEAP not in [0, 1, 2]: - exit_with_error('emcc: SAFE_HEAP must be 0, 1 or 2') - - if not settings.WASM: - # When the user requests non-wasm output, we enable wasm2js. that is, - # we still compile to wasm normally, but we compile the final output - # to js. - settings.WASM = 1 - settings.WASM2JS = 1 - if settings.WASM == 2: - # Requesting both Wasm and Wasm2JS support - settings.WASM2JS = 1 - - if (options.oformat == OFormat.WASM or settings.PURE_WASI) and not settings.SIDE_MODULE: - # if the output is just a wasm file, it will normally be a standalone one, - # as there is no JS. an exception are side modules, as we can't tell at - # compile time whether JS will be involved or not - the main module may - # have JS, and the side module is expected to link against that. - # we also do not support standalone mode in fastcomp. - settings.STANDALONE_WASM = 1 - - if settings.LZ4: - settings.EXPORTED_RUNTIME_METHODS += ['LZ4'] - - if settings.WASM2C: - # wasm2c only makes sense with standalone wasm - there will be no JS, - # just wasm and then C - settings.STANDALONE_WASM = 1 - # wasm2c doesn't need any special handling of i64, we have proper i64 - # handling on the FFI boundary, which is exactly like the case of JS with - # BigInt support - settings.WASM_BIGINT = 1 - - if options.no_entry: - settings.EXPECT_MAIN = 0 - elif settings.STANDALONE_WASM: - if '_main' in settings.EXPORTED_FUNCTIONS: - # TODO(sbc): Make this into a warning? - logger.debug('including `_main` in EXPORTED_FUNCTIONS is not necessary in standalone mode') - else: - # In normal non-standalone mode we have special handling of `_main` in EXPORTED_FUNCTIONS. - # 1. If the user specifies exports, but doesn't include `_main` we assume they want to build a - # reactor. - # 2. If the user doesn't export anything we default to exporting `_main` (unless `--no-entry` - # is specified (see above). - if 'EXPORTED_FUNCTIONS' in user_settings: - if '_main' not in settings.USER_EXPORTED_FUNCTIONS: - settings.EXPECT_MAIN = 0 - else: - assert not settings.EXPORTED_FUNCTIONS - settings.EXPORTED_FUNCTIONS = ['_main'] - - if settings.STANDALONE_WASM: - # In STANDALONE_WASM mode we either build a command or a reactor. - # See https://github.com/WebAssembly/WASI/blob/main/design/application-abi.md - # For a command we always want EXIT_RUNTIME=1 - # For a reactor we always want EXIT_RUNTIME=0 - if 'EXIT_RUNTIME' in user_settings: - exit_with_error('Explicitly setting EXIT_RUNTIME not compatible with STANDALONE_WASM. EXIT_RUNTIME will always be True for programs (with a main function) and False for reactors (not main function).') - settings.EXIT_RUNTIME = settings.EXPECT_MAIN - settings.IGNORE_MISSING_MAIN = 0 - # the wasm must be runnable without the JS, so there cannot be anything that - # requires JS legalization - settings.LEGALIZE_JS_FFI = 0 - if 'MEMORY_GROWTH_LINEAR_STEP' in user_settings: - exit_with_error('MEMORY_GROWTH_LINEAR_STEP is not compatible with STANDALONE_WASM') - if 'MEMORY_GROWTH_GEOMETRIC_CAP' in user_settings: - exit_with_error('MEMORY_GROWTH_GEOMETRIC_CAP is not compatible with STANDALONE_WASM') - if settings.MINIMAL_RUNTIME: - exit_with_error('MINIMAL_RUNTIME reduces JS size, and is incompatible with STANDALONE_WASM which focuses on ignoring JS anyhow and being 100% wasm') - - # Note the exports the user requested - building.user_requested_exports.update(settings.EXPORTED_FUNCTIONS) - - if '_main' in settings.EXPORTED_FUNCTIONS: - settings.EXPORT_IF_DEFINED.append('__main_argc_argv') - - if settings.ASSERTIONS: - # Exceptions are thrown with a stack trace by default when ASSERTIONS is - # set and when building with either -fexceptions or -fwasm-exceptions. - if 'EXCEPTION_STACK_TRACES' in user_settings and not settings.EXCEPTION_STACK_TRACES: - exit_with_error('EXCEPTION_STACK_TRACES cannot be disabled when ASSERTIONS are enabled') - if settings.WASM_EXCEPTIONS or not settings.DISABLE_EXCEPTION_CATCHING: - settings.EXCEPTION_STACK_TRACES = 1 - - # -sASSERTIONS implies basic stack overflow checks, and ASSERTIONS=2 - # implies full stack overflow checks. However, we don't set this default in - # PURE_WASI, or when we are linking without standard libraries because - # STACK_OVERFLOW_CHECK depends on emscripten_stack_get_end which is defined - # in libcompiler-rt. - if not settings.PURE_WASI and '-nostdlib' not in newargs and '-nodefaultlibs' not in newargs: - default_setting('STACK_OVERFLOW_CHECK', max(settings.ASSERTIONS, settings.STACK_OVERFLOW_CHECK)) - - # For users that opt out of WARN_ON_UNDEFINED_SYMBOLS we assume they also - # want to opt out of ERROR_ON_UNDEFINED_SYMBOLS. - if user_settings.get('WARN_ON_UNDEFINED_SYMBOLS') == '0': - default_setting('ERROR_ON_UNDEFINED_SYMBOLS', 0) - - # It is unlikely that developers targeting "native web" APIs with MINIMAL_RUNTIME need - # errno support by default. - if settings.MINIMAL_RUNTIME: - default_setting('SUPPORT_ERRNO', 0) - # Require explicit -lfoo.js flags to link with JS libraries. - default_setting('AUTO_JS_LIBRARIES', 0) - # When using MINIMAL_RUNTIME, symbols should only be exported if requested. - default_setting('EXPORT_KEEPALIVE', 0) - - if settings.STRICT_JS and (settings.MODULARIZE or settings.EXPORT_ES6): - exit_with_error("STRICT_JS doesn't work with MODULARIZE or EXPORT_ES6") - - if settings.STRICT: - if not settings.MODULARIZE and not settings.EXPORT_ES6: - default_setting('STRICT_JS', 1) - default_setting('AUTO_JS_LIBRARIES', 0) - default_setting('AUTO_NATIVE_LIBRARIES', 0) - default_setting('AUTO_ARCHIVE_INDEXES', 0) - default_setting('IGNORE_MISSING_MAIN', 0) - default_setting('ALLOW_UNIMPLEMENTED_SYSCALLS', 0) - - if 'GLOBAL_BASE' not in user_settings and not settings.SHRINK_LEVEL and not settings.OPT_LEVEL: - # When optimizing for size it helps to put static data first before - # the stack (sincs this makes instructions for accessing this data - # use a smaller LEB encoding). - # However, for debugability is better to have the stack come first - # (becuase stack overflows will trap rather than corrupting data). - settings.STACK_FIRST = True - - # Default to TEXTDECODER=2 (always use TextDecoder to decode UTF-8 strings) - # in -Oz builds, since custom decoder for UTF-8 takes up space. - # In pthreads enabled builds, TEXTDECODER==2 may not work, see - # https://github.com/whatwg/encoding/issues/172 - # When supporting shell environments, do not do this as TextDecoder is not - # widely supported there. - if settings.SHRINK_LEVEL >= 2 and not settings.SHARED_MEMORY and \ - not settings.ENVIRONMENT_MAY_BE_SHELL: - default_setting('TEXTDECODER', 2) - - # If set to 1, we will run the autodebugger (the automatic debugging tool, see - # tools/autodebugger). Note that this will disable inclusion of libraries. This - # is useful because including dlmalloc makes it hard to compare native and js - # builds - if os.environ.get('EMCC_AUTODEBUG'): - settings.AUTODEBUG = 1 - - # Use settings - - if settings.DEBUG_LEVEL > 1 and options.use_closure_compiler: - diagnostics.warning('emcc', 'disabling closure because debug info was requested') - options.use_closure_compiler = False - - if settings.WASM == 2 and settings.SINGLE_FILE: - exit_with_error('cannot have both WASM=2 and SINGLE_FILE enabled at the same time') - - if settings.SEPARATE_DWARF and settings.WASM2JS: - exit_with_error('cannot have both SEPARATE_DWARF and WASM2JS at the same time (as there is no wasm file)') - - if settings.MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION and settings.MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION: - exit_with_error('MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION and MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION are mutually exclusive!') - - if options.emrun: - if settings.MINIMAL_RUNTIME: - exit_with_error('--emrun is not compatible with MINIMAL_RUNTIME') - - if options.use_closure_compiler: - settings.USE_CLOSURE_COMPILER = 1 - - if 'CLOSURE_WARNINGS' in user_settings: - if settings.CLOSURE_WARNINGS not in ['quiet', 'warn', 'error']: - exit_with_error('Invalid option -sCLOSURE_WARNINGS=%s specified! Allowed values are "quiet", "warn" or "error".' % settings.CLOSURE_WARNINGS) - - diagnostics.warning('deprecated', 'CLOSURE_WARNINGS is deprecated, use -Wclosure/-Wno-closure instread') - closure_warnings = diagnostics.manager.warnings['closure'] - if settings.CLOSURE_WARNINGS == 'error': - closure_warnings['error'] = True - closure_warnings['enabled'] = True - elif settings.CLOSURE_WARNINGS == 'warn': - closure_warnings['error'] = False - closure_warnings['enabled'] = True - elif settings.CLOSURE_WARNINGS == 'quiet': - closure_warnings['error'] = False - closure_warnings['enabled'] = False - - if not settings.MINIMAL_RUNTIME: - if not settings.BOOTSTRAPPING_STRUCT_INFO: - if settings.DYNCALLS: - # Include dynCall() function by default in DYNCALLS builds in classic runtime; in MINIMAL_RUNTIME, must add this explicitly. - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$dynCall'] - - if settings.ASSERTIONS: - # "checkUnflushedContent()" and "missingLibrarySymbol()" depend on warnOnce - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$warnOnce'] - - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$getValue', '$setValue'] - - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$ExitStatus'] - - if not settings.BOOTSTRAPPING_STRUCT_INFO and settings.SAFE_HEAP: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$getValue_safe', '$setValue_safe'] - - if settings.MAIN_MODULE: - assert not settings.SIDE_MODULE - if settings.MAIN_MODULE == 1: - settings.INCLUDE_FULL_LIBRARY = 1 - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$loadDylibs'] - - # If we are including the entire JS library then we know for sure we will, by definition, - # require all the reverse dependencies. - if settings.INCLUDE_FULL_LIBRARY: - default_setting('REVERSE_DEPS', 'all') - - if settings.MAIN_MODULE == 1 or settings.SIDE_MODULE == 1: - settings.LINKABLE = 1 - - if settings.LINKABLE and settings.USER_EXPORTED_FUNCTIONS: - diagnostics.warning('unused-command-line-argument', 'EXPORTED_FUNCTIONS is not valid with LINKABLE set (normally due to SIDE_MODULE=1/MAIN_MODULE=1) since all functions are exported this mode. To export only a subset use SIDE_MODULE=2/MAIN_MODULE=2') - - if settings.MAIN_MODULE: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ - '$getDylinkMetadata', - '$mergeLibSymbols', - ] - - if settings.PTHREADS: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ - '$registerTLSInit', - ] - - if settings.RELOCATABLE: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ - '$reportUndefinedSymbols', - '$relocateExports', - '$GOTHandler', - '__heap_base', - '__stack_pointer', - ] - - if settings.ASYNCIFY: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ - '__asyncify_state', - '__asyncify_data' - ] - - # Emscripten EH dependency in library_dylink.js - if settings.SUPPORT_LONGJMP == 'emscripten' or not settings.DISABLE_EXCEPTION_CATCHING: - settings.REQUIRED_EXPORTS += ['setThrew'] - - if settings.MINIMAL_RUNTIME: - exit_with_error('MINIMAL_RUNTIME is not compatible with relocatable output') - if settings.WASM2JS: - exit_with_error('WASM2JS is not compatible with relocatable output') - # shared modules need memory utilities to allocate their memory - settings.ALLOW_TABLE_GROWTH = 1 - - # various settings require sbrk() access - if settings.DETERMINISTIC or \ - settings.EMSCRIPTEN_TRACING or \ - settings.SAFE_HEAP or \ - settings.MEMORYPROFILER: - settings.REQUIRED_EXPORTS += ['sbrk'] - - if settings.MEMORYPROFILER: - settings.REQUIRED_EXPORTS += ['__heap_base', - 'emscripten_stack_get_base', - 'emscripten_stack_get_end', - 'emscripten_stack_get_current'] - - if settings.ASYNCIFY_LAZY_LOAD_CODE: - settings.ASYNCIFY = 1 - - if settings.ASYNCIFY == 1: - # See: https://github.com/emscripten-core/emscripten/issues/12065 - # See: https://github.com/emscripten-core/emscripten/issues/12066 - settings.DYNCALLS = 1 - settings.REQUIRED_EXPORTS += ['emscripten_stack_get_base', - 'emscripten_stack_get_end', - 'emscripten_stack_set_limits'] - - settings.ASYNCIFY_ADD = unmangle_symbols_from_cmdline(settings.ASYNCIFY_ADD) - settings.ASYNCIFY_REMOVE = unmangle_symbols_from_cmdline(settings.ASYNCIFY_REMOVE) - settings.ASYNCIFY_ONLY = unmangle_symbols_from_cmdline(settings.ASYNCIFY_ONLY) - - if settings.EMULATE_FUNCTION_POINTER_CASTS: - # Emulated casts forces a wasm ABI of (i64, i64, ...) in the table, which - # means all table functions are illegal for JS to call directly. Use - # dyncalls which call into the wasm, which then does an indirect call. - settings.DYNCALLS = 1 - - if options.oformat != OFormat.OBJECT and final_suffix in ('.o', '.bc', '.so', '.dylib') and not settings.SIDE_MODULE: - diagnostics.warning('emcc', 'object file output extension (%s) used for non-object output. If you meant to build an object file please use `-c, `-r`, or `-shared`' % final_suffix) - - if settings.SUPPORT_BIG_ENDIAN: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += [ - '$LE_HEAP_STORE_U16', - '$LE_HEAP_STORE_I16', - '$LE_HEAP_STORE_U32', - '$LE_HEAP_STORE_I32', - '$LE_HEAP_STORE_F32', - '$LE_HEAP_STORE_F64', - '$LE_HEAP_LOAD_U16', - '$LE_HEAP_LOAD_I16', - '$LE_HEAP_LOAD_U32', - '$LE_HEAP_LOAD_I32', - '$LE_HEAP_LOAD_F32', - '$LE_HEAP_LOAD_F64' - ] - - if settings.RUNTIME_DEBUG or settings.ASSERTIONS or settings.STACK_OVERFLOW_CHECK or settings.PTHREADS_PROFILING or settings.GL_ASSERTIONS: - # Lots of code in debug/assertion blocks uses ptrToString. - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$ptrToString'] - - if settings.STACK_OVERFLOW_CHECK: - settings.REQUIRED_EXPORTS += [ - 'emscripten_stack_get_end', - 'emscripten_stack_get_free', - 'emscripten_stack_get_base', - 'emscripten_stack_get_current', - ] - - # We call one of these two functions during startup which caches the stack limits - # in wasm globals allowing get_base/get_free to be super fast. - # See compiler-rt/stack_limits.S. - if settings.RELOCATABLE: - settings.REQUIRED_EXPORTS += ['emscripten_stack_set_limits'] - else: - settings.REQUIRED_EXPORTS += ['emscripten_stack_init'] - - if settings.MODULARIZE: - if settings.PROXY_TO_WORKER: - exit_with_error('-sMODULARIZE is not compatible with --proxy-to-worker (if you want to run in a worker with -sMODULARIZE, you likely want to do the worker side setup manually)') - # in MINIMAL_RUNTIME we may not need to emit the Promise code, as the - # HTML output creates a singleton instance, and it does so without the - # Promise. However, in Pthreads mode the Promise is used for worker - # creation. - if settings.MINIMAL_RUNTIME and options.oformat == OFormat.HTML and not settings.PTHREADS: - settings.EXPORT_READY_PROMISE = 0 - - if settings.LEGACY_VM_SUPPORT: - if settings.WASM2JS: - settings.POLYFILL_OLD_MATH_FUNCTIONS = 1 - - # Support all old browser versions - settings.MIN_FIREFOX_VERSION = 0 - settings.MIN_SAFARI_VERSION = 0 - settings.MIN_IE_VERSION = 0 - settings.MIN_EDGE_VERSION = 0 - settings.MIN_CHROME_VERSION = 0 - settings.MIN_NODE_VERSION = 0 - - if settings.MIN_CHROME_VERSION <= 37: - settings.WORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG = 1 - - # 10.19.0 is the oldest version of node that we do any testing with. - # Keep this in sync with the test-node-compat in .circleci/config.yml - # and MINIMUM_NODE_VERSION in tools/shared.py - if settings.MIN_NODE_VERSION: - if settings.MIN_NODE_VERSION < 101900: - exit_with_error('targeting node older than 10.19.00 is not supported') - if settings.MIN_NODE_VERSION >= 150000: - default_setting('NODEJS_CATCH_REJECTION', 0) - - # Do not catch rejections or exits in modularize mode, as these options - # are for use when running emscripten modules standalone - # see https://github.com/emscripten-core/emscripten/issues/18723#issuecomment-1429236996 - if settings.MODULARIZE: - default_setting('NODEJS_CATCH_REJECTION', 0) - default_setting('NODEJS_CATCH_EXIT', 0) - if settings.NODEJS_CATCH_REJECTION or settings.NODEJS_CATCH_EXIT: - exit_with_error('Cannot use -sNODEJS_CATCH_REJECTION or -sNODEJS_CATCH_EXIT with -sMODULARIZE') - - setup_environment_settings() - - if options.use_closure_compiler != 0: - # Emscripten requires certain ES6 constructs by default in library code - # - https://caniuse.com/let : EDGE:12 FF:44 CHROME:49 SAFARI:11 - # - https://caniuse.com/const : EDGE:12 FF:36 CHROME:49 SAFARI:11 - # - https://caniuse.com/arrow-functions: : EDGE:12 FF:22 CHROME:45 SAFARI:10 - # - https://caniuse.com/mdn-javascript_builtins_object_assign: - # EDGE:12 FF:34 CHROME:45 SAFARI:9 - # Taking the highest requirements gives is our minimum: - # Max Version: EDGE:12 FF:44 CHROME:49 SAFARI:11 - settings.TRANSPILE_TO_ES5 = (settings.MIN_EDGE_VERSION < 12 or - settings.MIN_FIREFOX_VERSION < 44 or - settings.MIN_CHROME_VERSION < 49 or - settings.MIN_SAFARI_VERSION < 110000 or - settings.MIN_IE_VERSION != 0x7FFFFFFF) - - if options.use_closure_compiler is None and settings.TRANSPILE_TO_ES5: - diagnostics.warning('transpile', 'enabling transpilation via closure due to browser version settings. This warning can be suppressed by passing `--closure=1` or `--closure=0` to opt into our explicitly.') - - # https://caniuse.com/class: EDGE:13 FF:45 CHROME:49 SAFARI:9 - supports_es6_classes = (settings.MIN_EDGE_VERSION >= 13 and - settings.MIN_FIREFOX_VERSION >= 45 and - settings.MIN_CHROME_VERSION >= 49 and - settings.MIN_SAFARI_VERSION >= 90000 and - settings.MIN_IE_VERSION == 0x7FFFFFFF) - - if not settings.DISABLE_EXCEPTION_CATCHING and settings.EXCEPTION_STACK_TRACES and not supports_es6_classes: - diagnostics.warning('transpile', '-sEXCEPTION_STACK_TRACES requires an engine that support ES6 classes.') - settings.EXCEPTION_STACK_TRACES = 0 - - # Silently drop any individual backwards compatibility emulation flags that are known never to occur on browsers that support WebAssembly. - if not settings.WASM2JS: - settings.POLYFILL_OLD_MATH_FUNCTIONS = 0 - settings.WORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG = 0 - - if settings.STB_IMAGE and final_suffix in EXECUTABLE_ENDINGS: - state.forced_stdlibs.append('libstb_image') - settings.EXPORTED_FUNCTIONS += ['_stbi_load', '_stbi_load_from_memory', '_stbi_image_free'] - - if settings.USE_WEBGL2: - settings.MAX_WEBGL_VERSION = 2 - - # MIN_WEBGL_VERSION=2 implies MAX_WEBGL_VERSION=2 - if settings.MIN_WEBGL_VERSION == 2: - default_setting('MAX_WEBGL_VERSION', 2) - - if settings.MIN_WEBGL_VERSION > settings.MAX_WEBGL_VERSION: - exit_with_error('MIN_WEBGL_VERSION must be smaller or equal to MAX_WEBGL_VERSION!') - - if not settings.GL_SUPPORT_SIMPLE_ENABLE_EXTENSIONS and settings.GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS: - exit_with_error('-sGL_SUPPORT_SIMPLE_ENABLE_EXTENSIONS=0 only makes sense with -sGL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS=0!') - - if settings.WASMFS: - state.forced_stdlibs.append('libwasmfs') - settings.FILESYSTEM = 0 - settings.SYSCALLS_REQUIRE_FILESYSTEM = 0 - settings.JS_LIBRARIES.append((0, 'library_wasmfs.js')) - settings.REQUIRED_EXPORTS += ['_wasmfs_read_file'] - if settings.MAIN_MODULE: - # Dynamic library support uses JS API internals, so include it all - # TODO: rewriting more of the dynamic linking support code into wasm could - # avoid this. also, after we remove the old FS, we could write a - # more specific API for wasmfs/dynamic linking integration perhaps - settings.FORCE_FILESYSTEM = 1 - if settings.FORCE_FILESYSTEM: - # Add exports for the JS API. Like the old JS FS, WasmFS by default - # includes just what JS parts it actually needs, and FORCE_FILESYSTEM is - # required to force all of it to be included if the user wants to use the - # JS API directly. - settings.REQUIRED_EXPORTS += [ - '_wasmfs_write_file', - '_wasmfs_mkdir', - '_wasmfs_unlink', - '_wasmfs_chdir', - '_wasmfs_symlink', - '_wasmfs_chmod', - '_wasmfs_identify', - '_wasmfs_readdir_start', - '_wasmfs_readdir_get', - '_wasmfs_readdir_finish', - ] - - # Explicitly drop linking in a malloc implementation if program is not using any dynamic allocation calls. - if not settings.USES_DYNAMIC_ALLOC: - settings.MALLOC = 'none' - - if settings.FETCH and final_suffix in EXECUTABLE_ENDINGS: - state.forced_stdlibs.append('libfetch') - settings.JS_LIBRARIES.append((0, 'library_fetch.js')) - if settings.PTHREADS: - settings.FETCH_WORKER_FILE = unsuffixed_basename(target) + '.fetch.js' - - if settings.DEMANGLE_SUPPORT: - settings.REQUIRED_EXPORTS += ['__cxa_demangle'] - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$demangle', '$stackTrace'] - - if settings.FULL_ES3: - settings.FULL_ES2 = 1 - settings.MAX_WEBGL_VERSION = max(2, settings.MAX_WEBGL_VERSION) - - # WASM_SYSTEM_EXPORTS are actually native function but they are allowed to be exported - # via EXPORTED_RUNTIME_METHODS for backwards compat. - for sym in settings.WASM_SYSTEM_EXPORTS: - if sym in settings.EXPORTED_RUNTIME_METHODS: - settings.REQUIRED_EXPORTS.append(sym) - - settings.REQUIRED_EXPORTS += ['stackSave', 'stackRestore', 'stackAlloc'] - - if settings.RELOCATABLE: - # TODO(https://reviews.llvm.org/D128515): Make this mandatory once - # llvm change lands - settings.EXPORT_IF_DEFINED.append('__wasm_apply_data_relocs') - - if settings.RELOCATABLE and not settings.DYNAMIC_EXECUTION: - exit_with_error('cannot have both DYNAMIC_EXECUTION=0 and RELOCATABLE enabled at the same time, since RELOCATABLE needs to eval()') - - if settings.SIDE_MODULE and 'GLOBAL_BASE' in user_settings: - exit_with_error('GLOBAL_BASE is not compatible with SIDE_MODULE') - - if options.use_preload_plugins or len(options.preload_files) or len(options.embed_files): - if settings.NODERAWFS: - exit_with_error('--preload-file and --embed-file cannot be used with NODERAWFS which disables virtual filesystem') - # if we include any files, or intend to use preload plugins, then we definitely need filesystem support - settings.FORCE_FILESYSTEM = 1 - - if settings.PROXY_TO_WORKER or options.use_preload_plugins: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$Browser'] - - if not settings.BOOTSTRAPPING_STRUCT_INFO: - if settings.DYNAMIC_EXECUTION == 2 and not settings.MINIMAL_RUNTIME: - # Used by makeEval in the DYNAMIC_EXECUTION == 2 case - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$stackTrace'] - - if not settings.STANDALONE_WASM and (settings.EXIT_RUNTIME or settings.ASSERTIONS): - # to flush streams on FS exit, we need to be able to call fflush - # we only include it if the runtime is exitable, or when ASSERTIONS - # (ASSERTIONS will check that streams do not need to be flushed, - # helping people see when they should have enabled EXIT_RUNTIME) - settings.EXPORT_IF_DEFINED += ['fflush'] - - if settings.SUPPORT_ERRNO: - # so setErrNo JS library function can report errno back to C - settings.REQUIRED_EXPORTS += ['__errno_location'] - - if settings.SAFE_HEAP: - # SAFE_HEAP check includes calling emscripten_get_sbrk_ptr() from wasm - settings.REQUIRED_EXPORTS += ['emscripten_get_sbrk_ptr', 'emscripten_stack_get_base'] - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$unSign'] - - if not settings.DECLARE_ASM_MODULE_EXPORTS: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$exportAsmFunctions'] - - if settings.ALLOW_MEMORY_GROWTH: - # Setting ALLOW_MEMORY_GROWTH turns off ABORTING_MALLOC, as in that mode we default to - # the behavior of trying to grow and returning 0 from malloc on failure, like - # a standard system would. However, if the user sets the flag it - # overrides that. - default_setting('ABORTING_MALLOC', 0) - - if settings.PTHREADS: - setup_pthreads(target) - settings.JS_LIBRARIES.append((0, 'library_pthread.js')) - if settings.PROXY_TO_PTHREAD: - settings.PTHREAD_POOL_SIZE_STRICT = 0 - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$runtimeKeepalivePush'] - else: - if settings.PROXY_TO_PTHREAD: - exit_with_error('-sPROXY_TO_PTHREAD requires -pthread to work!') - settings.JS_LIBRARIES.append((0, 'library_pthread_stub.js')) - - # TODO: Move this into the library JS file once it becomes possible. - # See https://github.com/emscripten-core/emscripten/pull/15982 - if settings.INCLUDE_FULL_LIBRARY and not settings.DISABLE_EXCEPTION_CATCHING: - settings.EXPORTED_FUNCTIONS += ['___get_exception_message', '_free'] + return (newargs, input_files) - if settings.WASM_WORKERS: - # TODO: After #15982 is resolved, these dependencies can be declared in library_wasm_worker.js - # instead of having to record them here. - wasm_worker_imports = ['_emscripten_wasm_worker_initialize', '___set_thread_state'] - settings.EXPORTED_FUNCTIONS += wasm_worker_imports - building.user_requested_exports.update(wasm_worker_imports) - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['_wasm_worker_initializeRuntime'] - # set location of Wasm Worker bootstrap JS file - if settings.WASM_WORKERS == 1: - settings.WASM_WORKER_FILE = unsuffixed(os.path.basename(target)) + '.ww.js' - settings.JS_LIBRARIES.append((0, shared.path_from_root('src', 'library_wasm_worker.js'))) - - settings.SUPPORTS_GLOBALTHIS = feature_matrix.caniuse(feature_matrix.Feature.GLOBALTHIS) - - if settings.AUDIO_WORKLET: - if not settings.SUPPORTS_GLOBALTHIS: - exit_with_error('Must target recent enough browser versions that will support globalThis in order to target Wasm Audio Worklets!') - if settings.AUDIO_WORKLET == 1: - settings.AUDIO_WORKLET_FILE = unsuffixed(os.path.basename(target)) + '.aw.js' - settings.JS_LIBRARIES.append((0, shared.path_from_root('src', 'library_webaudio.js'))) - if not settings.MINIMAL_RUNTIME: - # MINIMAL_RUNTIME exports these manually, since this export mechanism is placed - # in global scope that is not suitable for MINIMAL_RUNTIME loader. - settings.EXPORTED_RUNTIME_METHODS += ['stackSave', 'stackAlloc', 'stackRestore'] - - if settings.FORCE_FILESYSTEM and not settings.MINIMAL_RUNTIME: - # when the filesystem is forced, we export by default methods that filesystem usage - # may need, including filesystem usage from standalone file packager output (i.e. - # file packages not built together with emcc, but that are loaded at runtime - # separately, and they need emcc's output to contain the support they need) - settings.EXPORTED_RUNTIME_METHODS += [ - 'FS_createPath', - 'FS_createDataFile', - 'FS_createPreloadedFile', - 'FS_unlink' - ] - if not settings.WASMFS: - # The old FS has some functionality that WasmFS lacks. - settings.EXPORTED_RUNTIME_METHODS += [ - 'FS_createLazyFile', - 'FS_createDevice' - ] - - settings.EXPORTED_RUNTIME_METHODS += [ - 'addRunDependency', - 'removeRunDependency', - ] - - def check_memory_setting(setting): - if settings[setting] % webassembly.WASM_PAGE_SIZE != 0: - exit_with_error(f'{setting} must be a multiple of WebAssembly page size (64KiB), was {settings[setting]}') - - check_memory_setting('INITIAL_MEMORY') - check_memory_setting('MAXIMUM_MEMORY') - if settings.INITIAL_MEMORY < settings.STACK_SIZE: - exit_with_error(f'INITIAL_MEMORY must be larger than STACK_SIZE, was {settings.INITIAL_MEMORY} (STACK_SIZE={settings.STACK_SIZE})') - if settings.MEMORY_GROWTH_LINEAR_STEP != -1: - check_memory_setting('MEMORY_GROWTH_LINEAR_STEP') - - if 'MAXIMUM_MEMORY' in user_settings and not settings.ALLOW_MEMORY_GROWTH: - diagnostics.warning('unused-command-line-argument', 'MAXIMUM_MEMORY is only meaningful with ALLOW_MEMORY_GROWTH') - - if settings.EXPORT_ES6: - if not settings.MODULARIZE: - # EXPORT_ES6 requires output to be a module - if 'MODULARIZE' in user_settings: - exit_with_error('EXPORT_ES6 requires MODULARIZE to be set') - settings.MODULARIZE = 1 - if shared.target_environment_may_be('node') and not settings.USE_ES6_IMPORT_META: - # EXPORT_ES6 + ENVIRONMENT=*node* requires the use of import.meta.url - if 'USE_ES6_IMPORT_META' in user_settings: - exit_with_error('EXPORT_ES6 and ENVIRONMENT=*node* requires USE_ES6_IMPORT_META to be set') - settings.USE_ES6_IMPORT_META = 1 - - if settings.MODULARIZE and not settings.DECLARE_ASM_MODULE_EXPORTS: - # When MODULARIZE option is used, currently requires declaring all module exports - # individually - TODO: this could be optimized - exit_with_error('DECLARE_ASM_MODULE_EXPORTS=0 is not compatible with MODULARIZE') - - # When not declaring wasm module exports in outer scope one by one, disable minifying - # wasm module export names so that the names can be passed directly to the outer scope. - # Also, if using library_exports.js API, disable minification so that the feature can work. - if not settings.DECLARE_ASM_MODULE_EXPORTS or '-lexports.js' in [x for _, x in state.link_flags]: - settings.MINIFY_WASM_EXPORT_NAMES = 0 - - if '-lembind' in [x for _, x in state.link_flags]: - settings.EMBIND = 1 - - # Enable minification of wasm imports and exports when appropriate, if we - # are emitting an optimized JS+wasm combo (then the JS knows how to load the minified names). - # Things that process the JS after this operation would be done must disable this. - # For example, ASYNCIFY_LAZY_LOAD_CODE needs to identify import names. - # ASYNCIFY=2 does not support this optimization yet as it has a hardcoded - # check for 'main' as an export name. TODO - if will_metadce() and \ - settings.OPT_LEVEL >= 2 and \ - settings.DEBUG_LEVEL <= 2 and \ - options.oformat not in (OFormat.WASM, OFormat.BARE) and \ - settings.ASYNCIFY != 2 and \ - not settings.LINKABLE and \ - not settings.STANDALONE_WASM and \ - not settings.AUTODEBUG and \ - not settings.ASSERTIONS and \ - not settings.RELOCATABLE and \ - not settings.ASYNCIFY_LAZY_LOAD_CODE and \ - settings.MINIFY_WASM_EXPORT_NAMES: - settings.MINIFY_WASM_IMPORTS_AND_EXPORTS = 1 - settings.MINIFY_WASM_IMPORTED_MODULES = 1 - - if settings.MINIMAL_RUNTIME: - # Minimal runtime uses a different default shell file - if options.shell_path == utils.path_from_root('src/shell.html'): - options.shell_path = utils.path_from_root('src/shell_minimal_runtime.html') - - if settings.ASSERTIONS: - # In ASSERTIONS-builds, functions UTF8ArrayToString() and stringToUTF8Array() (which are not JS library functions), both - # use warnOnce(), which in MINIMAL_RUNTIME is a JS library function, so explicitly have to mark dependency to warnOnce() - # in that case. If string functions are turned to library functions in the future, then JS dependency tracking can be - # used and this special directive can be dropped. - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$warnOnce'] - - if settings.MODULARIZE and not (settings.EXPORT_ES6 and not settings.SINGLE_FILE) and \ - settings.EXPORT_NAME == 'Module' and options.oformat == OFormat.HTML and \ - (options.shell_path == utils.path_from_root('src/shell.html') or options.shell_path == utils.path_from_root('src/shell_minimal.html')): - exit_with_error(f'Due to collision in variable name "Module", the shell file "{options.shell_path}" is not compatible with build options "-sMODULARIZE -sEXPORT_NAME=Module". Either provide your own shell file, change the name of the export to something else to avoid the name collision. (see https://github.com/emscripten-core/emscripten/issues/7950 for details)') - - # TODO(sbc): Remove WASM2JS here once the size regression it would introduce has been fixed. - if settings.SHARED_MEMORY or settings.RELOCATABLE or settings.ASYNCIFY_LAZY_LOAD_CODE or settings.WASM2JS: - settings.IMPORTED_MEMORY = 1 - if settings.MEMORY64: - if settings.ASYNCIFY and settings.MEMORY64 == 1: - exit_with_error('MEMORY64=1 is not compatible with ASYNCIFY') - if not settings.DISABLE_EXCEPTION_CATCHING: - exit_with_error('MEMORY64 is not compatible with DISABLE_EXCEPTION_CATCHING=0') - # Any "pointers" passed to JS will now be i64's, in both modes. - settings.WASM_BIGINT = 1 - - if settings.WASM_BIGINT: - settings.LEGALIZE_JS_FFI = 0 - - if settings.SINGLE_FILE: - settings.GENERATE_SOURCE_MAP = 0 - - if settings.EVAL_CTORS: - if settings.WASM2JS: - # code size/memory and correctness issues TODO - exit_with_error('EVAL_CTORS is not compatible with wasm2js yet') - elif settings.RELOCATABLE: - exit_with_error('EVAL_CTORS is not compatible with relocatable yet (movable segments)') - elif settings.ASYNCIFY: - # In Asyncify exports can be called more than once, and this seems to not - # work properly yet (see test_emscripten_scan_registers). - exit_with_error('EVAL_CTORS is not compatible with asyncify yet') - - if options.use_closure_compiler == 2 and not settings.WASM2JS: - exit_with_error('closure compiler mode 2 assumes the code is asm.js, so not meaningful for wasm') - - if settings.WASM2JS: - if options.memory_init_file is None: - options.memory_init_file = settings.OPT_LEVEL >= 2 - settings.MAYBE_WASM2JS = 1 - # when using wasm2js, if the memory segments are in the wasm then they - # end up converted by wasm2js into base64 encoded JS. alternatively, we - # can use a .mem file like asm.js used to. - # generally we follow what the options tell us to do (which is to use - # a .mem file in most cases, since it is binary & compact). however, for - # shared memory builds we must keep the memory segments in the wasm as - # they will be passive segments which the .mem format cannot handle. - settings.MEM_INIT_IN_WASM = not options.memory_init_file or settings.SINGLE_FILE or settings.SHARED_MEMORY - - if ( - settings.MAYBE_WASM2JS or - settings.AUTODEBUG or - settings.LINKABLE or - settings.INCLUDE_FULL_LIBRARY or - not settings.DISABLE_EXCEPTION_CATCHING or - (settings.MAIN_MODULE == 1 and (settings.DYNCALLS or not settings.WASM_BIGINT)) - ): - settings.REQUIRED_EXPORTS += ["getTempRet0", "setTempRet0"] - - if settings.LEGALIZE_JS_FFI: - settings.REQUIRED_EXPORTS += ['__get_temp_ret', '__set_temp_ret'] - - if settings.SPLIT_MODULE and settings.ASYNCIFY == 2: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['_load_secondary_module'] - - # wasm side modules have suffix .wasm - if settings.SIDE_MODULE and shared.suffix(target) == '.js': - diagnostics.warning('emcc', 'output suffix .js requested, but wasm side modules are just wasm files; emitting only a .wasm, no .js') - - sanitize = set() - - for arg in newargs: - if arg.startswith('-fsanitize='): - sanitize.update(arg.split('=', 1)[1].split(',')) - elif arg.startswith('-fno-sanitize='): - sanitize.difference_update(arg.split('=', 1)[1].split(',')) - - if sanitize: - settings.USE_OFFSET_CONVERTER = 1 - settings.REQUIRED_EXPORTS += [ - 'memalign', - 'emscripten_builtin_memalign', - 'emscripten_builtin_malloc', - 'emscripten_builtin_free', - ] - - if ('leak' in sanitize or 'address' in sanitize) and not settings.ALLOW_MEMORY_GROWTH: - # Increase the minimum memory requirements to account for extra memory - # that the sanitizers might need (in addition to the shadow memory - # requirements handled below). - # These values are designed be an over-estimate of the actual requirements and - # are based on experimentation with different tests/programs under asan and - # lsan. - settings.INITIAL_MEMORY += 50 * 1024 * 1024 - if settings.PTHREADS: - settings.INITIAL_MEMORY += 50 * 1024 * 1024 - - if settings.USE_OFFSET_CONVERTER and settings.WASM2JS: - exit_with_error('wasm2js is not compatible with USE_OFFSET_CONVERTER (see #14630)') - - if sanitize & UBSAN_SANITIZERS: - if '-fsanitize-minimal-runtime' in newargs: - settings.UBSAN_RUNTIME = 1 - else: - settings.UBSAN_RUNTIME = 2 - - if 'leak' in sanitize: - settings.USE_LSAN = 1 - default_setting('EXIT_RUNTIME', 1) - - if 'address' in sanitize: - settings.USE_ASAN = 1 - default_setting('EXIT_RUNTIME', 1) - if not settings.UBSAN_RUNTIME: - settings.UBSAN_RUNTIME = 2 - - # helper functions for JS to call into C to do memory operations. these - # let us sanitize memory access from the JS side, by calling into C where - # it has been instrumented. - ASAN_C_HELPERS = [ - '_asan_c_load_1', '_asan_c_load_1u', - '_asan_c_load_2', '_asan_c_load_2u', - '_asan_c_load_4', '_asan_c_load_4u', - '_asan_c_load_f', '_asan_c_load_d', - '_asan_c_store_1', '_asan_c_store_1u', - '_asan_c_store_2', '_asan_c_store_2u', - '_asan_c_store_4', '_asan_c_store_4u', - '_asan_c_store_f', '_asan_c_store_d', - ] - - settings.REQUIRED_EXPORTS += ASAN_C_HELPERS - - if settings.ASYNCIFY and not settings.ASYNCIFY_ONLY: - # we do not want asyncify to instrument these helpers - they just access - # memory as small getters/setters, so they cannot pause anyhow, and also - # we access them in the runtime as we prepare to rewind, which would hit - # an asyncify assertion, if asyncify instrumented them. - # - # note that if ASYNCIFY_ONLY was set by the user then we do not need to - # do anything (as the user's list won't contain these functions), and if - # we did add them, the pass would assert on incompatible lists, hence the - # condition in the above if. - settings.ASYNCIFY_REMOVE += ASAN_C_HELPERS - - if settings.ASAN_SHADOW_SIZE != -1: - diagnostics.warning('emcc', 'ASAN_SHADOW_SIZE is ignored and will be removed in a future release') - - if 'GLOBAL_BASE' in user_settings: - exit_with_error("ASan does not support custom GLOBAL_BASE") - - # Increase the TOTAL_MEMORY and shift GLOBAL_BASE to account for - # the ASan shadow region which starts at address zero. - # The shadow region is 1/8th the size of the total memory and is - # itself part of the total memory. - # We use the following variables in this calculation: - # - user_mem : memory usable/visible by the user program. - # - shadow_size : memory used by asan for shadow memory. - # - total_mem : the sum of the above. this is the size of the wasm memory (and must be aligned to WASM_PAGE_SIZE) - user_mem = settings.INITIAL_MEMORY - if settings.ALLOW_MEMORY_GROWTH: - user_mem = settings.MAXIMUM_MEMORY - - # Given the know value of user memory size we can work backwards - # to find the total memory and the shadow size based on the fact - # that the user memory is 7/8ths of the total memory. - # (i.e. user_mem == total_mem * 7 / 8 - total_mem = user_mem * 8 / 7 - - # But we might need to re-align to wasm page size - total_mem = int(align_to_wasm_page_boundary(total_mem)) - - # The shadow size is 1/8th the resulting rounded up size - shadow_size = total_mem // 8 - - # We start our global data after the shadow memory. - # We don't need to worry about alignment here. wasm-ld will take care of that. - settings.GLOBAL_BASE = shadow_size - settings.STACK_FIRST = False - - if not settings.ALLOW_MEMORY_GROWTH: - settings.INITIAL_MEMORY = total_mem +def get_clang_output_extension(state): + if '-emit-llvm' in state.orig_args: + if state.has_dash_S: + return '.ll' else: - settings.INITIAL_MEMORY += align_to_wasm_page_boundary(shadow_size) + return '.bc' - if settings.SAFE_HEAP: - # SAFE_HEAP instruments ASan's shadow memory accesses. - # Since the shadow memory starts at 0, the act of accessing the shadow memory is detected - # by SAFE_HEAP as a null pointer dereference. - exit_with_error('ASan does not work with SAFE_HEAP') - - if sanitize and settings.GENERATE_SOURCE_MAP: - settings.LOAD_SOURCE_MAP = 1 - - if settings.MINIMAL_RUNTIME: - if settings.EXIT_RUNTIME: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['proc_exit', '$callRuntimeCallbacks'] + if state.has_dash_S: + return '.s' else: - # MINIMAL_RUNTIME only needs callRuntimeCallbacks in certain cases, but the normal runtime - # always does. - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks'] - - if settings.EXIT_RUNTIME and not settings.STANDALONE_WASM: - # Internal function implemented in musl that calls any functions registered - # via `atexit` et al. With STANDALONE_WASM this is all taken care of via - # _start and exit handling in musl, but with the normal emscripten ABI we - # need to be able to call these explicitly. - settings.REQUIRED_EXPORTS += ['__funcs_on_exit'] - - # various settings require malloc/free support from JS - if settings.RELOCATABLE or \ - settings.BUILD_AS_WORKER or \ - settings.USE_WEBGPU or \ - settings.OFFSCREENCANVAS_SUPPORT or \ - settings.LEGACY_GL_EMULATION or \ - settings.ASYNCIFY or \ - settings.WASMFS or \ - settings.DEMANGLE_SUPPORT or \ - settings.FORCE_FILESYSTEM or \ - settings.STB_IMAGE or \ - settings.EMBIND or \ - settings.FETCH or \ - settings.PROXY_POSIX_SOCKETS or \ - options.memory_profiler or \ - sanitize: - settings.REQUIRED_EXPORTS += ['malloc', 'free'] - - if not settings.DISABLE_EXCEPTION_CATCHING: - settings.REQUIRED_EXPORTS += [ - # For normal builds the entries in deps_info.py are enough to include - # these symbols whenever __cxa_find_matching_catch_* functions are - # found. However, under LTO these symbols don't exist prior to linking - # so we include then unconditionally when exceptions are enabled. - '__cxa_is_pointer_type', - '__cxa_can_catch', - - # Emscripten exception handling can generate invoke calls, and they call - # setThrew(). We cannot handle this using deps_info as the invokes are not - # emitted because of library function usage, but by codegen itself. - 'setThrew', - '__cxa_free_exception', - ] - - if settings.ASYNCIFY: - if not settings.ASYNCIFY_IGNORE_INDIRECT: - # if we are not ignoring indirect calls, then we must treat invoke_* as if - # they are indirect calls, since that is what they do - we can't see their - # targets statically. - settings.ASYNCIFY_IMPORTS += ['invoke_*'] - # add the default imports - settings.ASYNCIFY_IMPORTS += DEFAULT_ASYNCIFY_IMPORTS - # add the default exports (only used for ASYNCIFY == 2) - settings.ASYNCIFY_EXPORTS += DEFAULT_ASYNCIFY_EXPORTS - - # return the full import name, including module. The name may - # already have a module prefix; if not, we assume it is "env". - def get_full_import_name(name): - if '.' in name: - return name - return 'env.' + name - - settings.ASYNCIFY_IMPORTS = [get_full_import_name(i) for i in settings.ASYNCIFY_IMPORTS] - - if settings.ASYNCIFY == 2: - diagnostics.warning('experimental', 'ASYNCIFY with stack switching is experimental') - - if settings.WASM2JS: - if settings.GENERATE_SOURCE_MAP: - exit_with_error('wasm2js does not support source maps yet (debug in wasm for now)') - if settings.WASM_BIGINT: - exit_with_error('wasm2js does not support WASM_BIGINT') - if settings.MEMORY64: - exit_with_error('wasm2js does not support MEMORY64') - - if settings.NODE_CODE_CACHING: - if settings.WASM_ASYNC_COMPILATION: - exit_with_error('NODE_CODE_CACHING requires sync compilation (WASM_ASYNC_COMPILATION=0)') - if not shared.target_environment_may_be('node'): - exit_with_error('NODE_CODE_CACHING only works in node, but target environments do not include it') - if settings.SINGLE_FILE: - exit_with_error('NODE_CODE_CACHING saves a file on the side and is not compatible with SINGLE_FILE') - - if not js_manipulation.isidentifier(settings.EXPORT_NAME): - exit_with_error(f'EXPORT_NAME is not a valid JS identifier: `{settings.EXPORT_NAME}`') - - if settings.EMSCRIPTEN_TRACING and settings.ALLOW_MEMORY_GROWTH: - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['emscripten_trace_report_memory_layout'] - settings.REQUIRED_EXPORTS += ['emscripten_stack_get_current', - 'emscripten_stack_get_base', - 'emscripten_stack_get_end'] - - # check if we can address the 2GB mark and higher: either if we start at - # 2GB, or if we allow growth to either any amount or to 2GB or more. - if settings.INITIAL_MEMORY > 2 * 1024 * 1024 * 1024 or \ - (settings.ALLOW_MEMORY_GROWTH and - (settings.MAXIMUM_MEMORY < 0 or - settings.MAXIMUM_MEMORY > 2 * 1024 * 1024 * 1024)): - settings.CAN_ADDRESS_2GB = 1 - - settings.EMSCRIPTEN_VERSION = shared.EMSCRIPTEN_VERSION - settings.SOURCE_MAP_BASE = options.source_map_base or '' - - settings.LINK_AS_CXX = (run_via_emxx or settings.DEFAULT_TO_CXX) and '-nostdlib++' not in newargs - - # WASMFS itself is written in C++, and needs C++ standard libraries - if settings.WASMFS: - settings.LINK_AS_CXX = True - - # Some settings make no sense when not linking as C++ - if not settings.LINK_AS_CXX: - cxx_only_settings = [ - 'DEMANGLE_SUPPORT', - 'EXCEPTION_DEBUG', - 'DISABLE_EXCEPTION_CATCHING', - 'EXCEPTION_CATCHING_ALLOWED', - 'DISABLE_EXCEPTION_THROWING', - ] - for setting in cxx_only_settings: - if setting in user_settings: - diagnostics.warning('linkflags', 'setting `%s` is not meaningful unless linking as C++', setting) - - if settings.WASM_EXCEPTIONS: - settings.REQUIRED_EXPORTS += ['__trap'] - - if settings.EXCEPTION_STACK_TRACES: - # If the user explicitly gave EXCEPTION_STACK_TRACES=1 without enabling EH, - # errors out. - if settings.DISABLE_EXCEPTION_CATCHING and not settings.WASM_EXCEPTIONS: - exit_with_error('EXCEPTION_STACK_TRACES requires either of -fexceptions or -fwasm-exceptions') - # EXCEPTION_STACK_TRACES implies EXPORT_EXCEPTION_HANDLING_HELPERS - settings.EXPORT_EXCEPTION_HANDLING_HELPERS = True - - # Make `getExceptionMessage` and other necessary functions available for use. - if settings.EXPORT_EXCEPTION_HANDLING_HELPERS: - # If the user explicitly gave EXPORT_EXCEPTION_HANDLING_HELPERS=1 without - # enabling EH, errors out. - if settings.DISABLE_EXCEPTION_CATCHING and not settings.WASM_EXCEPTIONS: - exit_with_error('EXPORT_EXCEPTION_HANDLING_HELPERS requires either of -fexceptions or -fwasm-exceptions') - # We also export refcount increasing and decreasing functions because if you - # catch an exception, be it an Emscripten exception or a Wasm exception, in - # JS, you may need to manipulate the refcount manually not to leak memory. - # What you need to do is different depending on the kind of EH you use - # (https://github.com/emscripten-core/emscripten/issues/17115). - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$getExceptionMessage', '$incrementExceptionRefcount', '$decrementExceptionRefcount'] - settings.EXPORTED_FUNCTIONS += ['getExceptionMessage', '___get_exception_message', '_free'] - if settings.WASM_EXCEPTIONS: - settings.EXPORTED_FUNCTIONS += ['___cpp_exception', '___cxa_increment_exception_refcount', '___cxa_decrement_exception_refcount', '___thrown_object_from_unwind_exception'] - - feature_matrix.apply_min_browser_versions() - - if settings.SIDE_MODULE: - # For side modules, we ignore all REQUIRED_EXPORTS that might have been added above. - # They all come from either libc or compiler-rt. The exception is __wasm_call_ctors - # which is a per-module export. - settings.REQUIRED_EXPORTS.clear() - - if not settings.STANDALONE_WASM: - # in standalone mode, crt1 will call the constructors from inside the wasm - settings.REQUIRED_EXPORTS.append('__wasm_call_ctors') - - return target, wasm_target + return '.o' @ToolchainProfiler.profile_block('compile inputs') def phase_compile_inputs(options, state, newargs, input_files): - def is_link_flag(flag): - if flag in ('-nostdlib', '-nostartfiles', '-nolibc', '-nodefaultlibs'): - return True - return flag.startswith(('-l', '-L', '-Wl,')) + if shared.run_via_emxx: + compiler = [shared.CLANG_CXX] + else: + compiler = [shared.CLANG_CC] - CXX = [shared.CLANG_CXX] - CC = [shared.CLANG_CC] if config.COMPILER_WRAPPER: logger.debug('using compiler wrapper: %s', config.COMPILER_WRAPPER) - CXX.insert(0, config.COMPILER_WRAPPER) - CC.insert(0, config.COMPILER_WRAPPER) + compiler.insert(0, config.COMPILER_WRAPPER) - compile_args = [a for a in newargs if a and not is_link_flag(a)] + compile_args = newargs system_libs.ensure_sysroot() def get_language_mode(args): @@ -2935,70 +938,66 @@ def get_language_mode(args): return_next = True continue if item.startswith('-x'): - return strip_prefix(item, '-x') + return removeprefix(item, '-x') return '' language_mode = get_language_mode(newargs) + use_cxx = 'c++' in language_mode or shared.run_via_emxx - def use_cxx(src): - if 'c++' in language_mode or run_via_emxx: - return True - suffix = shared.suffix(src) - # Next consider the filename - if suffix in C_ENDINGS + OBJC_ENDINGS: - return False - if suffix in CXX_ENDINGS: - return True - # Finally fall back to the default - if settings.DEFAULT_TO_CXX: - # Default to using C++ even when run as `emcc`. - # This means that emcc will act as a C++ linker when no source files are - # specified. - # This differs to clang and gcc where the default is always C unless run as - # clang++/g++. - return True - return False - - def get_compiler(src_file): - if use_cxx(src_file): - return CXX - return CC - - def get_clang_command(src_file): - return get_compiler(src_file) + get_cflags(state.orig_args, use_cxx(src_file)) + compile_args + [src_file] + def get_clang_command(): + return compiler + get_cflags(state.orig_args, use_cxx) + compile_args - def get_clang_command_preprocessed(src_file): - return get_compiler(src_file) + get_clang_flags(state.orig_args) + compile_args + [src_file] + def get_clang_command_preprocessed(): + return compiler + get_clang_flags(state.orig_args) + compile_args - def get_clang_command_asm(src_file): - return get_compiler(src_file) + get_target_flags() + compile_args + [src_file] + def get_clang_command_asm(): + return compiler + get_target_flags() + compile_args # preprocessor-only (-E) support if state.mode == Mode.PREPROCESS_ONLY: - for input_file in [x[1] for x in input_files]: - cmd = get_clang_command(input_file) - if options.output_file: - cmd += ['-o', options.output_file] - # Do not compile, but just output the result from preprocessing stage or - # output the dependency rule. Warning: clang and gcc behave differently - # with -MF! (clang seems to not recognize it) - logger.debug(('just preprocessor ' if state.has_dash_E else 'just dependencies: ') + ' '.join(cmd)) - shared.check_call(cmd) - return [] + inputs = [i[1] for i in input_files] + cmd = get_clang_command() + inputs + if options.output_file: + cmd += ['-o', options.output_file] + # Do not compile, but just output the result from preprocessing stage or + # output the dependency rule. Warning: clang and gcc behave differently + # with -MF! (clang seems to not recognize it) + logger.debug(('just preprocessor ' if state.has_dash_E else 'just dependencies: ') + ' '.join(cmd)) + shared.exec_process(cmd) # Precompiled headers support if state.mode == Mode.PCH: - headers = [header for _, header in input_files] - for header in headers: + inputs = [i[1] for i in input_files] + for header in inputs: if not shared.suffix(header) in HEADER_ENDINGS: - exit_with_error(f'cannot mix precompiled headers with non-header inputs: {headers} : {header}') - cmd = get_clang_command(header) - if options.output_file: - cmd += ['-o', options.output_file] - logger.debug(f"running (for precompiled headers): {cmd[0]} {' '.join(cmd[1:])}") - shared.check_call(cmd) - return [] + exit_with_error(f'cannot mix precompiled headers with non-header inputs: {inputs} : {header}') + cmd = get_clang_command() + inputs + if options.output_file: + cmd += ['-o', options.output_file] + logger.debug(f"running (for precompiled headers): {cmd[0]} {' '.join(cmd[1:])}") + shared.exec_process(cmd) + + if state.mode == Mode.COMPILE_ONLY: + inputs = [i[1] for i in input_files] + if all(get_file_suffix(i) in ASSEMBLY_ENDINGS for i in inputs): + cmd = get_clang_command_asm() + inputs + else: + cmd = get_clang_command() + inputs + if options.output_file: + cmd += ['-o', options.output_file] + if get_file_suffix(options.output_file) == '.bc' and not settings.LTO and '-emit-llvm' not in state.orig_args: + diagnostics.warning('emcc', '.bc output file suffix used without -flto or -emit-llvm. Consider using .o extension since emcc will output an object file, not a bitcode file') + shared.exec_process(cmd) + + # In COMPILE_AND_LINK we need to compile source files too, but we also need to + # filter out the link flags + + def is_link_flag(flag): + if flag in ('-nostdlib', '-nostartfiles', '-nolibc', '-nodefaultlibs', '-s'): + return True + return flag.startswith(('-l', '-L', '-Wl,', '-z')) + compile_args = [a for a in compile_args if a and not is_link_flag(a)] linker_inputs = [] seen_names = {} @@ -3008,32 +1007,21 @@ def uniquename(name): return unsuffixed(name) + '_' + seen_names[name] + shared.suffix(name) def get_object_filename(input_file): - if state.mode == Mode.COMPILE_ONLY: - # In compile-only mode we don't use any temp file. The object files - # are written directly to their final output locations. - if options.output_file: - assert len(input_files) == 1 - if get_file_suffix(options.output_file) == '.bc' and not settings.LTO and '-emit-llvm' not in state.orig_args: - diagnostics.warning('emcc', '.bc output file suffix used without -flto or -emit-llvm. Consider using .o extension since emcc will output an object file, not a bitcode file') - return options.output_file - else: - return unsuffixed_basename(input_file) + options.default_object_extension - else: - return in_temp(unsuffixed(uniquename(input_file)) + options.default_object_extension) + return in_temp(shared.replace_suffix(uniquename(input_file), '.o')) def compile_source_file(i, input_file): logger.debug(f'compiling source file: {input_file}') output_file = get_object_filename(input_file) - if state.mode not in (Mode.COMPILE_ONLY, Mode.PREPROCESS_ONLY): - linker_inputs.append((i, output_file)) + linker_inputs.append((i, output_file)) if get_file_suffix(input_file) in ASSEMBLY_ENDINGS: - cmd = get_clang_command_asm(input_file) + cmd = get_clang_command_asm() elif get_file_suffix(input_file) in PREPROCESSED_ENDINGS: - cmd = get_clang_command_preprocessed(input_file) + cmd = get_clang_command_preprocessed() else: - cmd = get_clang_command(input_file) + cmd = get_clang_command() if get_file_suffix(input_file) in ['.pcm']: cmd = [c for c in cmd if not c.startswith('-fprebuilt-module-path=')] + cmd += [input_file] if not state.has_dash_c: cmd += ['-c'] cmd += ['-o', output_file] @@ -3046,7 +1034,7 @@ def compile_source_file(i, input_file): cmd += ['-Xclang', '-split-dwarf-file', '-Xclang', unsuffixed_basename(input_file) + '.dwo'] cmd += ['-Xclang', '-split-dwarf-output', '-Xclang', unsuffixed_basename(input_file) + '.dwo'] shared.check_call(cmd) - if output_file not in ('-', os.devnull): + if output_file not in ('-', os.devnull) and not shared.SKIP_SUBPROCS: assert os.path.exists(output_file) # First, generate LLVM bitcode. For each input file, we get base.o with bitcode @@ -3072,228 +1060,6 @@ def compile_source_file(i, input_file): return linker_inputs -@ToolchainProfiler.profile_block('calculate system libraries') -def phase_calculate_system_libraries(state, linker_arguments, linker_inputs, newargs): - extra_files_to_link = [] - # Link in ports and system libraries, if necessary - if not settings.SIDE_MODULE: - # Ports are always linked into the main module, never the side module. - extra_files_to_link += ports.get_libs(settings) - all_linker_inputs = [f for _, f in sorted(linker_inputs)] + extra_files_to_link - extra_files_to_link += system_libs.calculate(all_linker_inputs, newargs, forced=state.forced_stdlibs) - linker_arguments.extend(extra_files_to_link) - - -@ToolchainProfiler.profile_block('link') -def phase_link(linker_arguments, wasm_target, js_syms): - logger.debug(f'linking: {linker_arguments}') - - # Make a final pass over settings.EXPORTED_FUNCTIONS to remove any - # duplication between functions added by the driver/libraries and function - # specified by the user - settings.EXPORTED_FUNCTIONS = dedup_list(settings.EXPORTED_FUNCTIONS) - settings.REQUIRED_EXPORTS = dedup_list(settings.REQUIRED_EXPORTS) - settings.EXPORT_IF_DEFINED = dedup_list(settings.EXPORT_IF_DEFINED) - - building.link_lld(linker_arguments, wasm_target, external_symbols=js_syms) - - -@ToolchainProfiler.profile_block('post_link') -def phase_post_link(options, state, in_wasm, wasm_target, target): - global final_js - - target_basename = unsuffixed_basename(target) - - if options.oformat != OFormat.WASM: - final_js = in_temp(target_basename + '.js') - - settings.TARGET_BASENAME = unsuffixed_basename(target) - - if options.oformat in (OFormat.JS, OFormat.MJS): - state.js_target = target - else: - state.js_target = get_secondary_target(target, '.js') - - settings.TARGET_JS_NAME = os.path.basename(state.js_target) - - if settings.MEM_INIT_IN_WASM: - memfile = None - else: - memfile = shared.replace_or_append_suffix(target, '.mem') - - phase_emscript(options, in_wasm, wasm_target, memfile) - - if options.js_transform: - phase_source_transforms(options) - - if memfile and not settings.MINIMAL_RUNTIME: - # MINIMAL_RUNTIME doesn't use `var memoryInitializer` but instead expects Module['mem'] to - # be loaded before the module. See src/postamble_minimal.js. - phase_memory_initializer(memfile) - - phase_binaryen(target, options, wasm_target) - - # If we are not emitting any JS then we are all done now - if options.oformat != OFormat.WASM: - phase_final_emitting(options, state, target, wasm_target, memfile) - - -@ToolchainProfiler.profile_block('emscript') -def phase_emscript(options, in_wasm, wasm_target, memfile): - # Emscripten - logger.debug('emscript') - - if embed_memfile(options): - settings.SUPPORT_BASE64_EMBEDDING = 1 - # _read in shell.js depends on intArrayToString when SUPPORT_BASE64_EMBEDDING is set - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE.append('$intArrayToString') - - emscripten.run(in_wasm, wasm_target, final_js, memfile) - save_intermediate('original') - - -@ToolchainProfiler.profile_block('source transforms') -def phase_source_transforms(options): - # Apply a source code transformation, if requested - global final_js - safe_copy(final_js, final_js + '.tr.js') - final_js += '.tr.js' - posix = not shared.WINDOWS - logger.debug('applying transform: %s', options.js_transform) - shared.check_call(building.remove_quotes(shlex.split(options.js_transform, posix=posix) + [os.path.abspath(final_js)])) - save_intermediate('transformed') - - -@ToolchainProfiler.profile_block('memory initializer') -def phase_memory_initializer(memfile): - # For the wasm backend, we don't have any memory info in JS. All we need to do - # is set the memory initializer url. - global final_js - - src = read_file(final_js) - src = do_replace(src, '<<< MEM_INITIALIZER >>>', '"%s"' % os.path.basename(memfile)) - write_file(final_js + '.mem.js', src) - final_js += '.mem.js' - - -@ToolchainProfiler.profile_block('final emitting') -def phase_final_emitting(options, state, target, wasm_target, memfile): - global final_js - - # Remove some trivial whitespace - # TODO: do not run when compress has already been done on all parts of the code - # src = read_file(final_js) - # src = re.sub(r'\n+[ \n]*\n+', '\n', src) - # write_file(final_js, src) - - target_dir = os.path.dirname(os.path.abspath(target)) - if settings.PTHREADS: - worker_output = os.path.join(target_dir, settings.PTHREAD_WORKER_FILE) - contents = shared.read_and_preprocess(utils.path_from_root('src/worker.js'), expand_macros=True) - write_file(worker_output, contents) - - # Minify the worker.js file in optimized builds - if (settings.OPT_LEVEL >= 1 or settings.SHRINK_LEVEL >= 1) and not settings.DEBUG_LEVEL: - minified_worker = building.acorn_optimizer(worker_output, ['minifyWhitespace'], return_output=True) - write_file(worker_output, minified_worker) - - # Deploy the Wasm Worker bootstrap file as an output file (*.ww.js) - if settings.WASM_WORKERS == 1: - worker_output = os.path.join(target_dir, settings.WASM_WORKER_FILE) - contents = shared.read_and_preprocess(shared.path_from_root('src/wasm_worker.js'), expand_macros=True) - write_file(worker_output, contents) - - # Minify the wasm_worker.js file in optimized builds - if (settings.OPT_LEVEL >= 1 or settings.SHRINK_LEVEL >= 1) and not settings.DEBUG_LEVEL: - minified_worker = building.acorn_optimizer(worker_output, ['minifyWhitespace'], return_output=True) - write_file(worker_output, minified_worker) - - # Deploy the Audio Worklet module bootstrap file (*.aw.js) - if settings.AUDIO_WORKLET == 1: - worklet_output = os.path.join(target_dir, settings.AUDIO_WORKLET_FILE) - with open(worklet_output, 'w') as f: - f.write(shared.read_and_preprocess(shared.path_from_root('src', 'audio_worklet.js'), expand_macros=True)) - - # Minify the audio_worklet.js file in optimized builds - if (settings.OPT_LEVEL >= 1 or settings.SHRINK_LEVEL >= 1) and not settings.DEBUG_LEVEL: - minified_worker = building.acorn_optimizer(worklet_output, ['minifyWhitespace'], return_output=True) - open(worklet_output, 'w').write(minified_worker) - - # track files that will need native eols - generated_text_files_with_native_eols = [] - - if settings.MODULARIZE: - modularize() - - if settings.USE_CLOSURE_COMPILER: - module_export_name_substitution() - - # Run a final optimization pass to clean up items that were not possible to - # optimize by Closure, or unoptimalities that were left behind by processing - # steps that occurred after Closure. - if settings.MINIMAL_RUNTIME == 2 and settings.USE_CLOSURE_COMPILER and settings.DEBUG_LEVEL == 0: - shared.run_js_tool(utils.path_from_root('tools/unsafe_optimizations.js'), [final_js, '-o', final_js], cwd=utils.path_from_root('.')) - # Finally, rerun Closure compile with simple optimizations. It will be able - # to further minify the code. (n.b. it would not be safe to run in advanced - # mode) - final_js = building.closure_compiler(final_js, pretty=False, advanced=False, extra_closure_args=options.closure_args) - - # Unmangle previously mangled `import.meta` and `await import` references in - # both main code and libraries. - # See also: `preprocess` in parseTools.js. - if settings.EXPORT_ES6 and settings.USE_ES6_IMPORT_META: - src = read_file(final_js) - final_js += '.esmeta.js' - write_file(final_js, src - .replace('EMSCRIPTEN$IMPORT$META', 'import.meta') - .replace('EMSCRIPTEN$AWAIT$IMPORT', 'await import')) - shared.get_temp_files().note(final_js) - save_intermediate('es6-module') - - # Apply pre and postjs files - if options.extern_pre_js or options.extern_post_js: - logger.debug('applying extern pre/postjses') - src = read_file(final_js) - final_js += '.epp.js' - with open(final_js, 'w', encoding='utf-8') as f: - f.write(options.extern_pre_js) - f.write(src) - f.write(options.extern_post_js) - save_intermediate('extern-pre-post') - - js_manipulation.handle_license(final_js) - - js_target = state.js_target - - # The JS is now final. Move it to its final location - move_file(final_js, js_target) - - if not settings.SINGLE_FILE: - generated_text_files_with_native_eols += [js_target] - - target_basename = unsuffixed_basename(target) - - # If we were asked to also generate HTML, do that - if options.oformat == OFormat.HTML: - generate_html(target, options, js_target, target_basename, - wasm_target, memfile) - elif settings.PROXY_TO_WORKER: - generate_worker_js(target, js_target, target_basename) - - if embed_memfile(options) and memfile: - delete_file(memfile) - - if settings.SPLIT_MODULE: - diagnostics.warning('experimental', 'The SPLIT_MODULE setting is experimental and subject to change') - do_split_module(wasm_target, options) - - for f in generated_text_files_with_native_eols: - tools.line_endings.convert_line_endings_in_file(f, os.linesep, options.output_eol) - - if options.executable: - make_js_executable(js_target) - - def version_string(): # if the emscripten folder is not a git repo, don't run git show - that can # look up and find the revision in a parent directory that is a git repo @@ -3366,7 +1132,7 @@ def consume_arg_file(): if arg.startswith('-O'): # Let -O default to -O2, which is what gcc does. - requested_level = strip_prefix(arg, '-O') or '2' + requested_level = removeprefix(arg, '-O') or '2' if requested_level == 's': requested_level = 2 settings.SHRINK_LEVEL = 1 @@ -3377,6 +1143,12 @@ def consume_arg_file(): requested_level = 1 settings.SHRINK_LEVEL = 0 settings.DEBUG_LEVEL = max(settings.DEBUG_LEVEL, 1) + elif requested_level == 'fast': + # TODO(https://github.com/emscripten-core/emscripten/issues/21497): + # If we ever map `-ffast-math` to `wasm-opt --fast-math` then + # then we should enable that too here. + requested_level = 3 + settings.SHRINK_LEVEL = 0 else: settings.SHRINK_LEVEL = 0 settings.OPT_LEVEL = validate_arg_level(requested_level, 3, 'invalid optimization level: ' + arg, clamp=True) @@ -3390,6 +1162,8 @@ def consume_arg_file(): settings.LTO = arg.split('=')[1] else: settings.LTO = 'full' + elif arg == "-fno-lto": + settings.LTO = 0 elif check_arg('--llvm-lto'): logger.warning('--llvm-lto ignored when using llvm backend') consume_arg() @@ -3424,10 +1198,10 @@ def consume_arg_file(): arg = consume_arg() if arg != '0': exit_with_error('0 is the only supported option for --minify; 1 has been deprecated') - settings.DEBUG_LEVEL = max(1, settings.DEBUG_LEVEL) + options.no_minify = True elif arg.startswith('-g'): options.requested_debug = arg - requested_level = strip_prefix(arg, '-g') or '3' + requested_level = removeprefix(arg, '-g') or '3' if is_int(requested_level): # the -gX value is the debug level (-g1, -g2, etc.) settings.DEBUG_LEVEL = validate_arg_level(requested_level, 4, 'invalid debug level: ' + arg) @@ -3458,14 +1232,17 @@ def consume_arg_file(): settings.SEPARATE_DWARF = requested_level.split('=')[1] else: settings.SEPARATE_DWARF = True + settings.GENERATE_DWARF = 1 elif requested_level == 'source-map': settings.GENERATE_SOURCE_MAP = 1 newargs[i] = '-g' - # a non-integer level can be something like -gline-tables-only. keep - # the flag for the clang frontend to emit the appropriate DWARF info. - # set the emscripten debug level to 3 so that we do not remove that - # debug info during link (during compile, this does not make a - # difference). + else: + # Other non-integer levels (e.g. -gline-tables-only or -gdwarf-5) are + # usually clang flags that emit DWARF. So we pass them through to + # clang and make the emscripten code treat it like any other DWARF. + settings.GENERATE_DWARF = 1 + # In all cases set the emscripten debug level to 3 so that we do not + # strip during link (during compile, this does not make a difference). settings.DEBUG_LEVEL = 3 elif check_flag('-profiling') or check_flag('--profiling'): settings.DEBUG_LEVEL = max(settings.DEBUG_LEVEL, 2) @@ -3495,11 +1272,18 @@ def consume_arg_file(): elif check_flag('--ignore-dynamic-linking'): options.ignore_dynamic_linking = True elif arg == '-v': - shared.PRINT_STAGES = True + shared.PRINT_SUBPROCS = True + elif arg == '-###': + shared.SKIP_SUBPROCS = True elif check_arg('--shell-file'): options.shell_path = consume_arg_file() elif check_arg('--source-map-base'): options.source_map_base = consume_arg() + elif check_arg('--embind-emit-tsd'): + options.embind_emit_tsd = consume_arg() + elif check_arg('--emit-tsd'): + diagnostics.warning('experimental', '--emit-tsd is still experimental. Not all definitions are generated.') + options.emit_tsd = consume_arg() elif check_flag('--no-entry'): options.no_entry = True elif check_arg('--js-library'): @@ -3509,8 +1293,8 @@ def consume_arg_file(): elif check_flag('--jcache'): logger.error('jcache is no longer supported') elif check_arg('--cache'): - config.CACHE = os.path.normpath(consume_arg()) - cache.setup(config.CACHE) + config.CACHE = os.path.abspath(consume_arg()) + cache.setup() # Ensure child processes share the same cache (e.g. when using emcc to compiler system # libraries) os.environ['EM_CACHE'] = config.CACHE @@ -3533,9 +1317,7 @@ def consume_arg_file(): ports.show_ports() should_exit = True elif check_arg('--memory-init-file'): - # This flag is ignored unless targetting wasm2js. - # TODO(sbc): Error out if used without wasm2js. - options.memory_init_file = int(consume_arg()) + exit_with_error('--memory-init-file is no longer supported') elif check_flag('--proxy-to-worker'): settings_changes.append('PROXY_TO_WORKER=1') elif check_arg('--valid-abspath'): @@ -3564,6 +1346,10 @@ def consume_arg_file(): settings.DISABLE_EXCEPTION_CATCHING = 1 settings.DISABLE_EXCEPTION_THROWING = 1 settings.WASM_EXCEPTIONS = 0 + elif arg == '-mbulk-memory': + settings.BULK_MEMORY = 1 + elif arg == '-mno-bulk-memory': + settings.BULK_MEMORY = 0 elif arg == '-fexceptions': # TODO Currently -fexceptions only means Emscripten EH. Switch to wasm # exception handling by default when -fexceptions is given when wasm @@ -3575,9 +1361,7 @@ def consume_arg_file(): elif arg == '-fignore-exceptions': settings.DISABLE_EXCEPTION_CATCHING = 1 elif check_arg('--default-obj-ext'): - options.default_object_extension = consume_arg() - if not options.default_object_extension.startswith('.'): - options.default_object_extension = '.' + options.default_object_extension + exit_with_error('--default-obj-ext is no longer supported by emcc') elif arg.startswith('-fsanitize=cfi'): exit_with_error('emscripten does not currently support -fsanitize=cfi') elif check_arg('--output_eol'): @@ -3593,6 +1377,10 @@ def consume_arg_file(): settings.PTHREADS = 1 # Also set the legacy setting name, in case use JS code depends on it. settings.USE_PTHREADS = 1 + elif arg == '-no-pthread': + settings.PTHREADS = 0 + # Also set the legacy setting name, in case use JS code depends on it. + settings.USE_PTHREADS = 0 elif arg == '-pthreads': exit_with_error('unrecognized command-line option `-pthreads`; did you mean `-pthread`?') elif arg in ('-fno-diagnostics-color', '-fdiagnostics-color=never'): @@ -3603,7 +1391,7 @@ def consume_arg_file(): elif arg == '-frtti': settings.USE_RTTI = 1 elif arg.startswith('-jsD'): - key = strip_prefix(arg, '-jsD') + key = removeprefix(arg, '-jsD') if '=' in key: key, value = key.split('=') else: @@ -3619,8 +1407,14 @@ def consume_arg_file(): elif check_arg('-o'): options.output_file = consume_arg() elif arg.startswith('-o'): - options.output_file = strip_prefix(arg, '-o') + options.output_file = removeprefix(arg, '-o') newargs[i] = '' + elif check_arg('-target') or check_arg('--target'): + options.target = consume_arg() + if options.target not in ('wasm32', 'wasm64', 'wasm64-unknown-emscripten', 'wasm32-unknown-emscripten'): + exit_with_error(f'unsupported target: {options.target} (emcc only supports wasm64-unknown-emscripten and wasm32-unknown-emscripten)') + elif check_arg('--use-port'): + ports.handle_use_port_arg(settings, consume_arg()) elif arg == '-mllvm': # Ignore the next argument rather than trying to parse it. This is needed # because llvm args could, for example, start with `-o` and we don't want @@ -3634,652 +1428,9 @@ def consume_arg_file(): return options, settings_changes, user_js_defines, newargs -@ToolchainProfiler.profile_block('binaryen') -def phase_binaryen(target, options, wasm_target): - global final_js - logger.debug('using binaryen') - if settings.GENERATE_SOURCE_MAP and not settings.SOURCE_MAP_BASE: - logger.warning("Wasm source map won't be usable in a browser without --source-map-base") - # whether we need to emit -g (function name debug info) in the final wasm - debug_info = settings.DEBUG_LEVEL >= 2 or settings.EMIT_NAME_SECTION - # whether we need to emit -g in the intermediate binaryen invocations (but not - # necessarily at the very end). this is necessary if we depend on debug info - # during compilation, even if we do not emit it at the end. - # we track the number of causes for needing intermdiate debug info so - # that we can stop emitting it when possible - in particular, that is - # important so that we stop emitting it before the end, and it is not in the - # final binary (if it shouldn't be) - intermediate_debug_info = 0 - if debug_info: - intermediate_debug_info += 1 - if options.emit_symbol_map: - intermediate_debug_info += 1 - if settings.ASYNCIFY == 1: - intermediate_debug_info += 1 - # note that wasm-ld can strip DWARF info for us too (--strip-debug), but it - # also strips the Names section. so to emit just the Names section we don't - # tell wasm-ld to strip anything, and we do it here. - strip_debug = settings.DEBUG_LEVEL < 3 - strip_producers = not settings.EMIT_PRODUCERS_SECTION - # run wasm-opt if we have work for it: either passes, or if we are using - # source maps (which requires some extra processing to keep the source map - # but remove DWARF) - passes = get_binaryen_passes() - if passes or settings.GENERATE_SOURCE_MAP: - # if we need to strip certain sections, and we have wasm-opt passes - # to run anyhow, do it with them. - if strip_debug: - passes += ['--strip-debug'] - if strip_producers: - passes += ['--strip-producers'] - # if asyncify is used, we will use it in the next stage, and so if it is - # the only reason we need intermediate debug info, we can stop keeping it - if settings.ASYNCIFY == 1: - intermediate_debug_info -= 1 - # currently binaryen's DWARF support will limit some optimizations; warn on - # that. see https://github.com/emscripten-core/emscripten/issues/15269 - dwarf_info = settings.DEBUG_LEVEL >= 3 - if dwarf_info: - diagnostics.warning('limited-postlink-optimizations', 'running limited binaryen optimizations because DWARF info requested (or indirectly required)') - with ToolchainProfiler.profile_block('wasm_opt'): - building.run_wasm_opt(wasm_target, - wasm_target, - args=passes, - debug=intermediate_debug_info) - building.save_intermediate(wasm_target, 'byn.wasm') - elif strip_debug or strip_producers: - # we are not running wasm-opt. if we need to strip certain sections - # then do so using llvm-objcopy which is fast and does not rewrite the - # code (which is better for debug info) - sections = ['producers'] if strip_producers else [] - with ToolchainProfiler.profile_block('strip_producers'): - building.strip(wasm_target, wasm_target, debug=strip_debug, sections=sections) - building.save_intermediate(wasm_target, 'strip.wasm') - - if settings.EVAL_CTORS: - with ToolchainProfiler.profile_block('eval_ctors'): - building.eval_ctors(final_js, wasm_target, debug_info=intermediate_debug_info) - building.save_intermediate(wasm_target, 'ctors.wasm') - - # after generating the wasm, do some final operations - - if final_js: - if settings.SUPPORT_BIG_ENDIAN: - with ToolchainProfiler.profile_block('little_endian_heap'): - final_js = building.little_endian_heap(final_js) - - # >=2GB heap support requires pointers in JS to be unsigned. rather than - # require all pointers to be unsigned by default, which increases code size - # a little, keep them signed, and just unsign them here if we need that. - if settings.CAN_ADDRESS_2GB: - with ToolchainProfiler.profile_block('use_unsigned_pointers_in_js'): - final_js = building.use_unsigned_pointers_in_js(final_js) - - # pthreads memory growth requires some additional JS fixups. - # note that we must do this after handling of unsigned pointers. unsigning - # adds some >>> 0 things, while growth will replace a HEAP8 with a call to - # a method to get the heap, and that call would not be recognized by the - # unsigning pass - if settings.PTHREADS and settings.ALLOW_MEMORY_GROWTH: - with ToolchainProfiler.profile_block('apply_wasm_memory_growth'): - final_js = building.apply_wasm_memory_growth(final_js) - - if settings.USE_ASAN: - final_js = building.instrument_js_for_asan(final_js) - - if settings.SAFE_HEAP: - final_js = building.instrument_js_for_safe_heap(final_js) - - if settings.OPT_LEVEL >= 2 and settings.DEBUG_LEVEL <= 2: - # minify the JS. Do not minify whitespace if Closure is used, so that - # Closure can print out readable error messages (Closure will then - # minify whitespace afterwards) - with ToolchainProfiler.profile_block('minify_wasm'): - save_intermediate_with_wasm('preclean', wasm_target) - final_js = building.minify_wasm_js(js_file=final_js, - wasm_file=wasm_target, - expensive_optimizations=will_metadce(), - minify_whitespace=minify_whitespace() and not options.use_closure_compiler, - debug_info=intermediate_debug_info) - save_intermediate_with_wasm('postclean', wasm_target) - - if settings.ASYNCIFY_LAZY_LOAD_CODE: - with ToolchainProfiler.profile_block('asyncify_lazy_load_code'): - building.asyncify_lazy_load_code(wasm_target, debug=intermediate_debug_info) - - def preprocess_wasm2js_script(): - return read_and_preprocess(utils.path_from_root('src/wasm2js.js'), expand_macros=True) - - if final_js and (options.use_closure_compiler or settings.TRANSPILE_TO_ES5): - if options.use_closure_compiler: - with ToolchainProfiler.profile_block('closure_compile'): - final_js = building.closure_compiler(final_js, pretty=not minify_whitespace(), - extra_closure_args=options.closure_args) - else: - with ToolchainProfiler.profile_block('closure_transpile'): - final_js = building.closure_transpile(final_js, pretty=not minify_whitespace()) - save_intermediate_with_wasm('closure', wasm_target) - - symbols_file = None - if options.emit_symbol_map: - symbols_file = shared.replace_or_append_suffix(target, '.symbols') - - if settings.WASM2JS: - symbols_file_js = None - if settings.WASM == 2: - wasm2js_template = wasm_target + '.js' - write_file(wasm2js_template, preprocess_wasm2js_script()) - # generate secondary file for JS symbols - if options.emit_symbol_map: - symbols_file_js = shared.replace_or_append_suffix(wasm2js_template, '.symbols') - else: - wasm2js_template = final_js - if options.emit_symbol_map: - symbols_file_js = shared.replace_or_append_suffix(target, '.symbols') - - wasm2js = building.wasm2js(wasm2js_template, - wasm_target, - opt_level=settings.OPT_LEVEL, - minify_whitespace=minify_whitespace(), - use_closure_compiler=options.use_closure_compiler, - debug_info=debug_info, - symbols_file=symbols_file, - symbols_file_js=symbols_file_js) - - shared.get_temp_files().note(wasm2js) - - if settings.WASM == 2: - safe_copy(wasm2js, wasm2js_template) - - if settings.WASM != 2: - final_js = wasm2js - # if we only target JS, we don't need the wasm any more - delete_file(wasm_target) - - save_intermediate('wasm2js') - - # emit the final symbols, either in the binary or in a symbol map. - # this will also remove debug info if we only kept it around in the intermediate invocations. - # note that if we aren't emitting a binary (like in wasm2js) then we don't - # have anything to do here. - if options.emit_symbol_map: - intermediate_debug_info -= 1 - if os.path.exists(wasm_target): - with ToolchainProfiler.profile_block('handle_final_symbols'): - building.handle_final_wasm_symbols(wasm_file=wasm_target, symbols_file=symbols_file, debug_info=intermediate_debug_info) - save_intermediate_with_wasm('symbolmap', wasm_target) - - if settings.DEBUG_LEVEL >= 3 and settings.SEPARATE_DWARF and os.path.exists(wasm_target): - building.emit_debug_on_side(wasm_target) - - if settings.WASM2C: - wasm2c.do_wasm2c(wasm_target) - - # we have finished emitting the wasm, and so intermediate debug info will - # definitely no longer be used tracking it. - if debug_info: - intermediate_debug_info -= 1 - assert intermediate_debug_info == 0 - # strip debug info if it was not already stripped by the last command - if not debug_info and building.binaryen_kept_debug_info and \ - building.os.path.exists(wasm_target): - with ToolchainProfiler.profile_block('strip_with_wasm_opt'): - building.run_wasm_opt(wasm_target, wasm_target) - - # replace placeholder strings with correct subresource locations - if final_js and settings.SINGLE_FILE and not settings.WASM2JS: - js = read_file(final_js) - - if settings.MINIMAL_RUNTIME: - js = do_replace(js, '<<< WASM_BINARY_DATA >>>', base64_encode(read_binary(wasm_target))) - else: - js = do_replace(js, '<<< WASM_BINARY_FILE >>>', get_subresource_location(wasm_target)) - delete_file(wasm_target) - write_file(final_js, js) - - -def node_es6_imports(): - if not settings.EXPORT_ES6 or not shared.target_environment_may_be('node'): - return '' - - # Multi-environment builds uses `await import` in `shell.js` - if shared.target_environment_may_be('web'): - return '' - - # Use static import declaration if we only target Node.js - return ''' -import { createRequire } from 'module'; -const require = createRequire(import.meta.url); -''' - - -def modularize(): - global final_js - logger.debug(f'Modularizing, assigning to var {settings.EXPORT_NAME}') - src = read_file(final_js) - - # Multi-environment ES6 builds require an async function - async_emit = '' - if settings.EXPORT_ES6 and \ - shared.target_environment_may_be('node') and \ - shared.target_environment_may_be('web'): - async_emit = 'async ' - - return_value = settings.EXPORT_NAME - if settings.WASM_ASYNC_COMPILATION: - return_value += '.ready' - if not settings.EXPORT_READY_PROMISE: - return_value = '{}' - - # TODO: Remove when https://bugs.webkit.org/show_bug.cgi?id=223533 is resolved. - if async_emit != '' and settings.EXPORT_NAME == 'config': - diagnostics.warning('emcc', 'EXPORT_NAME should not be named "config" when targeting Safari') - - src = ''' -%(maybe_async)sfunction(%(EXPORT_NAME)s = {}) { - -%(src)s - - return %(return_value)s -} -%(capture_module_function_for_audio_worklet)s -''' % { - 'maybe_async': async_emit, - 'EXPORT_NAME': settings.EXPORT_NAME, - 'src': src, - 'return_value': return_value, - # Given the async nature of how the Module function and Module object come into existence in AudioWorkletGlobalScope, - # store the Module function under a different variable name so that AudioWorkletGlobalScope will be able to reference - # it without aliasing/conflicting with the Module variable name. - 'capture_module_function_for_audio_worklet': 'globalThis.AudioWorkletModule = Module;' if settings.AUDIO_WORKLET and settings.MODULARIZE else '' - } - - if settings.MINIMAL_RUNTIME and not settings.PTHREADS: - # Single threaded MINIMAL_RUNTIME programs do not need access to - # document.currentScript, so a simple export declaration is enough. - src = 'var %s=%s' % (settings.EXPORT_NAME, src) - else: - script_url_node = '' - # When MODULARIZE this JS may be executed later, - # after document.currentScript is gone, so we save it. - # In EXPORT_ES6 + PTHREADS the 'thread' is actually an ES6 module webworker running in strict mode, - # so doesn't have access to 'document'. In this case use 'import.meta' instead. - if settings.EXPORT_ES6 and settings.USE_ES6_IMPORT_META: - script_url = 'import.meta.url' - else: - script_url = "typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined" - if shared.target_environment_may_be('node'): - script_url_node = "if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;" - src = '''%(node_imports)s -var %(EXPORT_NAME)s = (() => { - var _scriptDir = %(script_url)s; - %(script_url_node)s - return (%(src)s); -})(); -''' % { - 'node_imports': node_es6_imports(), - 'EXPORT_NAME': settings.EXPORT_NAME, - 'script_url': script_url, - 'script_url_node': script_url_node, - 'src': src - } - - final_js += '.modular.js' - with open(final_js, 'w', encoding='utf-8') as f: - f.write(src) - - # Export using a UMD style export, or ES6 exports if selected - - if settings.EXPORT_ES6: - f.write('export default %s;' % settings.EXPORT_NAME) - elif not settings.MINIMAL_RUNTIME: - f.write('''\ -if (typeof exports === 'object' && typeof module === 'object') - module.exports = %(EXPORT_NAME)s; -else if (typeof define === 'function' && define['amd']) - define([], function() { return %(EXPORT_NAME)s; }); -else if (typeof exports === 'object') - exports["%(EXPORT_NAME)s"] = %(EXPORT_NAME)s; -''' % {'EXPORT_NAME': settings.EXPORT_NAME}) - - shared.get_temp_files().note(final_js) - save_intermediate('modularized') - - -def module_export_name_substitution(): - global final_js - logger.debug(f'Private module export name substitution with {settings.EXPORT_NAME}') - src = read_file(final_js) - final_js += '.module_export_name_substitution.js' - if settings.MINIMAL_RUNTIME and not settings.ENVIRONMENT_MAY_BE_NODE and not settings.ENVIRONMENT_MAY_BE_SHELL and not settings.AUDIO_WORKLET: - # On the web, with MINIMAL_RUNTIME, the Module object is always provided - # via the shell html in order to provide the .asm.js/.wasm content. - replacement = settings.EXPORT_NAME - else: - replacement = "typeof %(EXPORT_NAME)s !== 'undefined' ? %(EXPORT_NAME)s : {}" % {"EXPORT_NAME": settings.EXPORT_NAME} - new_src = re.sub(r'{\s*[\'"]?__EMSCRIPTEN_PRIVATE_MODULE_EXPORT_NAME_SUBSTITUTION__[\'"]?:\s*1\s*}', replacement, src) - assert new_src != src, 'Unable to find Closure syntax __EMSCRIPTEN_PRIVATE_MODULE_EXPORT_NAME_SUBSTITUTION__ in source!' - write_file(final_js, new_src) - shared.get_temp_files().note(final_js) - save_intermediate('module_export_name_substitution') - - -def generate_traditional_runtime_html(target, options, js_target, target_basename, - wasm_target, memfile): - script = ScriptSource() - - shell = read_and_preprocess(options.shell_path) - assert '{{{ SCRIPT }}}' in shell, 'HTML shell must contain {{{ SCRIPT }}} , see src/shell.html for an example' - base_js_target = os.path.basename(js_target) - - if settings.PROXY_TO_WORKER: - proxy_worker_filename = (settings.PROXY_TO_WORKER_FILENAME or target_basename) + '.js' - worker_js = worker_js_script(proxy_worker_filename) - script.inline = (''' - var filename = '%s'; - if ((',' + window.location.search.substr(1) + ',').indexOf(',noProxy,') < 0) { - console.log('running code in a web worker'); -''' % get_subresource_location(proxy_worker_filename)) + worker_js + ''' - } else { - console.log('running code on the main thread'); - var fileBytes = tryParseAsDataURI(filename); - var script = document.createElement('script'); - if (fileBytes) { - script.innerHTML = intArrayToString(fileBytes); - } else { - script.src = filename; - } - document.body.appendChild(script); - } -''' - else: - # Normal code generation path - script.src = base_js_target - - if not settings.SINGLE_FILE: - if memfile and not settings.MINIMAL_RUNTIME: - # start to load the memory init file in the HTML, in parallel with the JS - script.un_src() - script.inline = (''' - var memoryInitializer = '%s'; - memoryInitializer = Module['locateFile'] ? Module['locateFile'](memoryInitializer, '') : memoryInitializer; - Module['memoryInitializerRequestURL'] = memoryInitializer; - var meminitXHR = Module['memoryInitializerRequest'] = new XMLHttpRequest(); - meminitXHR.open('GET', memoryInitializer, true); - meminitXHR.responseType = 'arraybuffer'; - meminitXHR.send(null); -''' % get_subresource_location(memfile)) + script.inline - - if not settings.WASM_ASYNC_COMPILATION: - # We need to load the wasm file before anything else, it has to be synchronously ready TODO: optimize - script.un_src() - script.inline = ''' - var wasmURL = '%s'; - var wasmXHR = new XMLHttpRequest(); - wasmXHR.open('GET', wasmURL, true); - wasmXHR.responseType = 'arraybuffer'; - wasmXHR.onload = function() { - if (wasmXHR.status === 200 || wasmXHR.status === 0) { - Module.wasmBinary = wasmXHR.response; - } else { - var wasmURLBytes = tryParseAsDataURI(wasmURL); - if (wasmURLBytes) { - Module.wasmBinary = wasmURLBytes.buffer; - } - } -%s - }; - wasmXHR.send(null); -''' % (get_subresource_location(wasm_target), script.inline) - - if settings.WASM == 2: - # If target browser does not support WebAssembly, we need to load the .wasm.js file before the main .js file. - script.un_src() - script.inline = ''' - function loadMainJs() { -%s - } - if (!window.WebAssembly || location.search.indexOf('_rwasm=0') > 0) { - // Current browser does not support WebAssembly, load the .wasm.js JavaScript fallback - // before the main JS runtime. - var wasm2js = document.createElement('script'); - wasm2js.src = '%s'; - wasm2js.onload = loadMainJs; - document.body.appendChild(wasm2js); - } else { - // Current browser supports Wasm, proceed with loading the main JS runtime. - loadMainJs(); - } -''' % (script.inline, get_subresource_location(wasm_target) + '.js') - - # when script.inline isn't empty, add required helper functions such as tryParseAsDataURI - if script.inline: - for filename in ('arrayUtils.js', 'base64Utils.js', 'URIUtils.js'): - content = read_and_preprocess(utils.path_from_root('src', filename)) - script.inline = content + script.inline - - script.inline = 'var ASSERTIONS = %s;\n%s' % (settings.ASSERTIONS, script.inline) - - # inline script for SINGLE_FILE output - if settings.SINGLE_FILE: - js_contents = script.inline or '' - if script.src: - js_contents += read_file(js_target) - delete_file(js_target) - script.src = None - script.inline = js_contents - - html_contents = do_replace(shell, '{{{ SCRIPT }}}', script.replacement()) - html_contents = tools.line_endings.convert_line_endings(html_contents, '\n', options.output_eol) - - try: - # Force UTF-8 output for consistency across platforms and with the web. - utils.write_binary(target, html_contents.encode('utf-8')) - except OSError as e: - exit_with_error(f'cannot write output file: {e}') - - -def minify_html(filename): - if settings.DEBUG_LEVEL >= 2: - return - - opts = [] - # -g1 and greater retain whitespace and comments in source - if settings.DEBUG_LEVEL == 0: - opts += ['--collapse-whitespace', - '--collapse-inline-tag-whitespace', - '--remove-comments', - '--remove-tag-whitespace', - '--sort-attributes', - '--sort-class-name'] - # -g2 and greater do not minify HTML at all - if settings.DEBUG_LEVEL <= 1: - opts += ['--decode-entities', - '--collapse-boolean-attributes', - '--remove-attribute-quotes', - '--remove-redundant-attributes', - '--remove-script-type-attributes', - '--remove-style-link-type-attributes', - '--use-short-doctype', - '--minify-css', 'true', - '--minify-js', 'true'] - - # html-minifier also has the following options, but they look unsafe for use: - # '--remove-optional-tags': removes e.g. and tags from the page. - # (Breaks at least browser.test_sdl2glshader) - # '--remove-empty-attributes': removes all attributes with whitespace-only values. - # (Breaks at least browser.test_asmfs_hello_file) - # '--remove-empty-elements': removes all elements with empty contents. - # (Breaks at least browser.test_asm_swapping) - - logger.debug(f'minifying HTML file {filename}') - size_before = os.path.getsize(filename) - start_time = time.time() - shared.check_call(shared.get_npm_cmd('html-minifier-terser') + [filename, '-o', filename] + opts, env=shared.env_with_node_in_path()) - - elapsed_time = time.time() - start_time - size_after = os.path.getsize(filename) - delta = size_after - size_before - logger.debug(f'HTML minification took {elapsed_time:.2f} seconds, and shrunk size of {filename} from {size_before} to {size_after} bytes, delta={delta} ({delta * 100.0 / size_before:+.2f}%)') - - -def generate_html(target, options, js_target, target_basename, - wasm_target, memfile): - logger.debug('generating HTML') - - if settings.EXPORT_NAME != 'Module' and \ - not settings.MINIMAL_RUNTIME and \ - options.shell_path == utils.path_from_root('src/shell.html'): - # the minimal runtime shell HTML is designed to support changing the export - # name, but the normal one does not support that currently - exit_with_error('Customizing EXPORT_NAME requires that the HTML be customized to use that name (see https://github.com/emscripten-core/emscripten/issues/10086)') - - if settings.MINIMAL_RUNTIME: - generate_minimal_runtime_html(target, options, js_target, target_basename) - else: - generate_traditional_runtime_html(target, options, js_target, target_basename, - wasm_target, memfile) - - if settings.MINIFY_HTML and (settings.OPT_LEVEL >= 1 or settings.SHRINK_LEVEL >= 1): - minify_html(target) - - -def generate_worker_js(target, js_target, target_basename): - # compiler output is embedded as base64 - if settings.SINGLE_FILE: - proxy_worker_filename = get_subresource_location(js_target) - - # compiler output goes in .worker.js file - else: - move_file(js_target, shared.replace_suffix(js_target, '.worker.js')) - worker_target_basename = target_basename + '.worker' - proxy_worker_filename = (settings.PROXY_TO_WORKER_FILENAME or worker_target_basename) + '.js' - - target_contents = worker_js_script(proxy_worker_filename) - write_file(target, target_contents) - - -def worker_js_script(proxy_worker_filename): - web_gl_client_src = read_file(utils.path_from_root('src/webGLClient.js')) - idb_store_src = read_file(utils.path_from_root('src/IDBStore.js')) - proxy_client_src = read_file(utils.path_from_root('src/proxyClient.js')) - proxy_client_src = do_replace(proxy_client_src, '{{{ filename }}}', proxy_worker_filename) - proxy_client_src = do_replace(proxy_client_src, '{{{ IDBStore.js }}}', idb_store_src) - return web_gl_client_src + '\n' + proxy_client_src - - -def find_library(lib, lib_dirs): - for lib_dir in lib_dirs: - path = os.path.join(lib_dir, lib) - if os.path.isfile(path): - logger.debug('found library "%s" at %s', lib, path) - return path - return None - - -def process_libraries(state, linker_inputs): - new_flags = [] - libraries = [] - suffixes = STATICLIB_ENDINGS + DYNAMICLIB_ENDINGS - system_libs_map = system_libs.Library.get_usable_variations() - - # Find library files - for i, flag in state.link_flags: - if not flag.startswith('-l'): - new_flags.append((i, flag)) - continue - lib = strip_prefix(flag, '-l') - - logger.debug('looking for library "%s"', lib) - js_libs, native_lib = building.map_to_js_libs(lib) - if js_libs is not None: - libraries += [(i, js_lib) for js_lib in js_libs] - # If native_lib is returned then include it in the link - # via forced_stdlibs. - if native_lib: - state.forced_stdlibs.append(native_lib) - continue - - # We don't need to resolve system libraries to absolute paths here, we can just - # let wasm-ld handle that. However, we do want to map to the correct variant. - # For example we map `-lc` to `-lc-mt` if we are building with threading support. - if 'lib' + lib in system_libs_map: - lib = system_libs_map['lib' + lib] - new_flags.append((i, '-l' + strip_prefix(lib.get_base_name(), 'lib'))) - continue - - if building.map_and_apply_to_settings(lib): - continue - - path = None - for suff in suffixes: - name = 'lib' + lib + suff - path = find_library(name, state.lib_dirs) - if path: - break - - if path: - linker_inputs.append((i, path)) - continue - - new_flags.append((i, flag)) - - settings.JS_LIBRARIES += libraries - - # At this point processing JS_LIBRARIES is finished, no more items will be added to it. - # Sort the input list from (order, lib_name) pairs to a flat array in the right order. - settings.JS_LIBRARIES.sort(key=lambda lib: lib[0]) - settings.JS_LIBRARIES = [lib[1] for lib in settings.JS_LIBRARIES] - state.link_flags = new_flags - - for _, f in linker_inputs: - if building.is_ar(f): - ensure_archive_index(f) - - -class ScriptSource: - def __init__(self): - self.src = None # if set, we have a script to load with a src attribute - self.inline = None # if set, we have the contents of a script to write inline in a script - - def un_src(self): - """Use this if you want to modify the script and need it to be inline.""" - if self.src is None: - return - quoted_src = quote(self.src) - if settings.EXPORT_ES6: - self.inline = f''' - import("./{quoted_src}").then(exports => exports.default(Module)) - ''' - else: - self.inline = f''' - var script = document.createElement('script'); - script.src = "{quoted_src}"; - document.body.appendChild(script); - ''' - self.src = None - - def replacement(self): - """Returns the script tag to replace the {{{ SCRIPT }}} tag in the target""" - assert (self.src or self.inline) and not (self.src and self.inline) - if self.src: - quoted_src = quote(self.src) - if settings.EXPORT_ES6: - return f''' - - ''' - else: - return f'' - else: - return '' % self.inline - - def is_valid_abspath(options, path_name): # Any path that is underneath the emscripten repository root must be ok. - if utils.path_from_root().replace('\\', '/') in path_name.replace('\\', '/'): + if utils.normalize_path(path_name).startswith(utils.normalize_path(utils.path_from_root())): return True def in_directory(root, child): @@ -4303,7 +1454,7 @@ def parse_symbol_list_file(contents): kind of quoting or escaping. """ values = contents.splitlines() - return [v.strip() for v in values] + return [v.strip() for v in values if not v.startswith('#')] def parse_value(text, expected_type): @@ -4314,7 +1465,8 @@ def parse_string_value(text): first = text[0] if first == "'" or first == '"': text = text.rstrip() - assert text[-1] == text[0] and len(text) > 1, 'unclosed opened quoted string. expected final character to be "%s" and length to be greater than 1 in "%s"' % (text[0], text) + if text[-1] != text[0] or len(text) < 2: + raise ValueError(f'unclosed quoted string. expected final character to be "{text[0]}" and length to be greater than 1 in "{text[0]}"') return text[1:-1] return text @@ -4326,7 +1478,7 @@ def parse_string_list_members(text): while True: current = values[index].lstrip() # Cannot safely rstrip for cases like: "HERE-> ," if not len(current): - exit_with_error('string array should not contain an empty value') + raise ValueError('empty value in string list') first = current[0] if not (first == "'" or first == '"'): result.append(current.rstrip()) @@ -4334,7 +1486,7 @@ def parse_string_list_members(text): start = index while True: # Continue until closing quote found if index >= len(values): - exit_with_error("unclosed quoted string. expected final character to be '%s' in '%s'" % (first, values[start])) + raise ValueError(f"unclosed quoted string. expected final character to be '{first}' in '{values[start]}'") new = values[index].rstrip() if new and new[-1] == first: if start == index: @@ -4355,7 +1507,7 @@ def parse_string_list(text): text = text.rstrip() if text and text[0] == '[': if text[-1] != ']': - exit_with_error('unclosed opened string list. expected final character to be "]" in "%s"' % (text)) + raise ValueError('unterminated string list. expected final character to be "]"') text = text[1:-1] if text.strip() == "": return [] @@ -4365,10 +1517,20 @@ def parse_string_list(text): # if json parsing fails, we fall back to our own parser, which can handle a few # simpler syntaxes try: - return json.loads(text) + parsed = json.loads(text) except ValueError: return parse_string_list(text) + # if we succeeded in parsing as json, check some properties of it before returning + if type(parsed) not in (str, list): + raise ValueError(f'settings must be strings or lists (not ${type(parsed)})') + if type(parsed) is list: + for elem in parsed: + if type(elem) is not str: + raise ValueError(f'list members in settings must be strings (not ${type(elem)})') + + return parsed + if expected_type == float: try: return float(text) diff --git a/emcmake b/emcmake index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emcmake +++ b/emcmake @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emcmake.bat b/emcmake.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emcmake.bat +++ b/emcmake.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emcmake.py b/emcmake.py index 42cfbf14bc859..a9dc2294b91c2 100755 --- a/emcmake.py +++ b/emcmake.py @@ -5,6 +5,7 @@ # found in the LICENSE file. import os +import shutil import sys from tools import shared from tools import config @@ -38,7 +39,7 @@ def has_substr(args, substr): node_js = [config.NODE_JS[0]] # In order to allow cmake to run code built with pthreads we need to pass # some extra flags to node. - node_js += shared.node_pthread_flags() + node_js += shared.node_pthread_flags(config.NODE_JS) node_js = ';'.join(node_js) # See https://github.com/emscripten-core/emscripten/issues/15522 args.append(f'-DCMAKE_CROSSCOMPILING_EMULATOR={node_js}') @@ -47,9 +48,9 @@ def has_substr(args, substr): # toolchain was specified, to keep CMake from pulling in a native Visual # Studio, or Unix Makefiles. if utils.WINDOWS and not any(arg.startswith('-G') for arg in args): - if utils.which('mingw32-make'): + if shutil.which('mingw32-make'): args += ['-G', 'MinGW Makefiles'] - elif utils.which('ninja'): + elif shutil.which('ninja'): args += ['-G', 'Ninja'] else: print('emcmake: no compatible cmake generator found; Please install ninja or mingw32-make, or specify a generator explicitly using -G', file=sys.stderr) diff --git a/emconfigure b/emconfigure index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emconfigure +++ b/emconfigure @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emconfigure.bat b/emconfigure.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emconfigure.bat +++ b/emconfigure.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emdump b/emdump index b60c6e0083469..82f0e77a5c669 100755 --- a/emdump +++ b/emdump @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emdump.bat b/emdump.bat index 3b921317678c3..0f19bc7842dc2 100644 --- a/emdump.bat +++ b/emdump.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (tools\emdump.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to tools\emdump.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\tools\emdump.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emdump.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\tools\emdump.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emdump.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\tools\emdump.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emdump.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\tools\emdump.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emdump.py" %* diff --git a/emdwp b/emdwp index f39d54e64288c..2f93cfaded2e4 100755 --- a/emdwp +++ b/emdwp @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emdwp.bat b/emdwp.bat index cfae2d0a47f25..5e4d8658ab9ae 100644 --- a/emdwp.bat +++ b/emdwp.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (tools\emdwp.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to tools\emdwp.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\tools\emdwp.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emdwp.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\tools\emdwp.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emdwp.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\tools\emdwp.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emdwp.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\tools\emdwp.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emdwp.py" %* diff --git a/emmake b/emmake index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emmake +++ b/emmake @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emmake.bat b/emmake.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emmake.bat +++ b/emmake.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emmake.py b/emmake.py index ffe218b5baf61..426e5cc4cd63e 100755 --- a/emmake.py +++ b/emmake.py @@ -21,6 +21,7 @@ generate JavaScript. """ +import shutil import sys from tools import building from tools import shared @@ -48,7 +49,7 @@ def run(): # On Windows prefer building with mingw32-make instead of make, if it exists. if utils.WINDOWS: if args[0] == 'make': - mingw32_make = utils.which('mingw32-make') + mingw32_make = shutil.which('mingw32-make') if mingw32_make: args[0] = mingw32_make diff --git a/emnm b/emnm index 4920cf7017247..19fba1368d2b4 100755 --- a/emnm +++ b/emnm @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emnm.bat b/emnm.bat index d22226e2fb38b..80c49452b38f9 100644 --- a/emnm.bat +++ b/emnm.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (tools\emnm.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to tools\emnm.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\tools\emnm.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emnm.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\tools\emnm.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emnm.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\tools\emnm.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emnm.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\tools\emnm.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emnm.py" %* diff --git a/emprofile b/emprofile index 998a39e28d0cf..7a35f7a83c39d 100755 --- a/emprofile +++ b/emprofile @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emprofile.bat b/emprofile.bat index 78aeb4ed8b065..5f5be5c32710c 100644 --- a/emprofile.bat +++ b/emprofile.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (tools\emprofile.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to tools\emprofile.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\tools\emprofile.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emprofile.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\tools\emprofile.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emprofile.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\tools\emprofile.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%tools\emprofile.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\tools\emprofile.py" %* +@"%EM_PY%" -E "%MYDIR%tools\emprofile.py" %* diff --git a/emranlib b/emranlib index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emranlib +++ b/emranlib @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emranlib.bat b/emranlib.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emranlib.bat +++ b/emranlib.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emranlib.py b/emranlib.py index 813ca45ffc742..811ef061cb6dc 100755 --- a/emranlib.py +++ b/emranlib.py @@ -13,11 +13,4 @@ import sys from tools import shared - -def run(): - newargs = [shared.LLVM_RANLIB] + sys.argv[1:] - return shared.run_process(newargs, stdin=sys.stdin, check=False).returncode - - -if __name__ == '__main__': - sys.exit(run()) +shared.exec_process([shared.LLVM_RANLIB] + sys.argv[1:]) diff --git a/emrun b/emrun index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emrun +++ b/emrun @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emrun.bat b/emrun.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emrun.bat +++ b/emrun.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emrun.py b/emrun.py index 5a936ea041cf0..8d318c2d473db 100644 --- a/emrun.py +++ b/emrun.py @@ -16,7 +16,6 @@ # standalone outside Emscripten directory tree. import argparse import atexit -import cgi import json import os import platform @@ -39,17 +38,11 @@ from SimpleHTTPServer import SimpleHTTPRequestHandler from urllib import unquote from urlparse import urlsplit - - def print_to_handle(handle, line): - print >> handle, line # noqa: F633 else: import socketserver from http.server import HTTPServer, SimpleHTTPRequestHandler from urllib.parse import unquote, urlsplit - def print_to_handle(handle, line): - handle.write(line + '\n') - # Populated from cmdline params emrun_options = None @@ -65,8 +58,8 @@ def print_to_handle(handle, line): # Stores the browser executable that was run with --browser= parameter. browser_exe = None -# If we have routed browser output to file with --log_stdout and/or -# --log_stderr, these track the handles. +# If we have routed browser output to file with --log-stdout and/or +# --log-stderr, these track the handles. browser_stdout_handle = sys.stdout browser_stderr_handle = sys.stderr @@ -138,15 +131,6 @@ def tick(): page_last_served_time = None -def format_html(msg): - """Returns given log message formatted to be outputted on a HTML page.""" - if not msg.endswith('\n'): - msg += '\n' - msg = cgi.escape(msg) - msg = msg.replace('\r\n', '
').replace('\n', '
') - return msg - - # HTTP requests are handled from separate threads - synchronize them to avoid race conditions http_mutex = threading.RLock() @@ -156,10 +140,7 @@ def logi(msg): """ global last_message_time with http_mutex: - if emrun_options.log_html: - sys.stdout.write(format_html(msg)) - else: - print_to_handle(sys.stdout, msg) + sys.stdout.write(msg + '\n') sys.stdout.flush() last_message_time = tick() @@ -171,10 +152,7 @@ def logv(msg): global last_message_time if emrun_options.verbose: with http_mutex: - if emrun_options.log_html: - sys.stdout.write(format_html(msg)) - else: - print_to_handle(sys.stdout, msg) + sys.stdout.write(msg + '\n') sys.stdout.flush() last_message_time = tick() @@ -184,10 +162,7 @@ def loge(msg): """ global last_message_time with http_mutex: - if emrun_options.log_html: - sys.stderr.write(format_html(msg)) - else: - print_to_handle(sys.stderr, msg) + sys.stderr.write(msg + '\n') sys.stderr.flush() last_message_time = tick() @@ -203,7 +178,7 @@ def browser_logi(msg): """ global last_message_time msg = format_eol(msg) - print_to_handle(browser_stdout_handle, msg) + browser_stdout_handle.write(msg + '\n') browser_stdout_handle.flush() last_message_time = tick() @@ -213,7 +188,7 @@ def browser_loge(msg): """ global last_message_time msg = format_eol(msg) - print_to_handle(browser_stderr_handle, msg) + browser_stderr_handle.write(msg + '\n') browser_stderr_handle.flush() last_message_time = tick() @@ -433,7 +408,7 @@ def kill_browser_process(): # process that immediately exits. def detect_browser_processes(): if not browser_exe: - return # Running with --no_browser, we are not binding to a spawned browser. + return # Running with --no-browser, we are not binding to a spawned browser. global current_browser_processes logv('First navigation occurred. Identifying currently running browser processes') @@ -527,7 +502,7 @@ def print_messages_due(self): return def serve_forever(self, timeout=0.5): - global last_message_time, page_exit_code, emrun_not_enabled_nag_printed + global page_exit_code, emrun_not_enabled_nag_printed self.is_running = True self.timeout = timeout logi('Now listening at http://%s/' % ':'.join(map(str, self.socket.getsockname()))) @@ -551,7 +526,7 @@ def serve_forever(self, timeout=0.5): time_since_message = now - last_message_time if emrun_options.silence_timeout != 0 and time_since_message > emrun_options.silence_timeout: self.shutdown() - logi('No activity in ' + str(emrun_options.silence_timeout) + ' seconds. Quitting web server with return code ' + str(emrun_options.timeout_returncode) + '. (--silence_timeout option)') + logi('No activity in ' + str(emrun_options.silence_timeout) + ' seconds. Quitting web server with return code ' + str(emrun_options.timeout_returncode) + '. (--silence-timeout option)') page_exit_code = emrun_options.timeout_returncode emrun_options.kill_exit = True @@ -567,7 +542,7 @@ def serve_forever(self, timeout=0.5): if not emrun_not_enabled_nag_printed and page_last_served_time is not None: time_since_page_serve = now - page_last_served_time if not have_received_messages and time_since_page_serve > 10: - logv('The html page you are running is not emrun-capable. Stdout, stderr and exit(returncode) capture will not work. Recompile the application with the --emrun linker flag to enable this, or pass --no_emrun_detect to emrun to hide this check.') + logv('The html page you are running is not emrun-capable. Stdout, stderr and exit(returncode) capture will not work. Recompile the application with the --emrun linker flag to enable this, or pass --no-emrun-detect to emrun to hide this check.') emrun_not_enabled_nag_printed = True # Clean up at quit, print any leftover messages in queue. @@ -637,12 +612,18 @@ def send_head(self): # gzipped file, instead of having the browser decompress it immediately, # then it can't use the suffix .gz when using emrun. # To work around, one can use the suffix .gzip instead. - if 'Accept-Encoding' in self.headers and 'gzip' in self.headers['Accept-Encoding'] and path.lower().endswith('gz'): + if path.lower().endswith('gz'): self.send_header('Content-Encoding', 'gzip') logv('Serving ' + path + ' as gzip-compressed.') guess_file_type = guess_file_type[:-2] if guess_file_type.endswith('.'): guess_file_type = guess_file_type[:-1] + elif path.lower().endswith('br'): + self.send_header('Content-Encoding', 'br') + logv('Serving ' + path + ' as brotli-compressed.') + guess_file_type = guess_file_type[:-2] + if guess_file_type.endswith('.'): + guess_file_type = guess_file_type[:-1] ctype = self.guess_type(guess_file_type) if guess_file_type.lower().endswith('.wasm'): @@ -722,7 +703,7 @@ def do_POST(self): elif data.startswith('^exit^'): if not emrun_options.serve_after_exit: page_exit_code = int(data[6:]) - logv('Web page has quit with a call to exit() with return code ' + str(page_exit_code) + '. Shutting down web server. Pass --serve_after_exit to keep serving even after the page terminates with exit().') + logv('Web page has quit with a call to exit() with return code ' + str(page_exit_code) + '. Shutting down web server. Pass --serve-after-exit to keep serving even after the page terminates with exit().') self.server.shutdown() return else: @@ -789,7 +770,7 @@ def get_cpu_info(): all_info = check_output(['cat', '/proc/cpuinfo']).strip() for line in all_info.split("\n"): if 'model name' in line: - cpu_name = re.sub('.*model name.*:', '', line, 1).strip() + cpu_name = re.sub('.*model name.*:', '', line, count=1).strip() lscpu = check_output(['lscpu']) frequency = int(float(re.search('CPU MHz: (.*)', lscpu).group(1).strip()) + 0.5) sockets = int(re.search(r'Socket\(s\): (.*)', lscpu).group(1).strip()) @@ -1015,7 +996,7 @@ def win_get_file_properties(fname): props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} import win32api - # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc + # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struct fixedInfo = win32api.GetFileVersionInfo(fname, '\\') props['FixedFileInfo'] = fixedInfo props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536, @@ -1024,7 +1005,7 @@ def win_get_file_properties(fname): fixedInfo['FileVersionLS'] % 65536) # \VarFileInfo\Translation returns list of available (language, codepage) - # pairs that can be used to retreive string info. We are using only the first pair. + # pairs that can be used to retrieve string info. We are using only the first pair. lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] # any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle @@ -1174,7 +1155,7 @@ def win_get_default_browser(): except WindowsError: logv("Unable to find default browser key in Windows registry. Trying fallback.") - # Fall back to 'start "" %1', which we have to treat as if user passed --serve_forever, since + # Fall back to 'start "" %1', which we have to treat as if user passed --serve-forever, since # for some reason, we are not able to detect when the browser closes when this is passed. # # If the first argument to 'start' is quoted, then 'start' will create a new cmd.exe window with @@ -1218,7 +1199,7 @@ def find_browser(name): ('chrome', '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'), ('chrome_canary', '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary')] elif WINDOWS: - pf_locations = ['ProgramFiles(x86)', 'ProgramFiles', 'ProgramW6432'] + pf_locations = ['ProgramFiles(x86)', 'ProgramFiles', 'ProgramW6432', 'LOCALAPPDATA'] for pf_env in pf_locations: if pf_env not in os.environ: @@ -1317,7 +1298,7 @@ def list_pc_browsers(): logi('') for browser in browsers: browser_exe = find_browser(browser) - if type(browser_exe) == list: + if type(browser_exe) is list: browser_exe = browser_exe[0] if browser_exe: logi(' - ' + browser + ': ' + browser_display_name(browser_exe) + ' ' + get_executable_version(browser_exe)) @@ -1463,44 +1444,44 @@ def list_processes_by_name(exe_full_path): """ -def parse_args(): +def parse_args(args): parser = argparse.ArgumentParser(usage=usage_str) - parser.add_argument('--kill_start', action='store_true', + parser.add_argument('--kill-start', action='store_true', help='If true, any previously running instances of ' 'the target browser are killed before starting.') - parser.add_argument('--kill_exit', action='store_true', + parser.add_argument('--kill-exit', action='store_true', help='If true, the spawned browser process is forcibly ' 'killed when it calls exit(). Note: Using this ' 'option may require explicitly passing the option ' '--browser=/path/to/browser, to avoid emrun being ' 'detached from the browser process it spawns.') - parser.add_argument('--no_server', dest='run_server', action='store_false', + parser.add_argument('--no-server', dest='run_server', action='store_false', default=True, help='If specified, a HTTP web server is not launched ' 'to host the page to run.') - parser.add_argument('--no_browser', dest='run_browser', action='store_false', + parser.add_argument('--no-browser', dest='run_browser', action='store_false', default=True, help='If specified, emrun will not launch a web browser ' 'to run the page.') - parser.add_argument('--no_emrun_detect', action='store_true', + parser.add_argument('--no-emrun-detect', action='store_true', help='If specified, skips printing the warning message ' 'if html page is detected to not have been built ' 'with --emrun linker flag.') - parser.add_argument('--serve_after_close', action='store_true', + parser.add_argument('--serve-after-close', action='store_true', help='If true, serves the web page even after the ' 'application quits by user closing the web page.') - parser.add_argument('--serve_after_exit', action='store_true', + parser.add_argument('--serve-after-exit', action='store_true', help='If true, serves the web page even after the ' 'application quits by a call to exit().') - parser.add_argument('--serve_root', + parser.add_argument('--serve-root', help='If set, specifies the root path that the emrun ' 'web server serves. If not specified, the directory ' 'where the target .html page lives in is served.') @@ -1514,14 +1495,14 @@ def parse_args(): parser.add_argument('--port', default=default_webserver_port, type=int, help='Specifies the port the server runs in.') - parser.add_argument('--log_stdout', + parser.add_argument('--log-stdout', help='Specifies a log filename where the browser process ' 'stdout data will be appended to.') - parser.add_argument('--log_stderr', + parser.add_argument('--log-stderr', help='Specifies a log filename where the browser process stderr data will be appended to.') - parser.add_argument('--silence_timeout', type=int, default=0, + parser.add_argument('--silence-timeout', type=int, default=0, help='If no activity is received in this many seconds, ' 'the browser process is assumed to be hung, and the web ' 'server is shut down and the target browser killed. ' @@ -1533,61 +1514,78 @@ def parse_args(): 'to be hung, and the web server is shut down and the ' 'target browser killed. Disabled by default.') - parser.add_argument('--timeout_returncode', type=int, default=99999, + parser.add_argument('--timeout-returncode', type=int, default=99999, help='Sets the exit code that emrun reports back to ' 'caller in the case that a page timeout occurs. ' 'Default: 99999.') - parser.add_argument('--list_browsers', action='store_true', + parser.add_argument('--list-browsers', action='store_true', help='Prints out all detected browser that emrun is able ' 'to use with the --browser command and exits.') parser.add_argument('--browser', help='Specifies the browser executable to run the web page in.') - parser.add_argument('--browser_args', default='', + parser.add_argument('--browser-args', default='', help='Specifies the arguments to the browser executable.') parser.add_argument('--android', action='store_true', help='Launches the page in a browser of an Android ' 'device connected to an USB on the local system. (via adb)') - parser.add_argument('--system_info', action='store_true', + parser.add_argument('--android-tunnel', action='store_true', + help='Expose the port directly to the Android device ' + 'and connect to it as localhost, establishing ' + 'cross origin isolation. Implies --android. A ' + 'reverse socket connection is created by adb ' + 'reverse, and remains after emrun terminates (it ' + 'can be removed by adb reverse --remove).') + + parser.add_argument('--system-info', action='store_true', help='Prints information about the current system at startup.') - parser.add_argument('--browser_info', action='store_true', + parser.add_argument('--browser-info', action='store_true', help='Prints information about the target browser to launch at startup.') parser.add_argument('--json', action='store_true', - help='If specified, --system_info and --browser_info are ' + help='If specified, --system-info and --browser-info are ' 'outputted in JSON format.') - parser.add_argument('--safe_firefox_profile', action='store_true', + parser.add_argument('--safe-firefox-profile', action='store_true', help='If true, the browser is launched into a new clean ' 'Firefox profile that is suitable for unattended ' 'automated runs. (If target browser != Firefox, ' 'this parameter is ignored)') - parser.add_argument('--log_html', action='store_true', - help='If set, information lines are printed out an HTML-friendly format.') - - parser.add_argument('--private_browsing', action='store_true', + parser.add_argument('--private-browsing', action='store_true', help='If specified, opens browser in private/incognito mode.') - parser.add_argument('--dump_out_directory', default='dump_out', type=str, + parser.add_argument('--dump-out-directory', default='dump_out', type=str, help='If specified, overrides the directory for dump files using emrun_file_dump method.') parser.add_argument('serve', nargs='?', default='') parser.add_argument('cmdlineparams', nargs='*') - return parser.parse_args() + # Support legacy argument names with `_` in them (but don't + # advertize these in the --help message. + newargs = [] + for a in args: + if a.startswith('--') and '_' in a: + newargs.append(a.replace('_', '-')) + else: + newargs.append(a) + return parser.parse_args(newargs) -def run(): + +def run(args): global browser_process, browser_exe, processname_killed_atexit, emrun_options, emrun_not_enabled_nag_printed - options = emrun_options = parse_args() + options = emrun_options = parse_args(args) + + if options.android_tunnel: + options.android = True if options.android: global ADB @@ -1614,7 +1612,7 @@ def run(): return if not options.serve and (options.system_info or options.browser_info): - # Don't run if only --system_info or --browser_info was passed. + # Don't run if only --system-info or --browser-info was passed. options.run_server = options.run_browser = False if not options.serve and (options.run_server or options.run_browser): @@ -1643,10 +1641,6 @@ def run(): url = file_to_serve else: url = os.path.relpath(os.path.abspath(file_to_serve), serve_dir) - if len(options.cmdlineparams): - url += '?' + '&'.join(options.cmdlineparams) - hostname = socket.gethostbyname(socket.gethostname()) if options.android else options.hostname - url = 'http://' + hostname + ':' + str(options.port) + '/' + url os.chdir(serve_dir) if options.run_server: @@ -1659,19 +1653,27 @@ def run(): # to support binding to port zero we must allow the server to open to socket then retrieve the final port number options.port = httpd.socket.getsockname()[1] + if not file_to_serve_is_url: + if len(options.cmdlineparams): + url += '?' + '&'.join(options.cmdlineparams) + if options.android_tunnel: + hostname = 'localhost' + elif options.android: + hostname = socket.gethostbyname(socket.gethostname()) + else: + hostname = options.hostname + # create url for browser after opening the server so we have the final port number in case we are binding to port 0 + url = 'http://' + hostname + ':' + str(options.port) + '/' + url + if options.android: if options.run_browser or options.browser_info: if not options.browser: - loge("Running on Android requires that you explicitly specify the browser to run with --browser . Run emrun --android --list_browsers to obtain a list of installed browsers you can use.") + loge("Running on Android requires that you explicitly specify the browser to run with --browser . Run emrun --android --list-browsers to obtain a list of installed browsers you can use.") return 1 elif options.browser == 'firefox': - browser_app = 'org.mozilla.firefox/.App' - elif options.browser == 'firefox_beta': - browser_app = 'org.mozilla.firefox_beta/.App' - elif options.browser == 'firefox_aurora' or options.browser == 'fennec_aurora': - browser_app = 'org.mozilla.fennec_aurora/.App' - elif options.browser == 'firefox_nightly' or options.browser == 'fennec': - browser_app = 'org.mozilla.fennec/.App' + browser_app = 'org.mozilla.firefox/org.mozilla.gecko.BrowserApp' + elif options.browser == 'firefox_nightly' or options.browser == 'fenix': + browser_app = 'org.mozilla.fenix/org.mozilla.gecko.BrowserApp' elif options.browser == 'chrome': browser_app = 'com.android.chrome/com.google.android.apps.chrome.Main' elif options.browser == 'chrome_beta': @@ -1680,14 +1682,10 @@ def run(): browser_app = 'com.chrome.dev/com.google.android.apps.chrome.Main' elif options.browser == 'chrome_canary': browser_app = 'com.chrome.canary/com.google.android.apps.chrome.Main' - elif options.browser == 'opera': - browser_app = 'com.opera.browser/com.opera.Opera' - elif options.browser == 'opera_mini': - # Launching the URL works, but page seems to never load (Fails with 'Network problem' even when other browsers work) - browser_app = 'com.opera.mini.android/.Browser' - elif options.browser == 'dolphin': - # Current stable Dolphin as of 12/2013 does not have WebGL support. - browser_app = 'mobi.mgeek.TunnyBrowser/.BrowserActivity' + elif '.' in options.browser and '/' in options.browser: + # Browser command line contains both '.' and '/', so it looks like a string of form 'package/activity', use that + # as the browser. + browser_app = options.browser else: loge("Don't know how to launch browser " + options.browser + ' on Android!') return 1 @@ -1698,6 +1696,9 @@ def run(): # 4. Type 'aapt d xmltree .apk AndroidManifest.xml > manifest.txt' to extract the manifest from the package. # 5. Locate the name of the main activity for the browser in manifest.txt and add an entry to above list in form 'appname/mainactivityname' + if options.android_tunnel: + subprocess.check_call([ADB, 'reverse', 'tcp:' + str(options.port), 'tcp:' + str(options.port)]) + url = url.replace('&', '\\&') browser = [ADB, 'shell', 'am', 'start', '-a', 'android.intent.action.VIEW', '-n', browser_app, '-d', url] processname_killed_atexit = browser_app[:browser_app.find('/')] @@ -1724,7 +1725,8 @@ def run(): processname_killed_atexit = 'Safari' elif 'chrome' in browser_exe.lower(): processname_killed_atexit = 'chrome' - browser_args += ['--enable-nacl', '--enable-pnacl', '--disable-restore-session-state', '--enable-webgl', '--no-default-browser-check', '--no-first-run', '--allow-file-access-from-files'] + browser_args += ['--enable-nacl', '--enable-pnacl', '--disable-restore-session-state', '--enable-webgl', + '--no-default-browser-check', '--no-first-run', '--allow-file-access-from-files', '--password-store=basic'] if options.private_browsing: browser_args += ['--incognito'] # if not options.run_server: @@ -1738,7 +1740,7 @@ def run(): elif 'opera' in browser_exe.lower(): processname_killed_atexit = 'opera' - # In Windows cmdline, & character delimits multiple commmands, so must + # In Windows cmdline, & character delimits multiple commands, so must # use ^ to escape them. if browser_exe == 'cmd': url = url.replace('&', '^&') @@ -1756,11 +1758,16 @@ def run(): def run(cmd): logi(str(cmd)) - subprocess.call(cmd) + subprocess.check_call(cmd) - run(['adb', 'shell', 'rm', '-rf', '/mnt/sdcard/safe_firefox_profile']) - run(['adb', 'shell', 'mkdir', '/mnt/sdcard/safe_firefox_profile']) - run(['adb', 'push', os.path.join(profile_dir, 'prefs.js'), '/mnt/sdcard/safe_firefox_profile/prefs.js']) + try: + run(['adb', 'shell', 'rm', '-rf', '/mnt/sdcard/safe_firefox_profile']) + run(['adb', 'shell', 'mkdir', '/mnt/sdcard/safe_firefox_profile']) + run(['adb', 'push', os.path.join(profile_dir, 'prefs.js'), '/mnt/sdcard/safe_firefox_profile/prefs.js']) + except Exception as e: + loge('Creating Firefox profile prefs.js file to internal storage in /mnt/sdcard failed with error ' + str(e) + '!') + loge('Try running without --safe-firefox-profile flag if unattended execution mode is not important, or') + loge('enable rooted debugging on the Android device to allow adb to write files to /mnt/sdcard.') browser += ['--es', 'args', '"--profile /mnt/sdcard/safe_firefox_profile"'] # Create temporary Firefox profile to run the page with. This is important to @@ -1822,7 +1829,7 @@ def run(cmd): premature_quit_code = browser_process.poll() if premature_quit_code is not None: options.serve_after_close = True - logv('Warning: emrun got immediately detached from the target browser process (the process quit with exit code ' + str(premature_quit_code) + '). Cannot detect when user closes the browser. Behaving as if --serve_after_close was passed in.') + logv('Warning: emrun got immediately detached from the target browser process (the process quit with exit code ' + str(premature_quit_code) + '). Cannot detect when user closes the browser. Behaving as if --serve-after-close was passed in.') if not options.browser: logv('Try passing the --browser=/path/to/browser option to avoid this from occurring. See https://github.com/emscripten-core/emscripten/issues/3234 for more discussion.') @@ -1840,7 +1847,7 @@ def run(cmd): kill_browser_process() else: if is_browser_process_alive(): - logv('Not terminating browser process, pass --kill_exit to terminate the browser when it calls exit().') + logv('Not terminating browser process, pass --kill-exit to terminate the browser when it calls exit().') # If we have created a temporary Firefox profile, we would really really # like to wait until the browser closes, or otherwise we'll just have to # litter temp files and keep the temporary profile alive. It is possible @@ -1857,13 +1864,13 @@ def run(cmd): return page_exit_code -def main(): - returncode = run() +def main(args): + returncode = run(args) logv('emrun quitting with process exit code ' + str(returncode)) if temp_firefox_profile_dir is not None: - logi('Warning: Had to leave behind a temporary Firefox profile directory ' + temp_firefox_profile_dir + ' because --safe_firefox_profile was set and the browser did not quit before emrun did.') + logi('Warning: Had to leave behind a temporary Firefox profile directory ' + temp_firefox_profile_dir + ' because --safe-firefox-profile was set and the browser did not quit before emrun did.') return returncode if __name__ == '__main__': - sys.exit(main()) + sys.exit(main(sys.argv[1:])) diff --git a/emscons b/emscons index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emscons +++ b/emscons @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emscons.bat b/emscons.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emscons.bat +++ b/emscons.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emscripten-version.txt b/emscripten-version.txt index e5813add0fefe..b9148f640cff4 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1 +1 @@ -3.1.34-git +3.1.56-git diff --git a/emsize b/emsize index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emsize +++ b/emsize @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emsize.bat b/emsize.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emsize.bat +++ b/emsize.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emstrip b/emstrip index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emstrip +++ b/emstrip @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emstrip.bat b/emstrip.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emstrip.bat +++ b/emstrip.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emstrip.py b/emstrip.py index 01c1d1b00b439..f054fe7e9f1df 100755 --- a/emstrip.py +++ b/emstrip.py @@ -10,5 +10,4 @@ import sys from tools import shared -cmd = [shared.LLVM_STRIP] + sys.argv[1:] -sys.exit(shared.run_process(cmd, stdin=sys.stdin, check=False).returncode) +shared.exec_process([shared.LLVM_STRIP] + sys.argv[1:]) diff --git a/emsymbolizer b/emsymbolizer index 1a3a1c9691685..eef0f00c6730f 100755 --- a/emsymbolizer +++ b/emsymbolizer @@ -9,7 +9,7 @@ # Automatically generated by `create_entry_points.py`; DO NOT EDIT. # # To make modifications to this file, edit `tools/run_python.sh` and then run -# `tools/create_entry_points.py` +# `tools/maint/create_entry_points.py` # $PYTHON -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal # of cpython used in cross compilation via setup.py. diff --git a/emsymbolizer.bat b/emsymbolizer.bat index 84872e7a0b933..83edd646f7918 100644 --- a/emsymbolizer.bat +++ b/emsymbolizer.bat @@ -3,7 +3,10 @@ :: Automatically generated by `create_entry_points.py`; DO NOT EDIT. :: :: To make modifications to this file, edit `tools/run_python.bat` and then run -:: `tools/create_entry_points.py` +:: `tools/maint/create_entry_points.py` + +:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks, +:: or there will be a parsing error. :: All env. vars specified in this file are to be local only to this script. @setlocal @@ -15,6 +18,27 @@ set EM_PY=python ) +:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this +:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and +:: %~dp0 expansions will not work. +:: So first try if %~dp0 might work, and if not, manually look up this script from PATH. +@if exist "%~f0" ( + set MYDIR=%~dp0 + goto FOUND_MYDIR +) +@for %%I in (%~n0.bat) do ( + @if exist %%~$PATH:I ( + set MYDIR=%%~dp$PATH:I + ) else ( + echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat. + echo To help this issue, try removing unnecessary quotes in the invocation of emcc, + echo or add Emscripten directory to PATH. + echo See github.com/microsoft/terminal/issues/15212 and + echo github.com/emscripten-core/emscripten/issues/19207 for more details. + ) +) +:FOUND_MYDIR + :: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a :: shared stdin handle from the parent process, and that parent process stdin handle is in :: a certain state, running python.exe might hang here. To work around this, if @@ -47,16 +71,16 @@ ) :NORMAL_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* @exit %ERRORLEVEL% :MUTE_STDIN -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit /b %ERRORLEVEL% :MUTE_STDIN_EXIT -@"%EM_PY%" -E "%~dp0\%~n0.py" %* < NUL +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* < NUL @exit %ERRORLEVEL% :NORMAL -@"%EM_PY%" -E "%~dp0\%~n0.py" %* +@"%EM_PY%" -E "%MYDIR%%~n0.py" %* diff --git a/emsymbolizer.py b/emsymbolizer.py index 1d4be4e1e3974..1a9cf27f25d56 100755 --- a/emsymbolizer.py +++ b/emsymbolizer.py @@ -8,11 +8,12 @@ # line/column number, potentially including inlining. # If the wasm has separate DWARF info, do the above with the side file # If there is a source map, we can parse it to get file and line number. -# If there is an emscripten symbol map, we can parse that to get the symbol name -# If there is a name section or symbol table, llvm-nm can show the symbol name. +# If there is an emscripten symbol map, we can use that to get the symbol name +# If there is a name section or symbol table, llvm-symbolizer can show the +# symbol name. +# Separate DWARF and emscripten symbol maps are not supported yet. import argparse -from collections import namedtuple import json import os import re @@ -51,21 +52,30 @@ def get_codesec_offset(module): def has_debug_line_section(module): - for sec in module.sections(): - if sec.name == ".debug_line": - return True - return False + return module.get_custom_section('.debug_line') is not None + + +def has_name_section(module): + return module.get_custom_section('name') is not None + +def has_linking_section(module): + return module.get_custom_section('linking') is not None -def symbolize_address_dwarf(module, address): - vma_adjust = get_codesec_offset(module) + +def symbolize_address_symbolizer(module, address, is_dwarf): + if is_dwarf: + vma_adjust = get_codesec_offset(module) + else: + vma_adjust = 0 cmd = [LLVM_SYMBOLIZER, '-e', module.filename, f'--adjust-vma={vma_adjust}', str(address)] out = shared.run_process(cmd, stdout=subprocess.PIPE).stdout.strip() out_lines = out.splitlines() + # Source location regex, e.g., /abc/def.c:3:5 SOURCE_LOC_RE = re.compile(r'(.+):(\d+):(\d+)$') - # llvm-dwarfdump prints two lines per location. The first line contains a + # llvm-symbolizer prints two lines per location. The first line contains a # function name, and the second contains a source location like # '/abc/def.c:3:5'. If the function or source info is not available, it will # be printed as '??', in which case we store None. If the line and column info @@ -89,8 +99,12 @@ def get_sourceMappingURL_section(module): class WasmSourceMap(object): - # This implementation is derived from emscripten's sourcemap-support.js - Location = namedtuple('Location', ['source', 'line', 'column']) + class Location(object): + def __init__(self, source=None, line=0, column=0, func=None): + self.source = source + self.line = line + self.column = column + self.func = func def __init__(self): self.version = None @@ -207,22 +221,23 @@ def main(args): with webassembly.Module(args.wasm_file) as module: base = 16 if args.address.lower().startswith('0x') else 10 address = int(args.address, base) - symbolized = 0 if args.addrtype == 'code': address += get_codesec_offset(module) if ((has_debug_line_section(module) and not args.source) or 'dwarf' in args.source): - symbolize_address_dwarf(module, address) - symbolized += 1 - - if ((get_sourceMappingURL_section(module) and not args.source) or - 'sourcemap' in args.source): + symbolize_address_symbolizer(module, address, is_dwarf=True) + elif ((get_sourceMappingURL_section(module) and not args.source) or + 'sourcemap' in args.source): symbolize_address_sourcemap(module, address, args.file) - symbolized += 1 - - if not symbolized: + elif ((has_name_section(module) and not args.source) or + 'names' in args.source): + symbolize_address_symbolizer(module, address, is_dwarf=False) + elif ((has_linking_section(module) and not args.source) or + 'symtab' in args.source): + symbolize_address_symbolizer(module, address, is_dwarf=False) + else: raise Error('No .debug_line or sourceMappingURL section found in ' f'{module.filename}.' " I don't know how to symbolize this file yet") @@ -230,7 +245,8 @@ def main(args): def get_args(): parser = argparse.ArgumentParser() - parser.add_argument('-s', '--source', choices=['dwarf', 'sourcemap'], + parser.add_argument('-s', '--source', choices=['dwarf', 'sourcemap', + 'names', 'symtab'], help='Force debug info source type', default=()) parser.add_argument('-f', '--file', action='store', help='Force debug info source file') @@ -243,7 +259,7 @@ def get_args(): parser.add_argument('address', help='Address to lookup') args = parser.parse_args() if args.verbose: - shared.PRINT_STAGES = 1 + shared.PRINT_SUBPROCS = 1 shared.DEBUG = True return args diff --git a/media/powered_by_logo_mini.svg b/media/powered_by_logo_mini.svg new file mode 100644 index 0000000000000..b09940d19b803 --- /dev/null +++ b/media/powered_by_logo_mini.svg @@ -0,0 +1,1099 @@ + image/svg+xml diff --git a/media/powered_by_logo_shell.png b/media/powered_by_logo_shell.png new file mode 100644 index 0000000000000..b95fa282eb10b Binary files /dev/null and b/media/powered_by_logo_shell.png differ diff --git a/package-lock.json b/package-lock.json index 90bd69a5cd69f..48df579e1a935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,125 +1,6466 @@ { + "name": "emscripten", + "lockfileVersion": 2, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@caporal/core": { + "packages": { + "": { + "dependencies": { + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.7", + "@babel/preset-env": "^7.23.8", + "acorn": "^8.11.3", + "google-closure-compiler": "20230802.0.0", + "html-minifier-terser": "7.2.0" + }, + "devDependencies": { + "es-check": "^7.1.1", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "prettier": "^3.1.1", + "source-map": "0.7.4", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "ws": "^8.16.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz", + "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "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.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "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==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dev": true, + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "optional": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@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==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "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" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "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" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dev": true, + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "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==" + }, + "node_modules/core-js-compat": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/deep-is": { + "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==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.608", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.608.tgz", + "integrity": "sha512-J2f/3iIIm3Mo0npneITZ2UPe4B1bg8fTNrFjD8715F/k1BvbviRuqYGkET1PgprrczXYTHFvotbBOmUp6KE0uA==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-check": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/es-check/-/es-check-7.1.1.tgz", + "integrity": "sha512-rgwR2wdJp437Exq28Emwc4x5+Qn6ORDliN9daWo0wTCg5jOQxJsIZieqxVi4AfDEIN4OwMwYhld9b13mnRocUQ==", + "dev": true, + "dependencies": { + "acorn": "8.8.2", + "commander": "10.0.0", + "fast-glob": "^3.2.12", + "supports-color": "^8.1.1", + "winston": "^3.8.2" + }, + "bin": { + "es-check": "index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/es-check/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/es-check/node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/es-check/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/es-check/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "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==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/google-closure-compiler": { + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20230802.0.0.tgz", + "integrity": "sha512-o2fYoc8lqOBdhm95Ick0vWrtwH2Icd5yLZhbTcQ0T7NfGiBepYvx1BB63hR8ebgzEZemz9Fh+O6Kg/3Mjm28ww==", + "dependencies": { + "chalk": "4.x", + "google-closure-compiler-java": "^20230802.0.0", + "minimist": "1.x", + "vinyl": "2.x", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "bin": { + "google-closure-compiler": "cli.js" + }, + "engines": { + "node": ">=10" + }, + "optionalDependencies": { + "google-closure-compiler-linux": "^20230802.0.0", + "google-closure-compiler-osx": "^20230802.0.0", + "google-closure-compiler-windows": "^20230802.0.0" + } + }, + "node_modules/google-closure-compiler-java": { + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20230802.0.0.tgz", + "integrity": "sha512-PWKLMLwj7pR/U0yYbiy649LLqAscu+F1gyY4Y/jK6CmSLb8cIJbL8BTJd00828TzTNfWnYwxbkcQw0y9C2YsGw==" + }, + "node_modules/google-closure-compiler-linux": { + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20230802.0.0.tgz", + "integrity": "sha512-F13U4iSXiWeGtHOFS25LVem1s6zI+pJvXVPVR7zSib5ppoUJ0JXnABJQezUR3FnpxmnkALG4oIGW0syH9zPLZA==", + "cpu": [ + "x32", + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/google-closure-compiler-osx": { + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20230802.0.0.tgz", + "integrity": "sha512-ANAi/ux92Tt+Na7vFDLeK2hRzotjC5j+nxoPtE0OcuNcbjji5dREKoJxkq7r0YwRTCzAFZszK5ip/NPdTOdCEg==", + "cpu": [ + "x32", + "x64", + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/google-closure-compiler-windows": { + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20230802.0.0.tgz", + "integrity": "sha512-ZQPujoNiiUyTGl8zEGR/0yAygWnbMtX/NQ/S/EHVgq5nmYkvDEVuiVbgpPAmO9lzBTq0hvUTRRATZbTU2ISxgA==", + "cpu": [ + "x32", + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/google-closure-compiler/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/google-closure-compiler/node_modules/chalk": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/google-closure-compiler/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/google-closure-compiler/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/google-closure-compiler/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/google-closure-compiler/node_modules/supports-color": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "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==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "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" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "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==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "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==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "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==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "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==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "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" + } + }, + "node_modules/make-dir": { + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "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" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "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==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "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==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "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" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "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" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "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==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-swizzle": { + "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==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "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" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "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==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "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" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "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==" + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "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==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/triple-beam": { + "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==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@caporal/core/-/core-2.0.2.tgz", - "integrity": "sha512-o3J5aZINFWkkL+sL0DUs1dPHJjaetAAdwMRLbJ4U8aJW3K81E323IFMkFNYcOwTiPVhNzllC3USxZbU6xWFjFg==", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/winston": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "dev": true, + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.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.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "dev": true, + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/cli": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + } + }, + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" + }, + "@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz", + "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "requires": { + "@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": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + } + }, + "@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "requires": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "requires": { - "@types/glob": "^7.1.1", - "@types/lodash": "4.14.149", - "@types/node": "13.9.3", - "@types/table": "5.0.0", - "@types/tabtab": "^3.0.1", - "@types/wrap-ansi": "^3.0.0", - "chalk": "3.0.0", - "glob": "^7.1.6", - "lodash": "4.17.15", - "table": "5.4.6", - "tabtab": "^3.0.2", - "winston": "3.2.1", - "wrap-ansi": "^6.2.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { + "js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + } + } + }, + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "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.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "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==", + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "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==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "requires": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "requires": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "requires": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, + "@babel/preset-modules": { + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "@babel/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dev": true, + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true }, "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", + "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" + }, + "dependencies": { + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + } } }, + "@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "optional": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -146,65 +6487,256 @@ "fastq": "^1.6.0" } }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "requires": { - "@types/minimatch": "*", - "@types/node": "*" + "@types/eslint": "*", + "@types/estree": "*" } }, - "@types/lodash": { - "version": "4.14.149", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", - "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", + "@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==", "dev": true }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/node": { - "version": "13.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.3.tgz", - "integrity": "sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "dev": true }, - "@types/table": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/table/-/table-5.0.0.tgz", - "integrity": "sha512-fQLtGLZXor264zUPWI95WNDsZ3QV43/c0lJpR/h1hhLJumXRmHNsrvBfEzW2YMhb0EWCsn4U6h82IgwsajAuTA==", + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "@types/tabtab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-d8aOSJPS3SEGZevyr7vbAVUNPWGFmdFlk13vbPPK87vz+gYGM57L8T11k4wK2mOgQYZjEVYQEqmCTvupPoQBWw==", + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@types/node": "*" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -218,16 +6750,17 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} }, "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -238,38 +6771,77 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "requires": { - "lodash": "^4.17.14" + "@babel/helper-define-polyfill-provider": "^0.4.4" } }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -279,11 +6851,22 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "devOptional": true, "requires": { "fill-range": "^7.0.1" } }, + "browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "requires": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -304,6 +6887,11 @@ "tslib": "^2.0.3" } }, + "caniuse-lite": { + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -314,16 +6902,32 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, "clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "requires": { "source-map": "~0.6.0" }, @@ -335,35 +6939,31 @@ } } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, "clone-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" }, "cloneable-readable": { "version": "1.1.3", @@ -396,7 +6996,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "color-string": { "version": "1.9.1", @@ -408,10 +7008,10 @@ "simple-swizzle": "^0.2.2" } }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "colorspace": { @@ -424,11 +7024,28 @@ "text-hex": "1.0.x" } }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "convert-source-map": { + "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==" + }, + "core-js-compat": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "requires": { + "browserslist": "^4.22.2" + } }, "core-util-is": { "version": "1.0.3", @@ -450,9 +7067,15 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "deep-is": { @@ -461,17 +7084,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "dev": true, - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -490,98 +7102,142 @@ "tslib": "^2.0.3" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "electron-to-chromium": { + "version": "1.4.608", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.608.tgz", + "integrity": "sha512-J2f/3iIIm3Mo0npneITZ2UPe4B1bg8fTNrFjD8715F/k1BvbviRuqYGkET1PgprrczXYTHFvotbBOmUp6KE0uA==" }, "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { - "env-variable": "0.0.x" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, - "env-variable": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", - "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true }, "es-check": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/es-check/-/es-check-6.2.1.tgz", - "integrity": "sha512-IPiRXUlwSTd2yMklIf9yEGe6GK5wCS8Sz1aTNHm1QSiYzI4aiq19giYbLi95tb+e0JJVKmcU0iQXQWW60a8V9A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/es-check/-/es-check-7.1.1.tgz", + "integrity": "sha512-rgwR2wdJp437Exq28Emwc4x5+Qn6ORDliN9daWo0wTCg5jOQxJsIZieqxVi4AfDEIN4OwMwYhld9b13mnRocUQ==", "dev": true, "requires": { - "@caporal/core": "^2.0.2", - "acorn": "^8.7.0", - "fast-glob": "^3.2.11" + "acorn": "8.8.2", + "commander": "10.0.0", + "fast-glob": "^3.2.12", + "supports-color": "^8.1.1", + "winston": "^3.8.2" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", + "es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.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", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.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.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -631,21 +7287,21 @@ "is-glob": "^4.0.3" } }, + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -658,59 +7314,43 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { - "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==", + "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==", "dev": true }, "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.7.1", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -734,19 +7374,13 @@ "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", @@ -755,9 +7389,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -776,13 +7410,19 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -794,15 +7434,6 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "dev": true }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -816,44 +7447,80 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "devOptional": true, "requires": { "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "gensync": { + "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==" }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -867,102 +7534,155 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "requires": { "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "google-closure-compiler": { - "version": "20220502.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20220502.0.0.tgz", - "integrity": "sha512-i9Qdve2v3jlerkHzlm00bpYds+kfAlIdeaOQ+acK/pHPHeLjhiXS+EyIpegVnH8+TY3I1QAMZFuVEXkMVJqpBQ==", - "requires": { - "chalk": "2.x", - "google-closure-compiler-java": "^20220502.0.0", - "google-closure-compiler-linux": "^20220502.0.0", - "google-closure-compiler-osx": "^20220502.0.0", - "google-closure-compiler-windows": "^20220502.0.0", + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20230802.0.0.tgz", + "integrity": "sha512-o2fYoc8lqOBdhm95Ick0vWrtwH2Icd5yLZhbTcQ0T7NfGiBepYvx1BB63hR8ebgzEZemz9Fh+O6Kg/3Mjm28ww==", + "requires": { + "chalk": "4.x", + "google-closure-compiler-java": "^20230802.0.0", + "google-closure-compiler-linux": "^20230802.0.0", + "google-closure-compiler-osx": "^20230802.0.0", + "google-closure-compiler-windows": "^20230802.0.0", "minimist": "1.x", "vinyl": "2.x", "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "google-closure-compiler-java": { - "version": "20220502.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20220502.0.0.tgz", - "integrity": "sha512-XDXw1v+1zcNHuEUXQg24eD9MUF2XTHnEDKCwF0P0zQe+8TWQajKvjsekdJnO6JH/Lqcu8XKc7dxO5+SMijr0sw==" + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20230802.0.0.tgz", + "integrity": "sha512-PWKLMLwj7pR/U0yYbiy649LLqAscu+F1gyY4Y/jK6CmSLb8cIJbL8BTJd00828TzTNfWnYwxbkcQw0y9C2YsGw==" }, "google-closure-compiler-linux": { - "version": "20220502.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20220502.0.0.tgz", - "integrity": "sha512-T+2p/Qj02yGZHxymhj1oZsiHudNvI9sQKfCLoIH0wi0ikDiVIOh/dsH+57lsaGDJ+XTP/ur5Ozl8GIOjv1Efrw==", + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20230802.0.0.tgz", + "integrity": "sha512-F13U4iSXiWeGtHOFS25LVem1s6zI+pJvXVPVR7zSib5ppoUJ0JXnABJQezUR3FnpxmnkALG4oIGW0syH9zPLZA==", "optional": true }, "google-closure-compiler-osx": { - "version": "20220502.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20220502.0.0.tgz", - "integrity": "sha512-VwEncD4I1gfkF3zyHlRcUsx2o/poC0qzHjBv+g3Z09wHy9tuqjQ4EP8LmN/GMuV2Hai6gQvkKC0XjYnZTFx2mQ==", + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20230802.0.0.tgz", + "integrity": "sha512-ANAi/ux92Tt+Na7vFDLeK2hRzotjC5j+nxoPtE0OcuNcbjji5dREKoJxkq7r0YwRTCzAFZszK5ip/NPdTOdCEg==", "optional": true }, "google-closure-compiler-windows": { - "version": "20220502.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20220502.0.0.tgz", - "integrity": "sha512-ssdAUS2VZxJAyciVrbhpnYymvm//V4CHyg8aLvMisUfWRDeUSsOCC5mNXy6D8f9i9bYHs3cFV3itIRUfnYCEWg==", + "version": "20230802.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20230802.0.0.tgz", + "integrity": "sha512-ZQPujoNiiUyTGl8zEGR/0yAygWnbMtX/NQ/S/EHVgq5nmYkvDEVuiVbgpPAmO9lzBTq0hvUTRRATZbTU2ISxgA==", "optional": true }, + "graceful-fs": { + "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==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } }, "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "requires": { "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^5.10.0" + "terser": "^5.15.1" }, "dependencies": { "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true }, "import-fresh": { @@ -975,17 +7695,26 @@ "resolve-from": "^4.0.0" } }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -996,55 +7725,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } - } + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true }, "is-arrayish": { "version": "0.3.2", @@ -1052,23 +7737,34 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "requires": { "is-extglob": "^2.1.1" } @@ -1077,25 +7773,74 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true + }, + "is-path-inside": { + "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==", "dev": true }, + "is-plain-object": { + "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==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1105,6 +7850,23 @@ "argparse": "^2.0.1" } }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "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==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1114,18 +7876,35 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "requires": { - "colornames": "^1.1.1" + "json-buffer": "3.0.1" } }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1136,12 +7915,26 @@ "type-check": "~0.4.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1149,12 +7942,13 @@ "dev": true }, "logform": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", - "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", "dev": true, "requires": { - "@colors/colors": "1.5.0", + "@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", @@ -1169,6 +7963,29 @@ "tslib": "^2.0.3" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1185,51 +8002,50 @@ "picomatch": "^2.3.1" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "no-case": { @@ -1241,48 +8057,70 @@ "tslib": "^2.0.3" } }, + "node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "fn.name": "1.x.x" } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@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", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "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==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "param-case": { @@ -1312,11 +8150,16 @@ "tslib": "^2.0.3" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -1324,11 +8167,74 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "devOptional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "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==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } }, "prelude-ls": { "version": "1.2.1", @@ -1337,9 +8243,9 @@ "dev": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true }, "process-nextick-args": { @@ -1348,9 +8254,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "queue-microtask": { @@ -1359,10 +8265,19 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1373,43 +8288,126 @@ "util-deprecate": "~1.0.1" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + } + } }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, "replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "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==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -1425,12 +8423,6 @@ "glob": "^7.1.3" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -1440,39 +8432,50 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-stable-stringify": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", - "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } }, "shebang-command": { "version": "2.0.0", @@ -1489,31 +8492,19 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dev": true, "requires": { "is-arrayish": "^0.3.1" } }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, "source-map": { "version": "0.7.4", @@ -1540,20 +8531,9 @@ "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1563,12 +8543,12 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } }, "strip-json-comments": { @@ -1585,39 +8565,25 @@ "has-flag": "^3.0.0" } }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } + "supports-preserve-symlinks-flag": { + "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==" }, - "tabtab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", - "dev": true, - "requires": { - "debug": "^4.0.1", - "es6-promisify": "^6.0.0", - "inquirer": "^6.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "untildify": "^3.0.3" - } + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -1625,14 +8591,22 @@ "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==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" } } }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -1642,43 +8616,33 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } + "to-fast-properties": { + "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": { "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==", - "dev": true, + "devOptional": true, "requires": { "is-number": "^7.0.0" } }, "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", + "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==", "dev": true }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "type-check": { "version": "0.4.0", @@ -1695,12 +8659,45 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "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==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + }, + "unicode-property-aliases-ecmascript": { + "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==" + }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1713,13 +8710,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "vinyl": { "version": "2.2.1", @@ -1737,7 +8728,7 @@ "vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", "requires": { "source-map": "^0.5.1" }, @@ -1745,14 +8736,115 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" } } }, - "wasm2c": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wasm2c/-/wasm2c-1.0.0.tgz", - "integrity": "sha512-4SIESF2JNxrry6XFa/UQcsQibn+bxPkQ/oqixiXz2o8fsMl8J4vtvhH/evgbi8vZajAlaukuihEcQTWb9tVLUA==" + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true }, "which": { "version": "2.0.2", @@ -1763,27 +8855,35 @@ "isexe": "^2.0.0" } }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "dev": true, "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.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.3.0" + "winston-transport": "^4.5.0" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -1794,9 +8894,9 @@ } }, "winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", "dev": true, "requires": { "logform": "^2.3.2", @@ -1805,9 +8905,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -1817,97 +8917,27 @@ } } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "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==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "requires": {} + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true } } diff --git a/package.json b/package.json index 85671429bbacc..c5ed09c0cd5c5 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,26 @@ { "private": true, "devDependencies": { - "es-check": "^6.2.1", - "eslint": "^8.16.0", - "eslint-config-prettier": "^8.5.0", - "prettier": "^2.7.1", + "es-check": "^7.1.1", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "prettier": "^3.1.1", "source-map": "0.7.4", - "ws": "^8.6.0" + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "ws": "^8.16.0" }, "dependencies": { - "acorn": "^8.7.1", - "google-closure-compiler": "20220502.0.0", - "html-minifier-terser": "6.1.0", - "wasm2c": "1.0.0" + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.7", + "@babel/preset-env": "^7.23.8", + "acorn": "^8.11.3", + "google-closure-compiler": "20230802.0.0", + "html-minifier-terser": "7.2.0" }, "scripts": { "lint": "eslint .", - "fmt": "prettier --write tools/acorn-optimizer.js", - "check": "prettier --check tools/acorn-optimizer.js" + "fmt": "prettier --write src/*.mjs tools/*.mjs", + "check": "prettier --check src/*.mjs tools/*.mjs" } } diff --git a/requirements-dev.txt b/requirements-dev.txt index 0b6b6e6874f4f..d21da9cc6b377 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -12,6 +12,9 @@ mypy==0.971 types-requests==2.27.14 unittest-xml-reporting==3.1.0 +# See https://github.com/emscripten-core/emscripten/issues/19785 +lxml==4.9.2 + # This version is mentioned in `site/source/docs/site/about.rst`. # Please keep them in sync. sphinx==2.4.4 diff --git a/site/make.bat b/site/make.bat index cb8a1c0289463..ca2da8772af15 100644 --- a/site/make.bat +++ b/site/make.bat @@ -55,8 +55,16 @@ if errorlevel 9009 ( echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ + echo.If you don't have Sphinx installed, run + echo. + echo. pip install -U --user sphinx==2.4.4 + echo. pip install -U --user jinja2==3.0.1 + echo. + echo.to install it, or grab it manually from http://sphinx-doc.org/ + echo.N.b. the second command to downgrade jinja2 is needed due to + echo.a Jinja2 bug. See + echo.https://github.com/sphinx-doc/sphinx/issues/10291 + echo.https://github.com/emscripten-core/emscripten/issues/20390 exit /b 1 ) diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/LICENSE b/site/source/_themes/emscripten_sphinx_rtd_theme/LICENSE new file mode 100644 index 0000000000000..921f0738833c4 --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Dave Snider + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html index 746a9ad013a60..e8a0e17931b30 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html @@ -134,7 +134,7 @@ ('docs/index', 'GitHub', '') ] -%} - Fork me on GitHub + Fork me on GitHub